From d3c4d53c056fbe3e0c53b14951e19a154fdd5da0 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Sat, 9 Dec 2017 16:33:20 +0100 Subject: [PATCH] Remove jQuery, switch dependency to Cornerstone 2.0.0, bump to version 2.0.0 --- README.md | 5 - dist/cornerstoneTools.js | 4172 +++++++++-------- dist/cornerstoneTools.js.map | 2 +- dist/cornerstoneTools.min.js | 4 +- dist/cornerstoneTools.min.js.map | 2 +- examples/cornerstone.js | 631 +-- examples/cornerstone.js.map | 2 +- examples/cornerstone.min.js | 4 +- examples/cornerstone.min.js.map | 2 +- examples/crosshairs/index.html | 2 +- examples/exampleImageLoader.js | 9 +- examples/exampleTextImageLoader.js | 9 +- examples/panZoomSynchronizer/index.html | 2 +- examples/petctImageIdLoader.js | 18 +- examples/referenceLineTool/index.html | 2 +- .../stackImageIndexSynchronizer/index.html | 2 +- .../index.html | 2 +- .../stackImagePositionSynchronizer/index.html | 2 +- examples/stackScrollSynchronizer/index.html | 2 +- examples/timeSeries/index.html | 14 +- examples/wwwcSynchronizer/index.html | 2 +- package.json | 15 +- src/enabledElementTools.js | 41 + src/events.js | 49 + src/externalModules.js | 7 - src/imageTools/angleTool.js | 3 +- src/imageTools/arrowAnnotate.js | 101 +- src/imageTools/crosshairs.js | 84 +- src/imageTools/displayTool.js | 19 +- src/imageTools/doubleTapTool.js | 14 +- src/imageTools/doubleTapZoom.js | 7 +- src/imageTools/dragProbe.js | 40 +- src/imageTools/ellipticalRoi.js | 4 +- src/imageTools/freehand.js | 81 +- src/imageTools/highlight.js | 4 +- src/imageTools/imageStats.js | 3 +- src/imageTools/keyboardTool.js | 17 +- src/imageTools/length.js | 4 +- src/imageTools/magnify.js | 81 +- src/imageTools/mouseButtonRectangleTool.js | 177 +- src/imageTools/mouseButtonTool.js | 293 +- src/imageTools/mouseWheelTool.js | 20 +- src/imageTools/multiTouchDragTool.js | 37 +- src/imageTools/orientationMarkers.js | 3 +- src/imageTools/pan.js | 40 +- src/imageTools/panMultiTouch.js | 6 +- src/imageTools/probe.js | 4 +- src/imageTools/rectangleRoi.js | 4 +- src/imageTools/rotate.js | 41 +- src/imageTools/rotateTouch.js | 11 +- src/imageTools/saveAs.js | 18 +- src/imageTools/seedAnnotate.js | 48 +- src/imageTools/simpleAngle.js | 58 +- src/imageTools/simpleMouseButtonTool.js | 32 +- src/imageTools/textMarker.js | 94 +- src/imageTools/touchDragTool.js | 16 +- src/imageTools/touchPinchTool.js | 20 +- src/imageTools/touchTool.js | 140 +- src/imageTools/wwwc.js | 42 +- src/imageTools/wwwcRegion.js | 155 +- src/imageTools/zoom.js | 47 +- src/inputSources/keyboardInput.js | 31 +- src/inputSources/mouseInput.js | 57 +- src/inputSources/mouseWheelInput.js | 34 +- src/inputSources/preventGhostClick.js | 6 +- src/inputSources/touchInput.js | 89 +- src/manipulators/moveAllHandles.js | 29 +- src/manipulators/moveHandle.js | 19 +- src/manipulators/moveNewHandle.js | 61 +- src/manipulators/moveNewHandleTouch.js | 49 +- src/manipulators/touchMoveAllHandles.js | 49 +- src/manipulators/touchMoveHandle.js | 44 +- .../lineSampleMeasurement.js | 7 +- src/measurementManager/measurementManager.js | 7 +- src/paintingTools/adaptiveBrush.js | 20 +- src/paintingTools/brush.js | 20 +- src/paintingTools/brushTool.js | 77 +- src/referenceLines/referenceLinesTool.js | 7 +- src/requestPool/requestPoolManager.js | 12 +- src/stackTools/playClip.js | 3 +- src/stackTools/scrollIndicator.js | 3 +- src/stackTools/stackPrefetch.js | 17 +- src/stackTools/stackScroll.js | 48 +- src/stackTools/stackScrollKeyboard.js | 3 +- src/stateManagement/toolState.js | 5 +- src/synchronization/Synchronizer.js | 23 +- src/timeSeriesTools/probeTool4D.js | 30 +- src/timeSeriesTools/timeSeriesScroll.js | 48 +- src/util/scrollToIndex.js | 10 +- src/util/triggerEvent.js | 16 +- src/version.js | 2 +- 91 files changed, 4251 insertions(+), 3345 deletions(-) create mode 100644 src/enabledElementTools.js create mode 100644 src/events.js diff --git a/README.md b/README.md index f322327c5..4a4ea3488 100755 --- a/README.md +++ b/README.md @@ -194,15 +194,12 @@ See the [live examples](https://rawgithub.com/cornerstonejs/cornerstoneTools/mas ````javascript // Load NPM packages -import $ from 'jquery'; // npm install --save jquery import Hammer from 'hammerjs'; // npm install --save hammerjs import * as cornerstone from 'cornerstone-core'; // npm install --save cornerstone-core import * as cornerstoneTools from 'cornerstone-tools'; // Specify external dependencies -cornerstone.external.$ = $; cornerstoneTools.external.cornerstone = cornerstone; -cornerstoneTools.external.$ = $; cornerstoneTools.external.Hammer = Hammer; ```` @@ -213,14 +210,12 @@ cornerstoneTools.external.Hammer = Hammer; ````javascript // Load Packaged Sources - // Specify external dependencies cornerstoneTools.external.cornerstone = cornerstone; -cornerstoneTools.external.$ = $; cornerstoneTools.external.Hammer = Hammer; ```` diff --git a/dist/cornerstoneTools.js b/dist/cornerstoneTools.js index e51485267..d624d46e7 100644 --- a/dist/cornerstoneTools.js +++ b/dist/cornerstoneTools.js @@ -1,4 +1,4 @@ -/*! cornerstone-tools - 1.1.2 - 2017-12-06 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */ +/*! cornerstone-tools - 2.0.0 - 2017-12-12 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -71,7 +71,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 60); +/******/ return __webpack_require__(__webpack_require__.s = 61); /******/ }) /************************************************************************/ /******/ ([ @@ -86,7 +86,6 @@ Object.defineProperty(exports, "__esModule", { }); var cornerstone = window.cornerstone; var cornerstoneMath = window.cornerstoneMath; -var $ = window.$; var Hammer = window.Hammer; exports.default = { @@ -102,12 +101,6 @@ exports.default = { get cornerstoneMath() { return cornerstoneMath; }, - set $(module) { - $ = module; - }, - get $() { - return $; - }, set Hammer(module) { Hammer = module; }, @@ -123,18 +116,82 @@ exports.default = { "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +var EVENTS = { + // Events from Cornerstone Core + IMAGE_RENDERED: 'cornerstoneimagerendered', + NEW_IMAGE: 'cornerstonenewimage', + IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved', + ELEMENT_DISABLED: 'cornerstoneelementdisabled', + + // Mouse events + MOUSE_DOWN: 'cornerstonetoolsmousedown', + MOUSE_UP: 'cornerstonetoolsmouseup', + MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate', + MOUSE_DRAG: 'cornerstonetoolsmousedrag', + MOUSE_MOVE: 'cornerstonetoolsmousemove', + MOUSE_CLICK: 'cornerstonetoolsmouseclick', + MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick', + MOUSE_WHEEL: 'cornerstonetoolsmousewheel', + + // Touch events + TOUCH_START: 'cornerstonetoolstouchstart', + TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive', + TOUCH_END: 'cornerstonetoolstouchend', + TOUCH_DRAG: 'cornerstonetoolstouchdrag', + TOUCH_DRAG_END: 'cornerstonetoolstouchdragend', + TOUCH_PINCH: 'cornerstonetoolstouchpinch', + TOUCH_ROTATE: 'cornerstonetoolstouchrotate', + TOUCH_PRESS: 'cornerstonetoolstouchpress', + TAP: 'cornerstonetoolstap', + DOUBLE_TAP: 'cornerstonetoolsdoubletap', + MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart', + MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive', + MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag', + + // Keyboard events + KEY_DOWN: 'cornerstonetoolskeydown', + KEY_UP: 'cornerstonetoolskeyup', + KEY_PRESS: 'cornerstonetoolskeypress', + + // Measurement / tool events + MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded', + MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified', + MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved', + TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated', + CLIP_STOPPED: 'cornerstonetoolsclipstopped', + STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed + + LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated' +}; + +exports.default = EVENTS; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); exports.getElementToolStateManager = exports.setElementToolStateManager = exports.clearToolState = exports.removeToolState = exports.getToolState = exports.addToolState = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _imageIdSpecificStateManager = __webpack_require__(16); +var _imageIdSpecificStateManager = __webpack_require__(18); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -159,7 +216,7 @@ function addToolState(element, toolType, measurementData) { toolStateManager.add(element, toolType, measurementData); - var eventType = 'CornerstoneToolsMeasurementAdded'; + var eventType = _events2.default.MEASUREMENT_ADDED; var eventData = { toolType: toolType, element: element, @@ -192,7 +249,7 @@ function removeToolState(element, toolType, data) { if (indexOfData !== -1) { toolData.data.splice(indexOfData, 1); - var eventType = 'CornerstoneToolsMeasurementRemoved'; + var eventType = _events2.default.MEASUREMENT_REMOVED; var eventData = { toolType: toolType, element: element, @@ -228,7 +285,64 @@ exports.setElementToolStateManager = setElementToolStateManager; exports.getElementToolStateManager = getElementToolStateManager; /***/ }), -/* 2 */ +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var elementToolOptions = {}; + +function getToolOptions(toolType, element) { + if (!elementToolOptions[toolType]) { + return {}; + } + + var toolOptions = elementToolOptions[toolType]; + var optionsObject = toolOptions.find(function (toolOptionObject) { + return toolOptionObject.element === element; + }); + + if (!optionsObject) { + return {}; + } + + return optionsObject.options; +} + +function setToolOptions(toolType, element, options) { + if (!elementToolOptions[toolType]) { + elementToolOptions[toolType] = [{ + element: element, + options: options + }]; + + return; + } + + var toolOptions = elementToolOptions[toolType]; + var index = toolOptions.findIndex(function (toolOptionObject) { + return toolOptionObject.element === element; + }); + + if (index === -1) { + elementToolOptions[toolType].push({ + element: element, + options: options + }); + } else { + elementToolOptions[toolType][index].options = options; + } +} + +exports.getToolOptions = getToolOptions; +exports.setToolOptions = setToolOptions; + +/***/ }), +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -245,7 +359,7 @@ exports.default = function (which, mouseButtonMask) { }; /***/ }), -/* 3 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -255,20 +369,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = triggerEvent; - -var _externalModules = __webpack_require__(0); - -var _externalModules2 = _interopRequireDefault(_externalModules); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - /** * Trigger a CustomEvent * * @param {EventTarget} el The element or EventTarget to trigger the event upon * @param {String} type The event type name * @param {Object|null} detail=null The event data to be sent - * @returns {boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. + * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. */ function triggerEvent(el, type) { var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; @@ -277,28 +384,20 @@ function triggerEvent(el, type) { // This check is needed to polyfill CustomEvent on IE11- if (typeof window.CustomEvent === 'function') { - event = new CustomEvent(type.toLocaleLowerCase(), { + event = new CustomEvent(type, { detail: detail, cancelable: true }); } else { event = document.createEvent('CustomEvent'); - event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail); - } - - // TODO: remove jQuery event triggers - var jqEvent = _externalModules2.default.$.Event(type, detail); - - _externalModules2.default.$(el).trigger(jqEvent, detail); - if (jqEvent.isImmediatePropagationStopped()) { - return false; + event.initCustomEvent(type, true, true, detail); } return el.dispatchEvent(event); } /***/ }), -/* 4 */ +/* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -353,45 +452,7 @@ var toolColors = { exports.default = toolColors; /***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var defaultWidth = 1, - activeWidth = 2; - -function setToolWidth(width) { - defaultWidth = width; -} - -function getToolWidth() { - return defaultWidth; -} - -function setActiveWidth(width) { - activeWidth = width; -} - -function getActiveWidth() { - return activeWidth; -} - -var toolStyle = { - setToolWidth: setToolWidth, - getToolWidth: getToolWidth, - setActiveWidth: setActiveWidth, - getActiveWidth: getActiveWidth -}; - -exports.default = toolStyle; - -/***/ }), -/* 6 */ +/* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -480,7 +541,7 @@ var _textStyle2 = _interopRequireDefault(_textStyle); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 7 */ +/* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -489,101 +550,79 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de Object.defineProperty(exports, "__esModule", { value: true }); +var defaultWidth = 1, + activeWidth = 2; -exports.default = function (mouseToolInterface) { - var configuration = {}; +function setToolWidth(width) { + defaultWidth = width; +} - // /////// BEGIN ACTIVE TOOL /////// - function addNewMeasurement(mouseEventData) { - var cornerstone = _externalModules2.default.cornerstone; - var element = mouseEventData.element; +function getToolWidth() { + return defaultWidth; +} - var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); +function setActiveWidth(width) { + activeWidth = width; +} - if (!measurementData) { - return; - } +function getActiveWidth() { + return activeWidth; +} - var eventData = { - mouseButtonMask: mouseEventData.which - }; +var toolStyle = { + setToolWidth: setToolWidth, + getToolWidth: getToolWidth, + setActiveWidth: setActiveWidth, + getActiveWidth: getActiveWidth +}; - // Associate this data with this imageId so we can render it and manipulate it - (0, _toolState.addToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData); +exports.default = toolStyle; - // Since we are dragging to another place to drop the end point, we can just activate - // The end point and let the moveHandle move it for us. - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { - if (mouseToolInterface.mouseDoubleClickCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); - } +"use strict"; - cornerstone.updateImage(element); - var handleMover = void 0; +Object.defineProperty(exports, "__esModule", { + value: true +}); - if (Object.keys(measurementData.handles).length === 1) { - handleMover = _moveHandle2.default; - } else { - handleMover = _moveNewHandle2.default; - } +exports.default = function (mouseToolInterface) { + var configuration = {}; + var toolType = mouseToolInterface.toolType; - var preventHandleOutsideImage = void 0; + function mouseDownActivateCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) { - preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage; - } else { - preventHandleOutsideImage = false; + if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + return; } - handleMover(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () { - measurementData.active = false; - measurementData.invalidated = true; - if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) { - // Delete the measurement - (0, _toolState.removeToolState)(element, mouseToolInterface.toolType, measurementData); - } - - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); - - if (mouseToolInterface.mouseDoubleClickCallback) { - _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); - } - - cornerstone.updateImage(element); - }, preventHandleOutsideImage); - } - - function mouseDownActivateCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - if (mouseToolInterface.addNewMeasurement) { - mouseToolInterface.addNewMeasurement(eventData); - } else { - addNewMeasurement(eventData); - } - - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + if (mouseToolInterface.addNewMeasurement) { + mouseToolInterface.addNewMeasurement(eventData); + } else { + addNewMeasurement(eventData); } + + e.preventDefault(); + e.stopPropagation(); } // /////// END ACTIVE TOOL /////// // /////// BEGIN DEACTIVE TOOL /////// - function mouseMoveCallback(e, eventData) { + function mouseMoveCallback(e) { + var eventData = e.detail; + _toolCoordinates2.default.setCoords(eventData); - // If a mouse button is down, do nothing - if (eventData.which !== 0) { - return; - } // If we have no tool data for this element, do nothing - var toolData = (0, _toolState.getToolState)(eventData.element, mouseToolInterface.toolType); + var toolData = (0, _toolState.getToolState)(eventData.element, toolType); if (!toolData) { return; @@ -615,27 +654,29 @@ exports.default = function (mouseToolInterface) { } } - function mouseDownCallback(e, eventData) { + function mouseDownCallback(e) { + var eventData = e.detail; var data = void 0; var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + return; + } function handleDoneMove() { data.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { // Delete the measurement - (0, _toolState.removeToolState)(element, mouseToolInterface.toolType, data); + (0, _toolState.removeToolState)(element, toolType, data); } _externalModules2.default.cornerstone.updateImage(element); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - } - - if (!(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - return; + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); } var coords = eventData.startPoints.canvas; - var toolData = (0, _toolState.getToolState)(e.currentTarget, mouseToolInterface.toolType); + var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); if (!toolData) { return; @@ -659,12 +700,14 @@ exports.default = function (mouseToolInterface) { var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distance); if (handle) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); data.active = true; - (0, _moveHandle2.default)(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage); + (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage); e.stopImmediatePropagation(); + e.stopPropagation(); + e.preventDefault(); - return false; + return; } } @@ -674,7 +717,7 @@ exports.default = function (mouseToolInterface) { return; } - var options = mouseToolInterface.options || { + var opt = mouseToolInterface.options || { deleteIfHandleOutsideImage: true, preventHandleOutsideImage: false }; @@ -684,72 +727,133 @@ exports.default = function (mouseToolInterface) { data.active = false; if (mouseToolInterface.pointNearTool(element, data, coords)) { data.active = true; - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - (0, _moveAllHandles2.default)(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); + (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove); e.stopImmediatePropagation(); + e.stopPropagation(); + e.preventDefault(); - return false; + return; } } } // /////// END DEACTIVE TOOL /////// + + var mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback; + var mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback; + var mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback; + var mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback; + + // /////// BEGIN ACTIVE TOOL /////// + function addNewMeasurement(mouseEventData) { + var cornerstone = _externalModules2.default.cornerstone; + var element = mouseEventData.element; + + var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); + + if (!measurementData) { + return; + } + + // Associate this data with this imageId so we can render it and manipulate it + (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData); + + // Since we are dragging to another place to drop the end point, we can just activate + // The end point and let the moveHandle move it for us. + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); + + if (mouseDoubleClick) { + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + } + + cornerstone.updateImage(element); + + var handleMover = void 0; + + if (Object.keys(measurementData.handles).length === 1) { + handleMover = _moveHandle2.default; + } else { + handleMover = _moveNewHandle2.default; + } + + var preventHandleOutsideImage = void 0; + + if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) { + preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage; + } else { + preventHandleOutsideImage = false; + } + + handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () { + measurementData.active = false; + measurementData.invalidated = true; + if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) { + // Delete the measurement + (0, _toolState.removeToolState)(element, toolType, measurementData); + } + + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); + + if (mouseDoubleClick) { + element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + } + + cornerstone.updateImage(element); + }, preventHandleOutsideImage); + } + // Not visible, not interactive function disable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - if (mouseToolInterface.mouseDoubleClickCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } _externalModules2.default.cornerstone.updateImage(element); } - // Note: This is to maintain compatibility for developers that have - // Built on top of mouseButtonTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function onImageRendered(e) { - mouseToolInterface.onImageRendered(e, e.detail); - } - // Visible but not interactive function enable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - if (mouseToolInterface.mouseDoubleClickCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - if (mouseToolInterface.mouseDoubleClickCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } _externalModules2.default.cornerstone.updateImage(element); @@ -757,31 +861,29 @@ exports.default = function (mouseToolInterface) { // Visible, interactive function deactivate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - var eventType = 'CornerstoneToolsToolDeactivated'; + var eventType = _events2.default.TOOL_DEACTIVATED; var statusChangeEventData = { mouseButtonMask: mouseButtonMask, - toolType: mouseToolInterface.toolType, + toolType: toolType, type: eventType }; (0, _triggerEvent2.default)(element, eventType, statusChangeEventData); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown); - if (mouseToolInterface.mouseDoubleClickCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } if (mouseToolInterface.deactivate) { @@ -816,8 +918,8 @@ exports.default = function (mouseToolInterface) { toolInterface.pointNearTool = mouseToolInterface.pointNearTool; } - if (mouseToolInterface.mouseDoubleClickCallback) { - toolInterface.mouseDoubleClickCallback = mouseToolInterface.mouseDoubleClickCallback; + if (mouseDoubleClick) { + toolInterface.mouseDoubleClickCallback = mouseDoubleClick; } if (mouseToolInterface.addNewMeasurement) { @@ -827,52 +929,58 @@ exports.default = function (mouseToolInterface) { return toolInterface; }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolCoordinates = __webpack_require__(35); +var _toolCoordinates = __webpack_require__(37); var _toolCoordinates2 = _interopRequireDefault(_toolCoordinates); -var _getHandleNearImagePoint = __webpack_require__(19); +var _getHandleNearImagePoint = __webpack_require__(21); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); -var _handleActivator = __webpack_require__(36); +var _handleActivator = __webpack_require__(38); var _handleActivator2 = _interopRequireDefault(_handleActivator); -var _moveHandle = __webpack_require__(22); +var _moveHandle = __webpack_require__(24); var _moveHandle2 = _interopRequireDefault(_moveHandle); -var _moveNewHandle = __webpack_require__(23); +var _moveNewHandle = __webpack_require__(25); var _moveNewHandle2 = _interopRequireDefault(_moveNewHandle); -var _moveAllHandles = __webpack_require__(37); +var _moveAllHandles = __webpack_require__(39); var _moveAllHandles2 = _interopRequireDefault(_moveAllHandles); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 8 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -921,7 +1029,7 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); @@ -930,7 +1038,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var handleRadius = 6; /***/ }), -/* 9 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -940,33 +1048,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _getHandleNearImagePoint = __webpack_require__(19); +var _getHandleNearImagePoint = __webpack_require__(21); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); -var _touchMoveHandle = __webpack_require__(52); +var _touchMoveHandle = __webpack_require__(53); var _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle); -var _moveNewHandleTouch = __webpack_require__(25); +var _moveNewHandleTouch = __webpack_require__(27); var _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch); -var _touchMoveAllHandles = __webpack_require__(51); +var _touchMoveAllHandles = __webpack_require__(52); var _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -1012,7 +1124,7 @@ function touchTool(touchToolInterface) { (0, _toolState.addToolState)(element, touchToolInterface.toolType, measurementData); - if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === 'CornerstoneToolsTap') { + if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === _events2.default.TAP) { measurementData.active = false; measurementData.handles.end.active = false; measurementData.handles.end.highlight = false; @@ -1027,9 +1139,9 @@ function touchTool(touchToolInterface) { return; } - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); (0, _moveNewHandleTouch2.default)(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () { @@ -1040,14 +1152,16 @@ function touchTool(touchToolInterface) { (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData); } - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); + element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); }); } - function touchDownActivateCallback(e, eventData) { + function touchDownActivateCallback(e) { + var eventData = e.detail; + // Console.log('touchTool touchDownActivateCallback'); if (touchToolInterface.addNewMeasurement) { touchToolInterface.addNewMeasurement(eventData); @@ -1061,7 +1175,9 @@ function touchTool(touchToolInterface) { // /////// END ACTIVE TOOL /////// // /////// BEGIN INACTIVE TOOL /////// - function tapCallback(e, eventData) { + function tapCallback(e) { + var eventData = e.detail; + // Console.log('touchTool tapCallback'); var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; @@ -1082,8 +1198,8 @@ function touchTool(touchToolInterface) { } cornerstone.updateImage(element); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); } // Now check to see if there is a handle we can move @@ -1094,8 +1210,8 @@ function touchTool(touchToolInterface) { var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distanceSq); if (handle) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); data.active = true; handle.active = true; cornerstone.updateImage(element); @@ -1113,8 +1229,8 @@ function touchTool(touchToolInterface) { for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; if (touchToolInterface.pointNearTool(element, data, coords)) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); data.active = true; cornerstone.updateImage(element); (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); @@ -1129,15 +1245,17 @@ function touchTool(touchToolInterface) { // If there is nothing to move, add a new instance of the tool // Need to check here to see if activation is allowed! if (touchToolInterface.touchDownActivateCallback) { - touchToolInterface.touchDownActivateCallback(e, eventData); + touchToolInterface.touchDownActivateCallback(e); } else { - touchDownActivateCallback(e, eventData); + touchDownActivateCallback(e); } return false; } - function touchStartCallback(e, eventData) { + function touchStartCallback(e) { + var eventData = e.detail; + // Console.log('touchTool touchStartCallback'); var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; @@ -1156,14 +1274,14 @@ function touchTool(touchToolInterface) { } cornerstone.updateImage(eventData.element); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } - if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') { + if (lastEvent && lastEvent.type === _events2.default.TOUCH_PRESS) { (0, _triggerEvent2.default)(element, lastEvent.type, lastEventData); } } @@ -1184,16 +1302,17 @@ function touchTool(touchToolInterface) { var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distance); if (handle) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } data.active = true; (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); + e.stopPropagation(); return; } @@ -1208,15 +1327,16 @@ function touchTool(touchToolInterface) { data = toolData.data[i]; if (touchToolInterface.pointNearTool(eventData.element, data, coords)) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); + e.stopPropagation(); return; } @@ -1226,17 +1346,17 @@ function touchTool(touchToolInterface) { // Not visible, not interactive function disable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); @@ -1244,19 +1364,19 @@ function touchTool(touchToolInterface) { // Visible but not interactive function enable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); if (touchToolInterface.doubleTapCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); @@ -1264,39 +1384,32 @@ function touchTool(touchToolInterface) { // Visible, interactive and can create function activate(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); - _externalModules2.default.$(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); + element.addEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); + element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } - // Note: This is to maintain compatibility for developers that have - // Built on top of touchTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function onImageRendered(e) { - touchToolInterface.onImageRendered(e, e.detail); - } - // Visible, interactive function deactivate(element) { - var eventType = 'CornerstoneToolsToolDeactivated'; + var eventType = _events2.default.TOOL_DEACTIVATED; var statusChangeEventData = { toolType: touchToolInterface.toolType, type: eventType @@ -1304,20 +1417,20 @@ function touchTool(touchToolInterface) { (0, _triggerEvent2.default)(element, eventType, statusChangeEventData); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); if (touchToolInterface.doubleTapCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); @@ -1356,7 +1469,7 @@ function touchTool(touchToolInterface) { exports.default = touchTool; /***/ }), -/* 10 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1405,7 +1518,7 @@ var loadHandlerManager = { exports.default = loadHandlerManager; /***/ }), -/* 11 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1416,7 +1529,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = function (touchDragCallback, options) { - var events = 'CornerstoneToolsTouchDrag'; + var events = _events2.default.TOUCH_DRAG; if (options && options.fireOnTouchStart === true) { events += ' CornerstoneToolsTouchStart'; @@ -1424,49 +1537,98 @@ exports.default = function (touchDragCallback, options) { var toolInterface = { activate: function activate(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); + element.removeEventListener(events, touchDragCallback); if (options && options.eventData) { - _externalModules2.default.$(element).on(events, options.eventData, touchDragCallback); + element.addEventListener(events, options.eventData, touchDragCallback); } else { - _externalModules2.default.$(element).on(events, touchDragCallback); + element.addEventListener(events, touchDragCallback); + } + + if (options && options.activateCallback) { + options.activateCallback(element); + } + }, + disable: function disable(element) { + element.removeEventListener(events, touchDragCallback); + if (options && options.disableCallback) { + options.disableCallback(element); } + }, + enable: function enable(element) { + element.removeEventListener(events, touchDragCallback); + if (options && options.enableCallback) { + options.enableCallback(element); + } + }, + deactivate: function deactivate(element) { + element.removeEventListener(events, touchDragCallback); + if (options && options.deactivateCallback) { + options.deactivateCallback(element); + } + } + }; + + return toolInterface; +}; + +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var defaultFontSize = 15, + defaultFont = defaultFontSize + 'px Arial', + defaultBackgroundColor = 'transparent'; + +function setFont(font) { + defaultFont = font; +} + +function getFont() { + return defaultFont; +} + +function setFontSize(fontSize) { + defaultFontSize = fontSize; +} - if (options && options.activateCallback) { - options.activateCallback(element); - } - }, - disable: function disable(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); - if (options && options.disableCallback) { - options.disableCallback(element); - } - }, - enable: function enable(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); - if (options && options.enableCallback) { - options.enableCallback(element); - } - }, - deactivate: function deactivate(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); - if (options && options.deactivateCallback) { - options.deactivateCallback(element); - } - } - }; +function getFontSize() { + return defaultFontSize; +} - return toolInterface; -}; +function setBackgroundColor(backgroundColor) { + defaultBackgroundColor = backgroundColor; +} -var _externalModules = __webpack_require__(0); +function getBackgroundColor() { + return defaultBackgroundColor; +} -var _externalModules2 = _interopRequireDefault(_externalModules); +var textStyle = { + setFont: setFont, + getFont: getFont, + setFontSize: setFontSize, + getFontSize: getFontSize, + setBackgroundColor: setBackgroundColor, + getBackgroundColor: getBackgroundColor +}; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +exports.default = textStyle; /***/ }), -/* 12 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1509,7 +1671,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 13 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1519,27 +1681,31 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = function (mouseDownCallback) { +exports.default = function (mouseDownCallback, toolType) { + if (!toolType) { + throw new Error('simpleMouseButtonTool: toolType is required'); + } + var configuration = {}; - var toolInterface = { - activate: function activate(element, mouseButtonMask, options) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); - var eventData = { - mouseButtonMask: mouseButtonMask, - options: options - }; + return { + activate: function activate(element, mouseButtonMask) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + options.mouseButtonMask = mouseButtonMask; + (0, _enabledElementTools.setToolOptions)(toolType, element, options); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, disable: function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, enable: function enable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, deactivate: function deactivate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, getConfiguration: function getConfiguration() { return configuration; @@ -1548,67 +1714,18 @@ exports.default = function (mouseDownCallback) { configuration = config; } }; - - return toolInterface; }; -var _externalModules = __webpack_require__(0); - -var _externalModules2 = _interopRequireDefault(_externalModules); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var defaultFontSize = 15, - defaultFont = defaultFontSize + 'px Arial', - defaultBackgroundColor = 'transparent'; - -function setFont(font) { - defaultFont = font; -} - -function getFont() { - return defaultFont; -} - -function setFontSize(fontSize) { - defaultFontSize = fontSize; -} - -function getFontSize() { - return defaultFontSize; -} - -function setBackgroundColor(backgroundColor) { - defaultBackgroundColor = backgroundColor; -} +var _events = __webpack_require__(1); -function getBackgroundColor() { - return defaultBackgroundColor; -} +var _events2 = _interopRequireDefault(_events); -var textStyle = { - setFont: setFont, - getFont: getFont, - setFontSize: setFontSize, - getFontSize: getFontSize, - setBackgroundColor: setBackgroundColor, - getBackgroundColor: getBackgroundColor -}; +var _enabledElementTools = __webpack_require__(3); -exports.default = textStyle; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 15 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1642,7 +1759,7 @@ function convertToVector3(arrayOrVector3) { } /***/ }), -/* 16 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1763,7 +1880,7 @@ exports.newImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager; exports.globalImageIdSpecificToolStateManager = globalImageIdSpecificToolStateManager; /***/ }), -/* 17 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1788,7 +1905,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 18 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1859,7 +1976,7 @@ function fracToDec(fractionalValue) { } /***/ }), -/* 19 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1910,14 +2027,14 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _pointInsideBoundingBox = __webpack_require__(17); +var _pointInsideBoundingBox = __webpack_require__(19); var _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 20 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2025,7 +2142,7 @@ exports.getBrowserInfo = getBrowserInfo; exports.isMobileDevice = isMobileDevice; /***/ }), -/* 21 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2036,35 +2153,31 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = function (mouseWheelCallback) { - var toolInterface = { + return { activate: function activate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); - var eventData = {}; - - _externalModules2.default.$(element).on('CornerstoneToolsMouseWheel', eventData, mouseWheelCallback); + element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback); + element.addEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback); }, disable: function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); + element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback); }, enable: function enable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); + element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback); }, deactivate: function deactivate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); + element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback); } }; - - return toolInterface; }; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 22 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2082,7 +2195,9 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa y: handle.y - mouseEventData.currentPoints.image.y }; - function mouseDragCallback(e, eventData) { + function mouseDragCallback(e) { + var eventData = e.detail; + if (handle.hasMoved === false) { handle.hasMoved = true; } @@ -2101,7 +2216,7 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa cornerstone.updateImage(element); - var eventType = 'CornerstoneToolsMeasurementModified'; + var eventType = _events2.default.MEASUREMENT_MODIFIED; var modifiedEventData = { toolType: toolType, element: element, @@ -2111,13 +2226,13 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa (0, _triggerEvent2.default)(element, eventType, modifiedEventData); } - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); function mouseUpCallback() { handle.active = false; - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); cornerstone.updateImage(element); if (typeof doneMovingCallback === 'function') { @@ -2125,22 +2240,26 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa } } - _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 23 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2154,7 +2273,9 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa var cornerstone = _externalModules2.default.cornerstone; var element = mouseEventData.element; - function moveCallback(e, eventData) { + function moveCallback(e) { + var eventData = e.detail; + handle.active = true; handle.x = eventData.currentPoints.image.x; handle.y = eventData.currentPoints.image.y; @@ -2169,7 +2290,7 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa cornerstone.updateImage(element); - var eventType = 'CornerstoneToolsMeasurementModified'; + var eventType = _events2.default.MEASUREMENT_MODIFIED; var modifiedEventData = { toolType: toolType, element: element, @@ -2180,50 +2301,54 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa } function whichMovement(e) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', whichMovement); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', whichMovement); + element.removeEventListener(_events2.default.MOUSE_MOVE, whichMovement); + element.removeEventListener(_events2.default.MOUSE_DRAG, whichMovement); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', moveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', moveCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, moveCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, moveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', moveEndCallback); - if (e.type === 'CornerstoneToolsMouseDrag') { - _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', moveEndCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, moveEndCallback); + if (e.type === _events2.default.MOUSE_DRAG) { + element.addEventListener(_events2.default.MOUSE_UP, moveEndCallback); } } - function measurementRemovedCallback(e, eventData) { + function measurementRemovedCallback(e) { + var eventData = e.detail; + if (eventData.measurementData === data) { moveEndCallback(); } } - function toolDeactivatedCallback(e, eventData) { + function toolDeactivatedCallback(e) { + var eventData = e.detail; + if (eventData.toolType === toolType) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', moveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', moveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback); - _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, moveCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, moveCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, moveEndCallback); + element.removeEventListener(_events2.default.MOUSE_UP, moveEndCallback); + element.removeEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback); + element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback); handle.active = false; cornerstone.updateImage(element); } } - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', whichMovement); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', whichMovement); - _externalModules2.default.$(element).on('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback); - _externalModules2.default.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, whichMovement); + element.addEventListener(_events2.default.MOUSE_MOVE, whichMovement); + element.addEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback); + element.addEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback); function moveEndCallback() { - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', moveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', moveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback); - _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, moveCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, moveCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, moveEndCallback); + element.removeEventListener(_events2.default.MOUSE_UP, moveEndCallback); + element.removeEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback); + element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback); handle.active = false; cornerstone.updateImage(element); @@ -2234,18 +2359,22 @@ exports.default = function (mouseEventData, toolType, data, handle, doneMovingCa } }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 24 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2258,20 +2387,13 @@ Object.defineProperty(exports, "__esModule", { exports.default = function (onImageRendered) { var configuration = {}; - // Note: This is to maintain compatibility for developers that have - // Built on top of mouseButtonRectangleTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function customEventOnImageRendered(e) { - onImageRendered(e, e.detail); - } - - var toolInterface = { + return { disable: function disable(element) { - element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); }, enable: function enable(element) { - element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered); - element.addEventListener('cornerstoneimagerendered', customEventOnImageRendered); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); _externalModules2.default.cornerstone.updateImage(element); }, getConfiguration: function getConfiguration() { @@ -2281,10 +2403,12 @@ exports.default = function (onImageRendered) { configuration = config; } }; - - return toolInterface; }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); @@ -2292,7 +2416,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 25 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2315,7 +2439,9 @@ exports.default = function (eventData, toolType, data, handle, doneMovingCallbac handle.active = true; data.active = true; - function moveCallback(e, eventData) { + function moveCallback(e) { + var eventData = e.detail; + handle.x = eventData.currentPoints.image.x + distanceFromTouch.x; handle.y = eventData.currentPoints.image.y + distanceFromTouch.y; @@ -2329,7 +2455,7 @@ exports.default = function (eventData, toolType, data, handle, doneMovingCallbac cornerstone.updateImage(element); - var eventType = 'CornerstoneToolsMeasurementModified'; + var eventType = _events2.default.MEASUREMENT_MODIFIED; var modifiedEventData = { toolType: toolType, element: element, @@ -2339,15 +2465,17 @@ exports.default = function (eventData, toolType, data, handle, doneMovingCallbac (0, _triggerEvent2.default)(element, eventType, modifiedEventData); } - function moveEndCallback(e, eventData) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', moveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation); - _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + function moveEndCallback(e) { + var eventData = e.detail; + + element.removeEventListener(_events2.default.TOUCH_DRAG, moveCallback); + element.removeEventListener(_events2.default.TOUCH_PINCH, moveEndCallback); + element.removeEventListener(_events2.default.TOUCH_END, moveEndCallback); + element.removeEventListener(_events2.default.TAP, moveEndCallback); + element.removeEventListener(_events2.default.TOUCH_START, stopImmediatePropagation); + element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback); - if (e.type === 'CornerstoneToolsTouchPinch' || e.type === 'CornerstoneToolsTouchPress') { + if (e.type === _events2.default.TOUCH_PINCH || e.type === _events2.default.TOUCH_PRESS) { handle.active = false; cornerstone.updateImage(element); doneMovingCallback(); @@ -2384,19 +2512,19 @@ exports.default = function (eventData, toolType, data, handle, doneMovingCallbac return false; } - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', moveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchPinch', moveEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchEnd', moveEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', moveEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', stopImmediatePropagation); + element.addEventListener(_events2.default.TOUCH_DRAG, moveCallback); + element.addEventListener(_events2.default.TOUCH_PINCH, moveEndCallback); + element.addEventListener(_events2.default.TOUCH_END, moveEndCallback); + element.addEventListener(_events2.default.TAP, moveEndCallback); + element.addEventListener(_events2.default.TOUCH_START, stopImmediatePropagation); function toolDeactivatedCallback() { - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', moveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', moveEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation); - _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG, moveCallback); + element.removeEventListener(_events2.default.TOUCH_PINCH, moveEndCallback); + element.removeEventListener(_events2.default.TOUCH_END, moveEndCallback); + element.removeEventListener(_events2.default.TAP, moveEndCallback); + element.removeEventListener(_events2.default.TOUCH_START, stopImmediatePropagation); + element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback); handle.active = false; data.active = false; @@ -2414,21 +2542,25 @@ exports.default = function (eventData, toolType, data, handle, doneMovingCallbac cornerstone.updateImage(element); } - _externalModules2.default.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.addEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback); }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 26 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2445,7 +2577,7 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); @@ -2584,7 +2716,7 @@ function planePlaneIntersection(targetImagePlane, referenceImagePlane) { } /***/ }), -/* 27 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2598,7 +2730,7 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _getMaxSimultaneousRequests = __webpack_require__(20); +var _getMaxSimultaneousRequests = __webpack_require__(22); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2642,10 +2774,10 @@ function addRequest(element, imageId, type, preventCache, doneCallback, failCall }; // If this imageId is in the cache, resolve it immediately - var imagePromise = _externalModules2.default.cornerstone.imageCache.getImagePromise(imageId); + var imageLoadObject = _externalModules2.default.cornerstone.imageCache.getImageLoadObject(imageId); - if (imagePromise) { - imagePromise.then(function (image) { + if (imageLoadObject) { + imageLoadObject.promise.then(function (image) { doneCallback(image); }, function (error) { failCallback(error); @@ -2690,12 +2822,12 @@ function sendRequest(requestDetails) { var failCallback = requestDetails.failCallback; // Check if we already have this image promise in the cache - var imagePromise = cornerstone.imageCache.getImagePromise(imageId); + var imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId); - if (imagePromise) { + if (imageLoadObject) { // If we do, remove from list (when resolved, as we could have // Pending prefetch requests) and stop processing this iteration - imagePromise.then(function (image) { + imageLoadObject.promise.then(function (image) { numRequests[type]--; // Console.log(numRequests); @@ -2805,7 +2937,7 @@ exports.default = { }; /***/ }), -/* 28 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2817,40 +2949,46 @@ Object.defineProperty(exports, "__esModule", { exports.default = function (touchDragCallback, options) { var configuration = {}; - var events = 'CornerstoneToolsMultiTouchDrag'; + var events = [_events2.default.MULTI_TOUCH_DRAG]; if (options && options.fireOnTouchStart === true) { - events += ' CornerstoneToolsMultiTouchStart'; + events.push(_events2.default.MULTI_TOUCH_START); } - var toolInterface = { + return { activate: function activate(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); - - if (options && options.eventData) { - _externalModules2.default.$(element).on(events, options.eventData, touchDragCallback); - } else { - _externalModules2.default.$(element).on(events, touchDragCallback); - } + events.forEach(function (eventType) { + element.removeEventListener(eventType, touchDragCallback); + element.addEventListener(eventType, touchDragCallback); + }); if (options && options.activateCallback) { options.activateCallback(element); } }, disable: function disable(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); + events.forEach(function (eventType) { + element.removeEventListener(eventType, touchDragCallback); + }); + if (options && options.disableCallback) { options.disableCallback(element); } }, enable: function enable(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); + events.forEach(function (eventType) { + element.removeEventListener(eventType, touchDragCallback); + }); + if (options && options.enableCallback) { options.enableCallback(element); } }, deactivate: function deactivate(element) { - _externalModules2.default.$(element).off(events, touchDragCallback); + events.forEach(function (eventType) { + element.removeEventListener(eventType, touchDragCallback); + }); + if (options && options.deactivateCallback) { options.deactivateCallback(element); } @@ -2862,18 +3000,16 @@ exports.default = function (touchDragCallback, options) { configuration = config; } }; - - return toolInterface; }; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 29 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2908,16 +3044,16 @@ exports.default = function (element, images) { (0, _scrollToIndex2.default)(element, newImageIdIndex); }; -var _scrollToIndex = __webpack_require__(43); +var _scrollToIndex = __webpack_require__(44); var _scrollToIndex2 = _interopRequireDefault(_scrollToIndex); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 30 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2934,7 +3070,7 @@ exports.default = function (value, precision) { }; /***/ }), -/* 31 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2973,7 +3109,7 @@ exports.default = function (ellipse, location) { }; /***/ }), -/* 32 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2999,7 +3135,7 @@ exports.default = function (e) { }; /***/ }), -/* 33 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3051,7 +3187,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 34 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3082,7 +3218,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 35 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3109,7 +3245,7 @@ var toolCoordinates = { exports.default = toolCoordinates; /***/ }), -/* 36 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3142,7 +3278,7 @@ exports.default = function (element, handles, canvasPoint, distanceThreshold) { return false; }; -var _getHandleNearImagePoint = __webpack_require__(19); +var _getHandleNearImagePoint = __webpack_require__(21); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); @@ -3165,7 +3301,7 @@ function getActiveHandle(handles) { } /***/ }), -/* 37 */ +/* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3175,11 +3311,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = function (mouseEventData, data, toolData, toolType, options, doneMovingCallback) { +exports.default = function (e, data, toolData, toolType, options, doneMovingCallback) { var cornerstone = _externalModules2.default.cornerstone; + var mouseEventData = e.detail; var element = mouseEventData.element; - function mouseDragCallback(e, eventData) { + function mouseDragCallback(e) { + var eventData = e.detail; + data.active = true; Object.keys(data.handles).forEach(function (name) { @@ -3203,7 +3342,7 @@ exports.default = function (mouseEventData, data, toolData, toolType, options, d cornerstone.updateImage(element); - var eventType = 'CornerstoneToolsMeasurementModified'; + var eventType = _events2.default.MEASUREMENT_MODIFIED; var modifiedEventData = { toolType: toolType, element: element, @@ -3212,17 +3351,20 @@ exports.default = function (mouseEventData, data, toolData, toolType, options, d (0, _triggerEvent2.default)(element, eventType, modifiedEventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + + function mouseUpCallback(e) { + var eventData = e.detail; - function mouseUpCallback(e, eventData) { data.invalidated = true; - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); // If any handle is outside the image, delete the tool data if (options.deleteIfHandleOutsideImage === true && (0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { @@ -3236,30 +3378,34 @@ exports.default = function (mouseEventData, data, toolData, toolType, options, d } } - _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); return true; }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 38 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3339,16 +3485,16 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 39 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3371,10 +3517,10 @@ exports.default = function (targetImagePlane, referenceImagePlane) { }; }; -var _pointProjector = __webpack_require__(26); +var _pointProjector = __webpack_require__(28); /***/ }), -/* 40 */ +/* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3454,26 +3600,26 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _calculateReferenceLine = __webpack_require__(39); +var _calculateReferenceLine = __webpack_require__(41); var _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 41 */ +/* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3483,11 +3629,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _getOrientationString = __webpack_require__(63); +var _getOrientationString = __webpack_require__(64); var _getOrientationString2 = _interopRequireDefault(_getOrientationString); -var _invertOrientationString = __webpack_require__(64); +var _invertOrientationString = __webpack_require__(65); var _invertOrientationString2 = _interopRequireDefault(_invertOrientationString); @@ -3498,43 +3644,10 @@ var orientation = { invertOrientationString: _invertOrientationString2.default }; -exports.default = orientation; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (enabledElement, context, fontSize) { - var fontScale = 0.1; - - _externalModules2.default.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale); - // Return the font size to use - var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale; - // TODO: actually calculate this? - var lineHeight = fontSize / enabledElement.viewport.scale / fontScale; - - return { - fontSize: scaledFontSize, - lineHeight: lineHeight, - fontScale: fontScale - }; -}; - -var _externalModules = __webpack_require__(0); - -var _externalModules2 = _interopRequireDefault(_externalModules); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +exports.default = orientation; /***/ }), -/* 43 */ +/* 44 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3628,13 +3741,14 @@ exports.default = function (element, newImageIdIndex) { // Was rejected, if the option is set var config = _stackScroll.stackScroll.getConfiguration(); - if (config && config.retryLoadOnScroll === true) { - var newImagePromise = cornerstone.imageCache.getImagePromise(newImageId); + if (config && config.retryLoadOnScroll === true) {} + // Const newImageLoadObject = cornerstone.imageCache.getImageLoadObject(newImageId); + + // TODO: No way to check state of Promise. No way to know if it is rejected. + /* If (newImageLoadObject && newImagePromise.state() === 'rejected') { + cornerstone.imageCache.removeImagePromise(newImageId); + }*/ - if (newImagePromise && newImagePromise.state() === 'rejected') { - cornerstone.imageCache.removeImagePromise(newImageId); - } - } // Convert the preventCache value in stack data to a boolean var preventCache = Boolean(stackData.preventCache); @@ -3651,33 +3765,37 @@ exports.default = function (element, newImageIdIndex) { // Make sure we kick off any changed download request pools _requestPoolManager2.default.startGrabbing(); - (0, _triggerEvent2.default)(element, 'CornerstoneStackScroll', eventData); + (0, _triggerEvent2.default)(element, _events2.default.STACK_SCROLL, eventData); }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _requestPoolManager = __webpack_require__(27); +var _requestPoolManager = __webpack_require__(29); var _requestPoolManager2 = _interopRequireDefault(_requestPoolManager); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); -var _stackScroll = __webpack_require__(44); +var _stackScroll = __webpack_require__(45); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 44 */ +/* 45 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3688,60 +3806,72 @@ Object.defineProperty(exports, "__esModule", { }); exports.stackScrollMultiTouch = exports.stackScrollTouchDrag = exports.stackScrollWheel = exports.stackScroll = undefined; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); -var _multiTouchDragTool = __webpack_require__(28); +var _multiTouchDragTool = __webpack_require__(30); var _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _mouseWheelTool = __webpack_require__(21); +var _mouseWheelTool = __webpack_require__(23); var _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _scroll = __webpack_require__(29); +var _scroll = __webpack_require__(31); var _scroll2 = _interopRequireDefault(_scroll); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +var toolType = 'stackScroll'; + +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { var mouseDragEventData = { deltaY: 0 }; - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, dragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragEventData, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); e.stopImmediatePropagation(); return false; } } -function mouseWheelCallback(e, eventData) { +function mouseWheelCallback(e) { + var eventData = e.detail; var images = -eventData.direction; var config = stackScroll.getConfiguration(); @@ -3755,7 +3885,8 @@ function mouseWheelCallback(e, eventData) { (0, _scroll2.default)(eventData.element, images, loop); } -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; var element = eventData.element; var toolData = (0, _toolState.getToolState)(element, 'stack'); @@ -3769,7 +3900,7 @@ function dragCallback(e, eventData) { var config = stackScroll.getConfiguration(); // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks - var pixelsPerImage = Math.max(2, _externalModules2.default.$(element).height() / Math.max(stackData.imageIds.length, 8)); + var pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8)); if (config && config.stackScrollSpeed) { pixelsPerImage = config.stackScrollSpeed; @@ -3786,11 +3917,12 @@ function dragCallback(e, eventData) { (0, _scroll2.default)(element, imageIdIndexOffset); } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } // Module/private exports -var stackScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var stackScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); var stackScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback); var options = { @@ -3800,11 +3932,12 @@ var options = { }; var stackScrollTouchDrag = (0, _touchDragTool2.default)(dragCallback, options); -function multiTouchDragCallback(e, eventData) { +function multiTouchDragCallback(e) { + var eventData = e.detail; var config = stackScrollMultiTouch.getConfiguration(); if (config && config.testPointers(eventData)) { - dragCallback(e, eventData); + dragCallback(e); } } @@ -3824,7 +3957,7 @@ exports.stackScrollTouchDrag = stackScrollTouchDrag; exports.stackScrollMultiTouch = stackScrollMultiTouch; /***/ }), -/* 45 */ +/* 46 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3880,7 +4013,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 46 */ +/* 47 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3915,7 +4048,7 @@ exports.default = function (context, x, y, w, h) { }; /***/ }), -/* 47 */ +/* 48 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3936,7 +4069,7 @@ exports.default = function (context, start, color, lineWidth) { }; /***/ }), -/* 48 */ +/* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3981,7 +4114,7 @@ exports.default = function (context, start, end, color, lineWidth) { }; /***/ }), -/* 49 */ +/* 50 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4036,14 +4169,14 @@ exports.default = function (sp, ellipse) { }; }; -var _pointInEllipse = __webpack_require__(31); +var _pointInEllipse = __webpack_require__(33); var _pointInEllipse2 = _interopRequireDefault(_pointInEllipse); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 50 */ +/* 51 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4056,19 +4189,19 @@ Object.defineProperty(exports, "__esModule", { exports.default = function (keyDownCallback) { var configuration = {}; - var toolInterface = { + return { activate: function activate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback); + element.addEventListener(_events2.default.KEY_DOWN, keyDownCallback); }, disable: function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback); }, enable: function enable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback); }, deactivate: function deactivate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback); }, getConfiguration: function getConfiguration() { return configuration; @@ -4077,18 +4210,16 @@ exports.default = function (keyDownCallback) { configuration = config; } }; - - return toolInterface; }; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 51 */ +/* 52 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4098,11 +4229,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = function (touchEventData, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) { +exports.default = function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) { + var touchEventData = event.detail; var element = touchEventData.element; var cornerstone = _externalModules2.default.cornerstone; - function touchDragCallback(e, eventData) { + function touchDragCallback(e) { + var eventData = e.detail; + data.active = true; Object.keys(data.handles).forEach(function (name) { @@ -4117,7 +4251,7 @@ exports.default = function (touchEventData, data, toolData, toolType, deleteIfHa }); cornerstone.updateImage(element); - var eventType = 'CornerstoneToolsMeasurementModified'; + var eventType = _events2.default.MEASUREMENT_MODIFIED; var modifiedEventData = { toolType: toolType, element: element, @@ -4126,62 +4260,72 @@ exports.default = function (touchEventData, data, toolData, toolType, deleteIfHa (0, _triggerEvent2.default)(element, eventType, modifiedEventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback); + element.addEventListener(_events2.default.TOUCH_DRAG, touchDragCallback); + + function touchEndCallback(e) { + var eventData = e.detail; - function touchEndCallback(e, eventData) { // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type); data.active = false; data.invalidated = false; - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchEnd', touchEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsDragEnd', touchEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', touchEndCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG, touchDragCallback); + + element.removeEventListener(_events2.default.TOUCH_PINCH, touchEndCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, touchEndCallback); + element.removeEventListener(_events2.default.TOUCH_END, touchEndCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG_END, touchEndCallback); + element.removeEventListener(_events2.default.TAP, touchEndCallback); // If any handle is outside the image, delete the tool data - if (deleteIfHandleOutsideImage === true && (0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { + var handlesOutsideImage = (0, _anyHandlesOutsideImage2.default)(eventData, data.handles); + + if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) { (0, _toolState.removeToolState)(element, toolType, data); } cornerstone.updateImage(element); if (typeof doneMovingCallback === 'function') { - doneMovingCallback(e, eventData); + doneMovingCallback(e); } } - _externalModules2.default.$(element).on('CornerstoneToolsTouchPinch', touchEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchEnd', touchEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsDragEnd', touchEndCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', touchEndCallback); + element.addEventListener(_events2.default.TOUCH_PINCH, touchEndCallback); + element.addEventListener(_events2.default.TOUCH_PRESS, touchEndCallback); + element.addEventListener(_events2.default.TOUCH_END, touchEndCallback); + element.addEventListener(_events2.default.TOUCH_DRAG_END, touchEndCallback); + element.addEventListener(_events2.default.TAP, touchEndCallback); return true; }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 52 */ +/* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4191,10 +4335,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = function (touchEventData, toolType, data, handle, doneMovingCallback) { +exports.default = function (event, toolType, data, handle, doneMovingCallback) { // Console.log('touchMoveHandle'); runAnimation.value = true; + var touchEventData = event.detail; var cornerstone = _externalModules2.default.cornerstone; var element = touchEventData.element; var enabledElement = cornerstone.getEnabledElement(element); @@ -4212,7 +4357,9 @@ exports.default = function (touchEventData, toolType, data, handle, doneMovingCa var targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y); - function touchDragCallback(e, eventData) { + function touchDragCallback(e) { + var eventData = e.detail; + // Console.log('touchMoveHandle touchDragCallback: ' + e.type); runAnimation.value = false; @@ -4234,7 +4381,7 @@ exports.default = function (touchEventData, toolType, data, handle, doneMovingCa cornerstone.updateImage(element); - var eventType = 'CornerstoneToolsMeasurementModified'; + var eventType = _events2.default.MEASUREMENT_MODIFIED; var modifiedEventData = { toolType: toolType, element: element, @@ -4244,19 +4391,23 @@ exports.default = function (touchEventData, toolType, data, handle, doneMovingCa (0, _triggerEvent2.default)(element, eventType, modifiedEventData); } - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback); + element.addEventListener(_events2.default.TOUCH_DRAG, touchDragCallback); - function touchEndCallback(e, eventData) { + function touchEndCallback(e) { + var eventData = e.detail; // Console.log('touchMoveHandle touchEndCallback: ' + e.type); + runAnimation.value = false; handle.active = false; - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback); - _externalModules2.default.$(element).off(touchEndEvents, touchEndCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG, touchDragCallback); + touchEndEvents.forEach(function (eventType) { + element.removeEventListener(eventType, touchEndCallback); + }); cornerstone.updateImage(element); - if (e.type === 'CornerstoneToolsTouchPress') { + if (e.type === _events2.default.TOUCH_PRESS) { eventData.handlePressed = data; handle.x = touchEventData.currentPoints.image.x; @@ -4264,20 +4415,26 @@ exports.default = function (touchEventData, toolType, data, handle, doneMovingCa } if (typeof doneMovingCallback === 'function') { - doneMovingCallback(e, eventData); + doneMovingCallback(e); } } - _externalModules2.default.$(element).on(touchEndEvents, touchEndCallback); + touchEndEvents.forEach(function (eventType) { + element.addEventListener(eventType, touchEndCallback); + }); animate(time, handle, runAnimation, enabledElement, targetLocation); }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -4291,7 +4448,7 @@ var runAnimation = { value: false }; -var touchEndEvents = ['CornerstoneToolsTouchEnd', 'CornerstoneToolsDragEnd', 'CornerstoneToolsTouchPinch', 'CornerstoneToolsTouchPress', 'CornerstoneToolsTap'].join(' '); +var touchEndEvents = [_events2.default.TOUCH_END, _events2.default.TOUCH_DRAG_END, _events2.default.TOUCH_PINCH, _events2.default.TOUCH_PRESS, _events2.default.TAP]; function animate(lastTime, handle, runAnimation, enabledElement, targetLocation) { // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/ @@ -4308,7 +4465,6 @@ function animate(lastTime, handle, runAnimation, enabledElement, targetLocation) var distanceRemaining = Math.abs(handle.y - targetLocation.y); var linearDistEachFrame = distanceRemaining / 10; - console.log('distanceRemaining: ' + distanceRemaining); if (distanceRemaining < 1) { handle.y = targetLocation.y; runAnimation.value = false; @@ -4332,7 +4488,7 @@ function animate(lastTime, handle, runAnimation, enabledElement, targetLocation) } /***/ }), -/* 53 */ +/* 54 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4341,13 +4497,6 @@ function animate(lastTime, handle, runAnimation, enabledElement, targetLocation) Object.defineProperty(exports, "__esModule", { value: true }); - -var _externalModules = __webpack_require__(0); - -var _externalModules2 = _interopRequireDefault(_externalModules); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // Functions to prevent ghost clicks following a touch // All credit to @kosich // https://gist.github.com/kosich/23188dd86633b6c2efb7 @@ -4389,7 +4538,7 @@ function attachEvents(element, eventList, interactionType) { var tapHandler = interactionType ? handleTapMouse : handleTapTouch; eventList.forEach(function (eventName) { - _externalModules2.default.$(element).on(eventName, tapHandler); + element.addEventListener(eventName, tapHandler); }); } @@ -4397,7 +4546,7 @@ function removeEvents(element, eventList, interactionType) { var tapHandler = interactionType ? handleTapMouse : handleTapTouch; eventList.forEach(function (eventName) { - _externalModules2.default.$(element).off(eventName, tapHandler); + element.removeEventListener(eventName, tapHandler); }); } @@ -4423,7 +4572,7 @@ var preventGhostClick = { exports.default = preventGhostClick; /***/ }), -/* 54 */ +/* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4436,31 +4585,29 @@ Object.defineProperty(exports, "__esModule", { exports.default = function (doubleTapCallback) { return { activate: function activate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); - var eventData = {}; - - _externalModules2.default.$(element).on('CornerstoneToolsDoubleTap', eventData, doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback); + element.addEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback); }, disable: function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback); }, enable: function enable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback); }, deactivate: function deactivate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); + element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback); } }; }; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 55 */ +/* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4471,8 +4618,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = function (mouseToolInterface, preventHandleOutsideImage) { + var toolType = mouseToolInterface.toolType; + // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement(mouseEventData) { + var element = mouseEventData.element; var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); // Prevent adding new measurement if tool returns nill @@ -4481,24 +4631,28 @@ exports.default = function (mouseToolInterface, preventHandleOutsideImage) { } // Associate this data with this imageId so we can render it and manipulate it - (0, _toolState.addToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData); + (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - (0, _moveHandle2.default)(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () { + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + (0, _moveHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () { measurementData.active = false; if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) { // Delete the measurement - (0, _toolState.removeToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData); + (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData); } - _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); }, preventHandleOutsideImage); } - function mouseDownActivateCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { + function mouseDownActivateCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { addNewMeasurement(eventData); return false; // False = cases jquery to preventDefault() and stopPropagation() this event @@ -4508,15 +4662,13 @@ exports.default = function (mouseToolInterface, preventHandleOutsideImage) { // /////// BEGIN DEACTIVE TOOL /////// - function mouseMoveCallback(e, eventData) { + function mouseMoveCallback(e) { + var eventData = e.detail; + _toolCoordinates2.default.setCoords(eventData); - // If a mouse button is down, do nothing - if (eventData.which !== 0) { - return; - } // If we have no tool data for this element, do nothing - var toolData = (0, _toolState.getToolState)(eventData.element, mouseToolInterface.toolType); + var toolData = (0, _toolState.getToolState)(eventData.element, toolType); if (toolData === undefined) { return; @@ -4547,132 +4699,126 @@ exports.default = function (mouseToolInterface, preventHandleOutsideImage) { } } - function mouseDownCallback(e, eventData) { + function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; var cornerstone = _externalModules2.default.cornerstone; var data = void 0; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + return; + } function handleDoneMove() { data.active = false; if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { // Delete the measurement - (0, _toolState.removeToolState)(eventData.element, mouseToolInterface.toolType, data); + (0, _toolState.removeToolState)(eventData.element, toolType, data); } cornerstone.updateImage(eventData.element); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); } - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - var coords = eventData.startPoints.canvas; - var toolData = (0, _toolState.getToolState)(e.currentTarget, mouseToolInterface.toolType); + var coords = eventData.startPoints.canvas; + var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); - var i = void 0; + var i = void 0; - // Now check to see if there is a handle we can move - var distanceSq = 25; + // Now check to see if there is a handle we can move + var distanceSq = 25; - if (toolData !== undefined) { - for (i = 0; i < toolData.data.length; i++) { - data = toolData.data[i]; - var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distanceSq); + if (toolData !== undefined) { + for (i = 0; i < toolData.data.length; i++) { + data = toolData.data[i]; + var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distanceSq); - if (handle !== undefined) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - data.active = true; - (0, _moveHandle2.default)(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage); - e.stopImmediatePropagation(); + if (handle !== undefined) { + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + data.active = true; + (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage); + e.stopImmediatePropagation(); - return false; - } + return false; } } + } - // Now check to see if there is a line we can move - // Now check to see if we have a tool that we can move - var options = { - deleteIfHandleOutsideImage: true, - preventHandleOutsideImage: preventHandleOutsideImage - }; + // Now check to see if there is a line we can move + // Now check to see if we have a tool that we can move + var opt = { + deleteIfHandleOutsideImage: true, + preventHandleOutsideImage: preventHandleOutsideImage + }; - if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) { - for (i = 0; i < toolData.data.length; i++) { - data = toolData.data[i]; - if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - (0, _moveAllHandles2.default)(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); - e.stopImmediatePropagation(); + if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) { + for (i = 0; i < toolData.data.length; i++) { + data = toolData.data[i]; + if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) { + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + e.stopImmediatePropagation(); - return false; - } + return false; } } } } // /////// END DEACTIVE TOOL /////// - // Note: This is to maintain compatibility for developers that have - // Built on top of mouseButtonRectangleTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function onImageRendered(e) { - mouseToolInterface.onImageRendered(e, e.detail); - } - // Not visible, not interactive function disable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); _externalModules2.default.cornerstone.updateImage(element); } // Visible but not interactive function enable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive function deactivate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); _externalModules2.default.cornerstone.updateImage(element); } @@ -4687,44 +4833,50 @@ exports.default = function (mouseToolInterface, preventHandleOutsideImage) { return toolInterface; }; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolCoordinates = __webpack_require__(35); +var _toolCoordinates = __webpack_require__(37); var _toolCoordinates2 = _interopRequireDefault(_toolCoordinates); -var _getHandleNearImagePoint = __webpack_require__(19); +var _getHandleNearImagePoint = __webpack_require__(21); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); -var _handleActivator = __webpack_require__(36); +var _handleActivator = __webpack_require__(38); var _handleActivator2 = _interopRequireDefault(_handleActivator); -var _moveHandle = __webpack_require__(22); +var _moveHandle = __webpack_require__(24); var _moveHandle2 = _interopRequireDefault(_moveHandle); -var _moveAllHandles = __webpack_require__(37); +var _moveAllHandles = __webpack_require__(39); var _moveAllHandles2 = _interopRequireDefault(_moveAllHandles); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 56 */ +/* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4735,35 +4887,31 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = function (touchPinchCallback) { - var toolInterface = { + return { activate: function activate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); - var eventData = {}; - - _externalModules2.default.$(element).on('CornerstoneToolsTouchPinch', eventData, touchPinchCallback); + element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback); + element.addEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback); }, disable: function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); + element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback); }, enable: function enable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); + element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback); }, deactivate: function deactivate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); + element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback); } }; - - return toolInterface; }; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 57 */ +/* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4772,39 +4920,74 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = brushTool; + +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + +var _externalModules = __webpack_require__(0); + +var _externalModules2 = _interopRequireDefault(_externalModules); + +var _toolState = __webpack_require__(2); + +var _mouseButtonTool = __webpack_require__(9); + +var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); + +var _isMouseButtonEnabled = __webpack_require__(4); + +var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); + +var _enabledElementTools = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var TOOL_STATE_TOOL_TYPE = 'brush'; +var brushLayerId = void 0; -exports.default = function (brushToolInterface) { - function mouseMoveCallback(e, eventData) { - brushToolInterface.onMouseMove(e, eventData); +function brushTool(brushToolInterface) { + var toolType = brushToolInterface.toolType; + + function mouseMoveCallback(e) { + brushToolInterface.onMouseMove(e); } - function mouseUpCallback(e, eventData) { - brushToolInterface.onMouseUp(e, eventData); + function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + brushToolInterface.onMouseUp(e); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseMoveCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } - function dragCallback(e, eventData) { - brushToolInterface.onDrag(e, eventData); + function dragCallback(e) { + brushToolInterface.onDrag(e); return false; } - function mouseDownActivateCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); - brushToolInterface.onMouseDown(e, eventData); + function mouseDownActivateCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); + brushToolInterface.onMouseDown(e); return false; } - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseMoveCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); } function onImageRendered(e) { @@ -4827,24 +5010,22 @@ exports.default = function (brushToolInterface) { _externalModules2.default.cornerstone.updateImage(element); - // Note: This is to maintain compatibility with jQuery event handlers. - // On our next migration this should just be onImageRendered(e) - brushToolInterface.onImageRendered(e, eventData); + brushToolInterface.onImageRendered(e); } function activate(element, mouseButtonMask) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - var eventData = { - mouseButtonMask: mouseButtonMask - }; + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback); + // TODO: Fix jQuery event + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element); var _enabledElement$image = enabledElement.image, @@ -4916,9 +5097,9 @@ exports.default = function (brushToolInterface) { } function deactivate(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); } var brushTool = (0, _mouseButtonTool2.default)({ @@ -4931,29 +5112,10 @@ exports.default = function (brushToolInterface) { brushTool.activate = activate; return brushTool; -}; - -var _externalModules = __webpack_require__(0); - -var _externalModules2 = _interopRequireDefault(_externalModules); - -var _toolState = __webpack_require__(1); - -var _mouseButtonTool = __webpack_require__(7); - -var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); - -var _isMouseButtonEnabled = __webpack_require__(2); - -var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var TOOL_STATE_TOOL_TYPE = 'brush'; -var brushLayerId = void 0; +} /***/ }), -/* 58 */ +/* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5001,7 +5163,7 @@ function getCircle(radius, rows, columns) { } /***/ }), -/* 59 */ +/* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5057,7 +5219,7 @@ exports.drawBrushPixels = drawBrushPixels; exports.drawBrushOnCanvas = drawBrushOnCanvas; /***/ }), -/* 60 */ +/* 61 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5076,7 +5238,7 @@ Object.defineProperty(exports, 'external', { } }); -var _index = __webpack_require__(61); +var _index = __webpack_require__(62); Object.defineProperty(exports, 'referenceLines', { enumerable: true, @@ -5085,7 +5247,7 @@ Object.defineProperty(exports, 'referenceLines', { } }); -var _index2 = __webpack_require__(41); +var _index2 = __webpack_require__(43); Object.defineProperty(exports, 'orientation', { enumerable: true, @@ -5094,7 +5256,7 @@ Object.defineProperty(exports, 'orientation', { } }); -var _requestPoolManager = __webpack_require__(27); +var _requestPoolManager = __webpack_require__(29); Object.defineProperty(exports, 'requestPoolManager', { enumerable: true, @@ -5103,7 +5265,7 @@ Object.defineProperty(exports, 'requestPoolManager', { } }); -var _setContextToDisplayFontSize = __webpack_require__(42); +var _setContextToDisplayFontSize = __webpack_require__(66); Object.defineProperty(exports, 'setContextToDisplayFontSize', { enumerable: true, @@ -5112,7 +5274,7 @@ Object.defineProperty(exports, 'setContextToDisplayFontSize', { } }); -var _scrollToIndex = __webpack_require__(43); +var _scrollToIndex = __webpack_require__(44); Object.defineProperty(exports, 'scrollToIndex', { enumerable: true, @@ -5121,7 +5283,7 @@ Object.defineProperty(exports, 'scrollToIndex', { } }); -var _scroll = __webpack_require__(29); +var _scroll = __webpack_require__(31); Object.defineProperty(exports, 'scroll', { enumerable: true, @@ -5130,7 +5292,7 @@ Object.defineProperty(exports, 'scroll', { } }); -var _roundToDecimal = __webpack_require__(30); +var _roundToDecimal = __webpack_require__(32); Object.defineProperty(exports, 'roundToDecimal', { enumerable: true, @@ -5139,7 +5301,7 @@ Object.defineProperty(exports, 'roundToDecimal', { } }); -var _pointProjector = __webpack_require__(26); +var _pointProjector = __webpack_require__(28); Object.defineProperty(exports, 'projectPatientPointToImagePlane', { enumerable: true, @@ -5160,7 +5322,7 @@ Object.defineProperty(exports, 'planePlaneIntersection', { } }); -var _pointInsideBoundingBox = __webpack_require__(17); +var _pointInsideBoundingBox = __webpack_require__(19); Object.defineProperty(exports, 'pointInsideBoundingBox', { enumerable: true, @@ -5169,7 +5331,7 @@ Object.defineProperty(exports, 'pointInsideBoundingBox', { } }); -var _pointInEllipse = __webpack_require__(31); +var _pointInEllipse = __webpack_require__(33); Object.defineProperty(exports, 'pointInEllipse', { enumerable: true, @@ -5178,7 +5340,7 @@ Object.defineProperty(exports, 'pointInEllipse', { } }); -var _pauseEvent = __webpack_require__(32); +var _pauseEvent = __webpack_require__(34); Object.defineProperty(exports, 'pauseEvent', { enumerable: true, @@ -5187,7 +5349,7 @@ Object.defineProperty(exports, 'pauseEvent', { } }); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); Object.defineProperty(exports, 'isMouseButtonEnabled', { enumerable: true, @@ -5196,7 +5358,7 @@ Object.defineProperty(exports, 'isMouseButtonEnabled', { } }); -var _getRGBPixels = __webpack_require__(33); +var _getRGBPixels = __webpack_require__(35); Object.defineProperty(exports, 'getRGBPixels', { enumerable: true, @@ -5205,7 +5367,7 @@ Object.defineProperty(exports, 'getRGBPixels', { } }); -var _getMaxSimultaneousRequests = __webpack_require__(20); +var _getMaxSimultaneousRequests = __webpack_require__(22); Object.defineProperty(exports, 'getDefaultSimultaneousRequests', { enumerable: true, @@ -5232,7 +5394,7 @@ Object.defineProperty(exports, 'isMobileDevice', { } }); -var _getLuminance = __webpack_require__(45); +var _getLuminance = __webpack_require__(46); Object.defineProperty(exports, 'getLuminance', { enumerable: true, @@ -5241,7 +5403,7 @@ Object.defineProperty(exports, 'getLuminance', { } }); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); Object.defineProperty(exports, 'drawTextBox', { enumerable: true, @@ -5250,7 +5412,7 @@ Object.defineProperty(exports, 'drawTextBox', { } }); -var _drawEllipse = __webpack_require__(46); +var _drawEllipse = __webpack_require__(47); Object.defineProperty(exports, 'drawEllipse', { enumerable: true, @@ -5259,7 +5421,7 @@ Object.defineProperty(exports, 'drawEllipse', { } }); -var _drawCircle = __webpack_require__(47); +var _drawCircle = __webpack_require__(48); Object.defineProperty(exports, 'drawCircle', { enumerable: true, @@ -5268,7 +5430,7 @@ Object.defineProperty(exports, 'drawCircle', { } }); -var _drawArrow = __webpack_require__(48); +var _drawArrow = __webpack_require__(49); Object.defineProperty(exports, 'drawArrow', { enumerable: true, @@ -5277,7 +5439,7 @@ Object.defineProperty(exports, 'drawArrow', { } }); -var _copyPoints = __webpack_require__(34); +var _copyPoints = __webpack_require__(36); Object.defineProperty(exports, 'copyPoints', { enumerable: true, @@ -5286,7 +5448,7 @@ Object.defineProperty(exports, 'copyPoints', { } }); -var _calculateSUV = __webpack_require__(18); +var _calculateSUV = __webpack_require__(20); Object.defineProperty(exports, 'calculateSUV', { enumerable: true, @@ -5295,7 +5457,7 @@ Object.defineProperty(exports, 'calculateSUV', { } }); -var _calculateEllipseStatistics = __webpack_require__(49); +var _calculateEllipseStatistics = __webpack_require__(50); Object.defineProperty(exports, 'calculateEllipseStatistics', { enumerable: true, @@ -5304,7 +5466,7 @@ Object.defineProperty(exports, 'calculateEllipseStatistics', { } }); -var _probeTool4D = __webpack_require__(65); +var _probeTool4D = __webpack_require__(67); Object.defineProperty(exports, 'probeTool4D', { enumerable: true, @@ -5313,7 +5475,7 @@ Object.defineProperty(exports, 'probeTool4D', { } }); -var _incrementTimePoint = __webpack_require__(38); +var _incrementTimePoint = __webpack_require__(40); Object.defineProperty(exports, 'incrementTimePoint', { enumerable: true, @@ -5322,7 +5484,7 @@ Object.defineProperty(exports, 'incrementTimePoint', { } }); -var _timeSeriesPlayer = __webpack_require__(68); +var _timeSeriesPlayer = __webpack_require__(70); Object.defineProperty(exports, 'timeSeriesPlayer', { enumerable: true, @@ -5331,7 +5493,7 @@ Object.defineProperty(exports, 'timeSeriesPlayer', { } }); -var _timeSeriesScroll = __webpack_require__(69); +var _timeSeriesScroll = __webpack_require__(71); Object.defineProperty(exports, 'timeSeriesScroll', { enumerable: true, @@ -5352,7 +5514,7 @@ Object.defineProperty(exports, 'timeSeriesScrollTouchDrag', { } }); -var _wwwcSynchronizer = __webpack_require__(70); +var _wwwcSynchronizer = __webpack_require__(72); Object.defineProperty(exports, 'wwwcSynchronizer', { enumerable: true, @@ -5361,7 +5523,7 @@ Object.defineProperty(exports, 'wwwcSynchronizer', { } }); -var _updateImageSynchronizer = __webpack_require__(71); +var _updateImageSynchronizer = __webpack_require__(73); Object.defineProperty(exports, 'updateImageSynchronizer', { enumerable: true, @@ -5370,7 +5532,7 @@ Object.defineProperty(exports, 'updateImageSynchronizer', { } }); -var _Synchronizer = __webpack_require__(72); +var _Synchronizer = __webpack_require__(74); Object.defineProperty(exports, 'Synchronizer', { enumerable: true, @@ -5379,7 +5541,7 @@ Object.defineProperty(exports, 'Synchronizer', { } }); -var _stackScrollSynchronizer = __webpack_require__(73); +var _stackScrollSynchronizer = __webpack_require__(75); Object.defineProperty(exports, 'stackScrollSynchronizer', { enumerable: true, @@ -5388,7 +5550,7 @@ Object.defineProperty(exports, 'stackScrollSynchronizer', { } }); -var _stackImagePositionSynchronizer = __webpack_require__(74); +var _stackImagePositionSynchronizer = __webpack_require__(76); Object.defineProperty(exports, 'stackImagePositionSynchronizer', { enumerable: true, @@ -5397,7 +5559,7 @@ Object.defineProperty(exports, 'stackImagePositionSynchronizer', { } }); -var _stackImagePositionOffsetSynchronizer = __webpack_require__(75); +var _stackImagePositionOffsetSynchronizer = __webpack_require__(77); Object.defineProperty(exports, 'stackImagePositionOffsetSynchronizer', { enumerable: true, @@ -5406,7 +5568,7 @@ Object.defineProperty(exports, 'stackImagePositionOffsetSynchronizer', { } }); -var _stackImageIndexSynchronizer = __webpack_require__(76); +var _stackImageIndexSynchronizer = __webpack_require__(78); Object.defineProperty(exports, 'stackImageIndexSynchronizer', { enumerable: true, @@ -5415,7 +5577,7 @@ Object.defineProperty(exports, 'stackImageIndexSynchronizer', { } }); -var _panZoomSynchronizer = __webpack_require__(77); +var _panZoomSynchronizer = __webpack_require__(79); Object.defineProperty(exports, 'panZoomSynchronizer', { enumerable: true, @@ -5424,7 +5586,7 @@ Object.defineProperty(exports, 'panZoomSynchronizer', { } }); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); Object.defineProperty(exports, 'toolStyle', { enumerable: true, @@ -5433,7 +5595,7 @@ Object.defineProperty(exports, 'toolStyle', { } }); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); Object.defineProperty(exports, 'addToolState', { enumerable: true, @@ -5472,7 +5634,7 @@ Object.defineProperty(exports, 'getElementToolStateManager', { } }); -var _toolCoordinates = __webpack_require__(35); +var _toolCoordinates = __webpack_require__(37); Object.defineProperty(exports, 'toolCoordinates', { enumerable: true, @@ -5481,7 +5643,7 @@ Object.defineProperty(exports, 'toolCoordinates', { } }); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); Object.defineProperty(exports, 'toolColors', { enumerable: true, @@ -5490,7 +5652,7 @@ Object.defineProperty(exports, 'toolColors', { } }); -var _timeSeriesSpecificStateManager = __webpack_require__(78); +var _timeSeriesSpecificStateManager = __webpack_require__(80); Object.defineProperty(exports, 'addTimeSeriesStateManager', { enumerable: true, @@ -5514,7 +5676,7 @@ Object.defineProperty(exports, 'textStyle', { } }); -var _stackSpecificStateManager = __webpack_require__(79); +var _stackSpecificStateManager = __webpack_require__(81); Object.defineProperty(exports, 'stackSpecificStateManager', { enumerable: true, @@ -5535,7 +5697,7 @@ Object.defineProperty(exports, 'addStackStateManager', { } }); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); Object.defineProperty(exports, 'loadHandlerManager', { enumerable: true, @@ -5544,7 +5706,7 @@ Object.defineProperty(exports, 'loadHandlerManager', { } }); -var _imageIdSpecificStateManager = __webpack_require__(16); +var _imageIdSpecificStateManager = __webpack_require__(18); Object.defineProperty(exports, 'newImageIdSpecificToolStateManager', { enumerable: true, @@ -5559,7 +5721,7 @@ Object.defineProperty(exports, 'globalImageIdSpecificToolStateManager', { } }); -var _frameOfReferenceStateManager = __webpack_require__(80); +var _frameOfReferenceStateManager = __webpack_require__(82); Object.defineProperty(exports, 'newFrameOfReferenceSpecificToolStateManager', { enumerable: true, @@ -5574,7 +5736,7 @@ Object.defineProperty(exports, 'globalFrameOfReferenceSpecificToolStateManager', } }); -var _appState = __webpack_require__(81); +var _appState = __webpack_require__(83); Object.defineProperty(exports, 'appState', { enumerable: true, @@ -5583,7 +5745,7 @@ Object.defineProperty(exports, 'appState', { } }); -var _stackScrollKeyboard = __webpack_require__(82); +var _stackScrollKeyboard = __webpack_require__(84); Object.defineProperty(exports, 'stackScrollKeyboard', { enumerable: true, @@ -5592,7 +5754,7 @@ Object.defineProperty(exports, 'stackScrollKeyboard', { } }); -var _stackScroll = __webpack_require__(44); +var _stackScroll = __webpack_require__(45); Object.defineProperty(exports, 'stackScroll', { enumerable: true, @@ -5619,7 +5781,7 @@ Object.defineProperty(exports, 'stackScrollMultiTouch', { } }); -var _stackPrefetch = __webpack_require__(83); +var _stackPrefetch = __webpack_require__(85); Object.defineProperty(exports, 'stackPrefetch', { enumerable: true, @@ -5628,7 +5790,7 @@ Object.defineProperty(exports, 'stackPrefetch', { } }); -var _scrollIndicator = __webpack_require__(84); +var _scrollIndicator = __webpack_require__(86); Object.defineProperty(exports, 'scrollIndicator', { enumerable: true, @@ -5637,7 +5799,7 @@ Object.defineProperty(exports, 'scrollIndicator', { } }); -var _stackRenderers = __webpack_require__(85); +var _stackRenderers = __webpack_require__(87); Object.defineProperty(exports, 'stackRenderers', { enumerable: true, @@ -5646,7 +5808,7 @@ Object.defineProperty(exports, 'stackRenderers', { } }); -var _playClip = __webpack_require__(87); +var _playClip = __webpack_require__(89); Object.defineProperty(exports, 'playClip', { enumerable: true, @@ -5661,7 +5823,7 @@ Object.defineProperty(exports, 'stopClip', { } }); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); Object.defineProperty(exports, 'anyHandlesOutsideImage', { enumerable: true, @@ -5670,7 +5832,7 @@ Object.defineProperty(exports, 'anyHandlesOutsideImage', { } }); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); Object.defineProperty(exports, 'drawHandles', { enumerable: true, @@ -5679,7 +5841,7 @@ Object.defineProperty(exports, 'drawHandles', { } }); -var _getHandleNearImagePoint = __webpack_require__(19); +var _getHandleNearImagePoint = __webpack_require__(21); Object.defineProperty(exports, 'getHandleNearImagePoint', { enumerable: true, @@ -5688,7 +5850,7 @@ Object.defineProperty(exports, 'getHandleNearImagePoint', { } }); -var _handleActivator = __webpack_require__(36); +var _handleActivator = __webpack_require__(38); Object.defineProperty(exports, 'handleActivator', { enumerable: true, @@ -5697,7 +5859,7 @@ Object.defineProperty(exports, 'handleActivator', { } }); -var _moveAllHandles = __webpack_require__(37); +var _moveAllHandles = __webpack_require__(39); Object.defineProperty(exports, 'moveAllHandles', { enumerable: true, @@ -5706,7 +5868,7 @@ Object.defineProperty(exports, 'moveAllHandles', { } }); -var _moveHandle = __webpack_require__(22); +var _moveHandle = __webpack_require__(24); Object.defineProperty(exports, 'moveHandle', { enumerable: true, @@ -5715,7 +5877,7 @@ Object.defineProperty(exports, 'moveHandle', { } }); -var _moveNewHandle = __webpack_require__(23); +var _moveNewHandle = __webpack_require__(25); Object.defineProperty(exports, 'moveNewHandle', { enumerable: true, @@ -5724,7 +5886,7 @@ Object.defineProperty(exports, 'moveNewHandle', { } }); -var _moveNewHandleTouch = __webpack_require__(25); +var _moveNewHandleTouch = __webpack_require__(27); Object.defineProperty(exports, 'moveNewHandleTouch', { enumerable: true, @@ -5733,7 +5895,7 @@ Object.defineProperty(exports, 'moveNewHandleTouch', { } }); -var _touchMoveAllHandles = __webpack_require__(51); +var _touchMoveAllHandles = __webpack_require__(52); Object.defineProperty(exports, 'touchMoveAllHandles', { enumerable: true, @@ -5742,7 +5904,7 @@ Object.defineProperty(exports, 'touchMoveAllHandles', { } }); -var _touchMoveHandle = __webpack_require__(52); +var _touchMoveHandle = __webpack_require__(53); Object.defineProperty(exports, 'touchMoveHandle', { enumerable: true, @@ -5751,7 +5913,7 @@ Object.defineProperty(exports, 'touchMoveHandle', { } }); -var _keyboardInput = __webpack_require__(88); +var _keyboardInput = __webpack_require__(90); Object.defineProperty(exports, 'keyboardInput', { enumerable: true, @@ -5760,7 +5922,7 @@ Object.defineProperty(exports, 'keyboardInput', { } }); -var _mouseInput = __webpack_require__(89); +var _mouseInput = __webpack_require__(91); Object.defineProperty(exports, 'mouseInput', { enumerable: true, @@ -5769,7 +5931,7 @@ Object.defineProperty(exports, 'mouseInput', { } }); -var _mouseWheelInput = __webpack_require__(90); +var _mouseWheelInput = __webpack_require__(92); Object.defineProperty(exports, 'mouseWheelInput', { enumerable: true, @@ -5778,7 +5940,7 @@ Object.defineProperty(exports, 'mouseWheelInput', { } }); -var _preventGhostClick = __webpack_require__(53); +var _preventGhostClick = __webpack_require__(54); Object.defineProperty(exports, 'preventGhostClick', { enumerable: true, @@ -5787,7 +5949,7 @@ Object.defineProperty(exports, 'preventGhostClick', { } }); -var _touchInput = __webpack_require__(91); +var _touchInput = __webpack_require__(93); Object.defineProperty(exports, 'touchInput', { enumerable: true, @@ -5796,7 +5958,7 @@ Object.defineProperty(exports, 'touchInput', { } }); -var _angleTool = __webpack_require__(92); +var _angleTool = __webpack_require__(94); Object.defineProperty(exports, 'angle', { enumerable: true, @@ -5811,7 +5973,7 @@ Object.defineProperty(exports, 'angleTouch', { } }); -var _arrowAnnotate = __webpack_require__(93); +var _arrowAnnotate = __webpack_require__(95); Object.defineProperty(exports, 'arrowAnnotate', { enumerable: true, @@ -5826,7 +5988,7 @@ Object.defineProperty(exports, 'arrowAnnotateTouch', { } }); -var _crosshairs = __webpack_require__(94); +var _crosshairs = __webpack_require__(96); Object.defineProperty(exports, 'crosshairs', { enumerable: true, @@ -5841,7 +6003,7 @@ Object.defineProperty(exports, 'crosshairsTouch', { } }); -var _displayTool = __webpack_require__(24); +var _displayTool = __webpack_require__(26); Object.defineProperty(exports, 'displayTool', { enumerable: true, @@ -5850,7 +6012,7 @@ Object.defineProperty(exports, 'displayTool', { } }); -var _doubleTapTool = __webpack_require__(54); +var _doubleTapTool = __webpack_require__(55); Object.defineProperty(exports, 'doubleTapTool', { enumerable: true, @@ -5859,7 +6021,7 @@ Object.defineProperty(exports, 'doubleTapTool', { } }); -var _doubleTapZoom = __webpack_require__(95); +var _doubleTapZoom = __webpack_require__(97); Object.defineProperty(exports, 'doubleTapZoom', { enumerable: true, @@ -5868,7 +6030,7 @@ Object.defineProperty(exports, 'doubleTapZoom', { } }); -var _dragProbe = __webpack_require__(96); +var _dragProbe = __webpack_require__(98); Object.defineProperty(exports, 'dragProbe', { enumerable: true, @@ -5883,7 +6045,7 @@ Object.defineProperty(exports, 'dragProbeTouch', { } }); -var _ellipticalRoi = __webpack_require__(97); +var _ellipticalRoi = __webpack_require__(99); Object.defineProperty(exports, 'ellipticalRoi', { enumerable: true, @@ -5898,7 +6060,7 @@ Object.defineProperty(exports, 'ellipticalRoiTouch', { } }); -var _freehand = __webpack_require__(98); +var _freehand = __webpack_require__(100); Object.defineProperty(exports, 'freehand', { enumerable: true, @@ -5907,7 +6069,7 @@ Object.defineProperty(exports, 'freehand', { } }); -var _highlight = __webpack_require__(99); +var _highlight = __webpack_require__(101); Object.defineProperty(exports, 'highlight', { enumerable: true, @@ -5922,7 +6084,7 @@ Object.defineProperty(exports, 'highlightTouch', { } }); -var _imageStats = __webpack_require__(100); +var _imageStats = __webpack_require__(102); Object.defineProperty(exports, 'imageStats', { enumerable: true, @@ -5931,7 +6093,7 @@ Object.defineProperty(exports, 'imageStats', { } }); -var _keyboardTool = __webpack_require__(50); +var _keyboardTool = __webpack_require__(51); Object.defineProperty(exports, 'keyboardTool', { enumerable: true, @@ -5940,7 +6102,7 @@ Object.defineProperty(exports, 'keyboardTool', { } }); -var _length = __webpack_require__(101); +var _length = __webpack_require__(103); Object.defineProperty(exports, 'length', { enumerable: true, @@ -5955,7 +6117,7 @@ Object.defineProperty(exports, 'lengthTouch', { } }); -var _magnify = __webpack_require__(102); +var _magnify = __webpack_require__(104); Object.defineProperty(exports, 'magnify', { enumerable: true, @@ -5970,7 +6132,7 @@ Object.defineProperty(exports, 'magnifyTouchDrag', { } }); -var _mouseButtonRectangleTool = __webpack_require__(55); +var _mouseButtonRectangleTool = __webpack_require__(56); Object.defineProperty(exports, 'mouseButtonRectangleTool', { enumerable: true, @@ -5979,7 +6141,7 @@ Object.defineProperty(exports, 'mouseButtonRectangleTool', { } }); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); Object.defineProperty(exports, 'mouseButtonTool', { enumerable: true, @@ -5988,7 +6150,7 @@ Object.defineProperty(exports, 'mouseButtonTool', { } }); -var _mouseWheelTool = __webpack_require__(21); +var _mouseWheelTool = __webpack_require__(23); Object.defineProperty(exports, 'mouseWheelTool', { enumerable: true, @@ -5997,7 +6159,7 @@ Object.defineProperty(exports, 'mouseWheelTool', { } }); -var _multiTouchDragTool = __webpack_require__(28); +var _multiTouchDragTool = __webpack_require__(30); Object.defineProperty(exports, 'multiTouchDragTool', { enumerable: true, @@ -6006,7 +6168,7 @@ Object.defineProperty(exports, 'multiTouchDragTool', { } }); -var _orientationMarkers = __webpack_require__(103); +var _orientationMarkers = __webpack_require__(105); Object.defineProperty(exports, 'orientationMarkers', { enumerable: true, @@ -6015,7 +6177,7 @@ Object.defineProperty(exports, 'orientationMarkers', { } }); -var _pan = __webpack_require__(104); +var _pan = __webpack_require__(106); Object.defineProperty(exports, 'pan', { enumerable: true, @@ -6030,7 +6192,7 @@ Object.defineProperty(exports, 'panTouchDrag', { } }); -var _panMultiTouch = __webpack_require__(105); +var _panMultiTouch = __webpack_require__(107); Object.defineProperty(exports, 'panMultiTouch', { enumerable: true, @@ -6039,7 +6201,7 @@ Object.defineProperty(exports, 'panMultiTouch', { } }); -var _probe = __webpack_require__(106); +var _probe = __webpack_require__(108); Object.defineProperty(exports, 'probe', { enumerable: true, @@ -6054,7 +6216,7 @@ Object.defineProperty(exports, 'probeTouch', { } }); -var _rectangleRoi = __webpack_require__(107); +var _rectangleRoi = __webpack_require__(109); Object.defineProperty(exports, 'rectangleRoi', { enumerable: true, @@ -6069,7 +6231,7 @@ Object.defineProperty(exports, 'rectangleRoiTouch', { } }); -var _rotate = __webpack_require__(108); +var _rotate = __webpack_require__(110); Object.defineProperty(exports, 'rotate', { enumerable: true, @@ -6084,7 +6246,7 @@ Object.defineProperty(exports, 'rotateTouchDrag', { } }); -var _rotateTouch = __webpack_require__(109); +var _rotateTouch = __webpack_require__(111); Object.defineProperty(exports, 'rotateTouch', { enumerable: true, @@ -6093,7 +6255,7 @@ Object.defineProperty(exports, 'rotateTouch', { } }); -var _saveAs = __webpack_require__(110); +var _saveAs = __webpack_require__(112); Object.defineProperty(exports, 'saveAs', { enumerable: true, @@ -6102,7 +6264,7 @@ Object.defineProperty(exports, 'saveAs', { } }); -var _seedAnnotate = __webpack_require__(111); +var _seedAnnotate = __webpack_require__(113); Object.defineProperty(exports, 'seedAnnotate', { enumerable: true, @@ -6117,7 +6279,7 @@ Object.defineProperty(exports, 'seedAnnotateTouch', { } }); -var _simpleAngle = __webpack_require__(112); +var _simpleAngle = __webpack_require__(114); Object.defineProperty(exports, 'simpleAngle', { enumerable: true, @@ -6132,7 +6294,7 @@ Object.defineProperty(exports, 'simpleAngleTouch', { } }); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); Object.defineProperty(exports, 'simpleMouseButtonTool', { enumerable: true, @@ -6141,7 +6303,7 @@ Object.defineProperty(exports, 'simpleMouseButtonTool', { } }); -var _textMarker = __webpack_require__(113); +var _textMarker = __webpack_require__(115); Object.defineProperty(exports, 'textMarker', { enumerable: true, @@ -6156,7 +6318,7 @@ Object.defineProperty(exports, 'textMarkerTouch', { } }); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); Object.defineProperty(exports, 'touchDragTool', { enumerable: true, @@ -6165,7 +6327,7 @@ Object.defineProperty(exports, 'touchDragTool', { } }); -var _touchPinchTool = __webpack_require__(56); +var _touchPinchTool = __webpack_require__(57); Object.defineProperty(exports, 'touchPinchTool', { enumerable: true, @@ -6174,7 +6336,7 @@ Object.defineProperty(exports, 'touchPinchTool', { } }); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); Object.defineProperty(exports, 'touchTool', { enumerable: true, @@ -6183,7 +6345,7 @@ Object.defineProperty(exports, 'touchTool', { } }); -var _wwwc = __webpack_require__(114); +var _wwwc = __webpack_require__(116); Object.defineProperty(exports, 'wwwc', { enumerable: true, @@ -6198,7 +6360,7 @@ Object.defineProperty(exports, 'wwwcTouchDrag', { } }); -var _wwwcRegion = __webpack_require__(115); +var _wwwcRegion = __webpack_require__(117); Object.defineProperty(exports, 'wwwcRegion', { enumerable: true, @@ -6213,7 +6375,7 @@ Object.defineProperty(exports, 'wwwcRegionTouch', { } }); -var _zoom = __webpack_require__(116); +var _zoom = __webpack_require__(118); Object.defineProperty(exports, 'zoom', { enumerable: true, @@ -6240,7 +6402,7 @@ Object.defineProperty(exports, 'zoomTouchDrag', { } }); -var _brush = __webpack_require__(117); +var _brush = __webpack_require__(119); Object.defineProperty(exports, 'brush', { enumerable: true, @@ -6249,7 +6411,7 @@ Object.defineProperty(exports, 'brush', { } }); -var _adaptiveBrush = __webpack_require__(118); +var _adaptiveBrush = __webpack_require__(120); Object.defineProperty(exports, 'adaptiveBrush', { enumerable: true, @@ -6258,7 +6420,7 @@ Object.defineProperty(exports, 'adaptiveBrush', { } }); -var _version = __webpack_require__(119); +var _version = __webpack_require__(121); Object.defineProperty(exports, 'version', { enumerable: true, @@ -6270,7 +6432,7 @@ Object.defineProperty(exports, 'version', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 61 */ +/* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6280,15 +6442,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _calculateReferenceLine = __webpack_require__(39); +var _calculateReferenceLine = __webpack_require__(41); var _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine); -var _referenceLinesTool = __webpack_require__(62); +var _referenceLinesTool = __webpack_require__(63); var _referenceLinesTool2 = _interopRequireDefault(_referenceLinesTool); -var _renderActiveReferenceLine = __webpack_require__(40); +var _renderActiveReferenceLine = __webpack_require__(42); var _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine); @@ -6303,7 +6465,7 @@ var referenceLines = { exports.default = referenceLines; /***/ }), -/* 62 */ +/* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6313,13 +6475,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _renderActiveReferenceLine = __webpack_require__(40); +var _renderActiveReferenceLine = __webpack_require__(42); var _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine); @@ -6371,14 +6537,14 @@ function enable(element, synchronizationContext, renderer) { renderer: renderer }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Disables the reference line tool for the given element function disable(element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } @@ -6391,7 +6557,7 @@ var tool = { exports.default = tool; /***/ }), -/* 63 */ +/* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6437,14 +6603,14 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 64 */ +/* 65 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6468,7 +6634,7 @@ exports.default = function (string) { }; /***/ }), -/* 65 */ +/* 66 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6478,32 +6644,69 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = function (enabledElement, context, fontSize) { + var fontScale = 0.1; + + _externalModules2.default.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale); + // Return the font size to use + var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale; + // TODO: actually calculate this? + var lineHeight = fontSize / enabledElement.viewport.scale / fontScale; + + return { + fontSize: scaledFontSize, + lineHeight: lineHeight, + fontScale: fontScale + }; +}; + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; -var _drawHandles = __webpack_require__(8); -var _drawHandles2 = _interopRequireDefault(_drawHandles); +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _externalModules = __webpack_require__(0); + +var _externalModules2 = _interopRequireDefault(_externalModules); + +var _mouseButtonTool = __webpack_require__(9); -var _setContextToDisplayFontSize = __webpack_require__(42); +var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); + +var _drawHandles = __webpack_require__(10); -var _setContextToDisplayFontSize2 = _interopRequireDefault(_setContextToDisplayFontSize); +var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _measurementManager = __webpack_require__(66); +var _measurementManager = __webpack_require__(68); var _measurementManager2 = _interopRequireDefault(_measurementManager); -var _lineSampleMeasurement = __webpack_require__(67); +var _lineSampleMeasurement = __webpack_require__(69); var _lineSampleMeasurement2 = _interopRequireDefault(_lineSampleMeasurement); +var _textStyle = __webpack_require__(14); + +var _textStyle2 = _interopRequireDefault(_textStyle); + +var _drawTextBox = __webpack_require__(7); + +var _drawTextBox2 = _interopRequireDefault(_drawTextBox); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var toolType = 'probe4D'; @@ -6566,7 +6769,9 @@ function createNewMeasurement(mouseEventData) { // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var cornerstone = _externalModules2.default.cornerstone; + var eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -6575,10 +6780,12 @@ function onImageRendered(e, eventData) { } // We have tool data for this element - iterate over each one and draw it - var context = eventData.canvasContext.canvas.getContext('2d'); + var context = eventData.canvasContext; + + context.setTransform(1, 0, 0, 1, 0, 0); - _externalModules2.default.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context); var color = 'white'; + var font = _textStyle2.default.getFont(); for (var i = 0; i < toolData.data.length; i++) { context.save(); @@ -6589,20 +6796,19 @@ function onImageRendered(e, eventData) { (0, _drawHandles2.default)(context, eventData, data.handles, color); context.stroke(); - // Draw text - var fontParameters = (0, _setContextToDisplayFontSize2.default)(eventData.enabledElement, eventData.canvasContext, 15); + context.font = font; - context.font = fontParameters.fontSize + 'px Arial'; + var coords = { + // Translate the x/y away from the cursor + x: data.handles.end.x + 3, + y: data.handles.end.y - 3 + }; - // Translate the x/y away from the cursor - var x = Math.round(data.handles.end.x); - var y = Math.round(data.handles.end.y); - var textX = data.handles.end.x + 3; - var textY = data.handles.end.y - 3; + var textCoords = cornerstone.pixelToCanvas(eventData.element, coords); context.fillStyle = color; - context.fillText(x + ',' + y, textX, textY); + (0, _drawTextBox2.default)(context, data.handles.end.x + ', ' + data.handles.end.y, textCoords.x, textCoords.y, color); context.restore(); } @@ -6619,7 +6825,7 @@ var probeTool4D = (0, _mouseButtonTool2.default)({ exports.default = probeTool4D; /***/ }), -/* 66 */ +/* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6629,7 +6835,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _triggerEvent = __webpack_require__(3); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + +var _externalModules = __webpack_require__(0); + +var _externalModules2 = _interopRequireDefault(_externalModules); + +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -6637,6 +6851,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de // This object manages a collection of measurements function MeasurementManager() { + var cornerstone = _externalModules2.default.cornerstone; var that = this; that.measurements = []; @@ -6650,7 +6865,7 @@ function MeasurementManager() { measurement: measurement }; - (0, _triggerEvent2.default)(that, 'CornerstoneMeasurementAdded', eventDetail); + (0, _triggerEvent2.default)(cornerstone.events, _events2.default.MEASUREMENT_ADDED, eventDetail); }; this.remove = function (index) { @@ -6663,7 +6878,7 @@ function MeasurementManager() { measurement: measurement }; - (0, _triggerEvent2.default)(that, 'CornerstoneMeasurementRemoved', eventDetail); + (0, _triggerEvent2.default)(cornerstone.events, _events2.default.MEASUREMENT_REMOVED, eventDetail); }; } @@ -6673,7 +6888,7 @@ var manager = new MeasurementManager(); exports.default = manager; /***/ }), -/* 67 */ +/* 69 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6684,27 +6899,34 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = function () { - + var cornerstone = _externalModules2.default.cornerstone; var that = this; that.samples = []; - // Adds an element as both a source and a target this.set = function (samples) { that.samples = samples; // Fire event - (0, _triggerEvent2.default)(that, 'CornerstoneLineSampleUpdated'); + (0, _triggerEvent2.default)(cornerstone.events, _events2.default.LINE_SAMPLE_UPDATED); }; }; -var _triggerEvent = __webpack_require__(3); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + +var _externalModules = __webpack_require__(0); + +var _externalModules2 = _interopRequireDefault(_externalModules); + +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 68 */ +/* 70 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6714,9 +6936,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _incrementTimePoint = __webpack_require__(38); +var _incrementTimePoint = __webpack_require__(40); var _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint); @@ -6802,7 +7024,7 @@ var timeSeriesPlayer = { exports.default = timeSeriesPlayer; /***/ }), -/* 69 */ +/* 71 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6813,58 +7035,70 @@ Object.defineProperty(exports, "__esModule", { }); exports.timeSeriesScrollTouchDrag = exports.timeSeriesScrollWheel = exports.timeSeriesScroll = undefined; -var _externalModules = __webpack_require__(0); +var _events = __webpack_require__(1); -var _externalModules2 = _interopRequireDefault(_externalModules); +var _events2 = _interopRequireDefault(_events); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); -var _mouseWheelTool = __webpack_require__(21); +var _mouseWheelTool = __webpack_require__(23); var _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool); -var _incrementTimePoint = __webpack_require__(38); +var _incrementTimePoint = __webpack_require__(40); var _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +var toolType = 'timeSeriesScroll'; + +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - var mouseDragEventData = { - deltaY: 0, - options: e.data.options - }; + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + options.deltaY = 0; + + (0, _enabledElementTools.setToolOptions)(toolType, element, options); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, mouseDragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); e.stopImmediatePropagation(); return false; } } -function mouseDragCallback(e, eventData) { +function mouseDragCallback(e) { + var eventData = e.detail; + var element = eventData.element; + e.data.deltaY += eventData.deltaPoints.page.y; var toolData = (0, _toolState.getToolState)(eventData.element, 'timeSeries'); @@ -6875,7 +7109,7 @@ function mouseDragCallback(e, eventData) { var timeSeriesData = toolData.data[0]; - var pixelsPerTimeSeries = _externalModules2.default.$(eventData.element).height() / timeSeriesData.stacks.length; + var pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length; if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) { pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed; @@ -6892,7 +7126,8 @@ function mouseDragCallback(e, eventData) { return false; // False = cases jquery to preventDefault() and stopPropagation() this event } -function mouseWheelCallback(e, eventData) { +function mouseWheelCallback(e) { + var eventData = e.detail; var images = -eventData.direction; (0, _incrementTimePoint2.default)(eventData.element, images); @@ -6924,7 +7159,7 @@ function onDrag(e) { } // Module/private exports -var timeSeriesScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var timeSeriesScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); var timeSeriesScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback); var timeSeriesScrollTouchDrag = (0, _touchDragTool2.default)(onDrag); @@ -6933,7 +7168,7 @@ exports.timeSeriesScrollWheel = timeSeriesScrollWheel; exports.timeSeriesScrollTouchDrag = timeSeriesScrollTouchDrag; /***/ }), -/* 70 */ +/* 72 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6974,7 +7209,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 71 */ +/* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7001,7 +7236,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 72 */ +/* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7011,16 +7246,26 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function unique(array) { + return array.filter(function (value, index, self) { + return self.indexOf(value) === index; + }); +} + // This object is responsible for synchronizing target elements when an event fires on a source // Element function Synchronizer(event, handler) { @@ -7151,7 +7396,9 @@ function Synchronizer(event, handler) { ignoreFiredEvents = false; } - function onEvent(e, eventData) { + function onEvent(e) { + var eventData = e.detail; + if (ignoreFiredEvents === true) { return; } @@ -7172,7 +7419,7 @@ function Synchronizer(event, handler) { sourceElements.push(element); // Subscribe to the event - _externalModules2.default.$(element).on(event, onEvent); + element.addEventListener(event, onEvent); // Update the initial distances between elements that.getDistances(); @@ -7220,7 +7467,7 @@ function Synchronizer(event, handler) { sourceElements.splice(index, 1); // Stop listening for the event - _externalModules2.default.$(element).off(event, onEvent); + element.removeEventListener(event, onEvent); // Update the initial distances between elements that.getDistances(); @@ -7285,16 +7532,16 @@ function Synchronizer(event, handler) { } this.updateDisableHandlers = function () { - var elements = _externalModules2.default.$.unique(sourceElements.concat(targetElements)); + var elements = unique(sourceElements.concat(targetElements)); elements.forEach(function (element) { - element.removeEventListener('cornerstoneelementdisabled', disableHandler); - element.addEventListener('cornerstoneelementdisabled', disableHandler); + element.removeEventListener(_events2.default.ELEMENT_DISABLED, disableHandler); + element.addEventListener(_events2.default.ELEMENT_DISABLED, disableHandler); }); }; this.destroy = function () { - var elements = _externalModules2.default.$.unique(sourceElements.concat(targetElements)); + var elements = unique(sourceElements.concat(targetElements)); elements.forEach(function (element) { that.remove(element); @@ -7305,7 +7552,7 @@ function Synchronizer(event, handler) { exports.default = Synchronizer; /***/ }), -/* 73 */ +/* 75 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7379,16 +7626,16 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 74 */ +/* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7484,20 +7731,20 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 75 */ +/* 77 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7583,20 +7830,20 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 76 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7666,16 +7913,16 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 77 */ +/* 79 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7716,7 +7963,7 @@ var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 78 */ +/* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7727,9 +7974,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.newTimeSeriesSpecificToolStateManager = exports.addTimeSeriesStateManager = undefined; -var _imageIdSpecificStateManager = __webpack_require__(16); +var _imageIdSpecificStateManager = __webpack_require__(18); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); // This implements an Stack specific tool state management strategy. This means // That tool data is shared between all imageIds in a given stack @@ -7806,7 +8053,7 @@ exports.addTimeSeriesStateManager = addTimeSeriesStateManager; exports.newTimeSeriesSpecificToolStateManager = newTimeSeriesSpecificToolStateManager; /***/ }), -/* 79 */ +/* 81 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7817,9 +8064,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.addStackStateManager = exports.newStackSpecificToolStateManager = exports.stackSpecificStateManager = undefined; -var _imageIdSpecificStateManager = __webpack_require__(16); +var _imageIdSpecificStateManager = __webpack_require__(18); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); // This implements an Stack specific tool state management strategy. This means // That tool data is shared between all imageIds in a given stack @@ -7918,7 +8165,7 @@ exports.newStackSpecificToolStateManager = newStackSpecificToolStateManager; exports.addStackStateManager = addStackStateManager; /***/ }), -/* 80 */ +/* 82 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8020,7 +8267,7 @@ exports.newFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecifi exports.globalFrameOfReferenceSpecificToolStateManager = globalFrameOfReferenceSpecificToolStateManager; /***/ }), -/* 81 */ +/* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8034,9 +8281,9 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _imageIdSpecificStateManager = __webpack_require__(16); +var _imageIdSpecificStateManager = __webpack_require__(18); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -8114,7 +8361,7 @@ var appState = { exports.default = appState; /***/ }), -/* 82 */ +/* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8124,11 +8371,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _scroll = __webpack_require__(29); +var _scroll = __webpack_require__(31); var _scroll2 = _interopRequireDefault(_scroll); -var _keyboardTool = __webpack_require__(50); +var _keyboardTool = __webpack_require__(51); var _keyboardTool2 = _interopRequireDefault(_keyboardTool); @@ -8139,7 +8386,8 @@ var keys = { DOWN: 40 }; -function keyDownCallback(e, eventData) { +function keyDownCallback(e) { + var eventData = e.detail; var keyCode = eventData.keyCode; if (keyCode !== keys.UP && keyCode !== keys.DOWN) { @@ -8161,7 +8409,7 @@ var stackScrollKeyboard = (0, _keyboardTool2.default)(keyDownCallback); exports.default = stackScrollKeyboard; /***/ }), -/* 83 */ +/* 85 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8171,21 +8419,25 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _requestPoolManager = __webpack_require__(27); +var _requestPoolManager = __webpack_require__(29); var _requestPoolManager2 = _interopRequireDefault(_requestPoolManager); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _getMaxSimultaneousRequests = __webpack_require__(20); +var _getMaxSimultaneousRequests = __webpack_require__(22); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -8301,9 +8553,9 @@ function prefetch(element) { return; } - var imagePromise = _externalModules2.default.cornerstone.imageCache.getImagePromise(imageId); + var imageLoadObject = _externalModules2.default.cornerstone.imageCache.getImageLoadObject(imageId); - if (imagePromise && imagePromise.state() === 'resolved') { + if (imageLoadObject) { removeFromList(imageIdIndex); } }); @@ -8469,22 +8721,22 @@ function enable(element) { prefetch(element); - element.removeEventListener('cornerstonenewimage', onImageUpdated); - element.addEventListener('cornerstonenewimage', onImageUpdated); + element.removeEventListener(_events2.default.NEW_IMAGE, onImageUpdated); + element.addEventListener(_events2.default.NEW_IMAGE, onImageUpdated); var promiseRemovedHandler = getPromiseRemovedHandler(element); - _externalModules2.default.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler); - _externalModules2.default.cornerstone.events.addEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler); + _externalModules2.default.cornerstone.events.removeEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); + _externalModules2.default.cornerstone.events.addEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); } function disable(element) { clearTimeout(resetPrefetchTimeout); - element.removeEventListener('cornerstonenewimage', onImageUpdated); + element.removeEventListener(_events2.default.NEW_IMAGE, onImageUpdated); var promiseRemovedHandler = getPromiseRemovedHandler(element); - _externalModules2.default.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler); + _externalModules2.default.cornerstone.events.removeEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); var stackPrefetchData = (0, _toolState.getToolState)(element, toolType); // If there is actually something to disable, disable it @@ -8520,7 +8772,7 @@ var stackPrefetch = { exports.default = stackPrefetch; /***/ }), -/* 84 */ +/* 86 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8530,11 +8782,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _displayTool = __webpack_require__(24); +var _displayTool = __webpack_require__(26); var _displayTool2 = _interopRequireDefault(_displayTool); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -8549,7 +8801,8 @@ var configuration = { orientation: 'horizontal' }; -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; var element = eventData.element; var width = eventData.enabledElement.canvas.width; var height = eventData.enabledElement.canvas.height; @@ -8606,7 +8859,7 @@ scrollIndicator.setConfiguration(configuration); exports.default = scrollIndicator; /***/ }), -/* 85 */ +/* 87 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8616,7 +8869,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _fusionRenderer = __webpack_require__(86); +var _fusionRenderer = __webpack_require__(88); var _fusionRenderer2 = _interopRequireDefault(_fusionRenderer); @@ -8629,7 +8882,7 @@ stackRenderers.FusionRenderer = _fusionRenderer2.default; exports.default = stackRenderers; /***/ }), -/* 86 */ +/* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8645,7 +8898,7 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -8743,7 +8996,7 @@ var FusionRenderer = function () { exports.default = FusionRenderer; /***/ }), -/* 87 */ +/* 89 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8754,23 +9007,26 @@ Object.defineProperty(exports, "__esModule", { }); exports.stopClip = exports.playClip = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -/* eslint no-bitwise:0 */ var toolType = 'playClip'; /** @@ -8780,6 +9036,7 @@ var toolType = 'playClip'; * @param {Number} speed A speed factor which will be applied to each element of the resulting array. * @return {Array} An array with timeouts for each animation frame. */ +/* eslint no-bitwise:0 */ function getPlayClipTimeouts(vector, speed) { var i = void 0; @@ -8852,7 +9109,7 @@ function triggerStopEvent(element) { element: element }; - (0, _triggerEvent2.default)(element, 'CornerstoneToolsClipStopped', eventDetail); + (0, _triggerEvent2.default)(element, _events2.default.CLIP_STOPPED, eventDetail); } /** @@ -9034,7 +9291,7 @@ exports.playClip = playClip; exports.stopClip = stopClip; /***/ }), -/* 88 */ +/* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9044,11 +9301,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -9080,33 +9341,37 @@ function keyPress(e) { keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image); var keyPressEvents = { - keydown: 'CornerstoneToolsKeyDown', - keypress: 'CornerstoneToolsKeyPress', - keyup: 'CornerstoneToolsKeyUp' - + keydown: _events2.default.KEY_DOWN, + keypress: _events2.default.KEY_PRESS, + keyup: _events2.default.KEY_UP }; (0, _triggerEvent2.default)(element, keyPressEvents[e.type], keyPressData); } function mouseMove(e) { - mouseX = e.pageX || e.originalEvent.pageX; - mouseY = e.pageY || e.originalEvent.pageY; + mouseX = e.pageX; + mouseY = e.pageY; } -var keyboardEvent = 'keydown keypress keyup'; +var keyboardEvents = ['keydown', 'keypress', 'keyup']; function enable(element) { - // Prevent handlers from being attached multiple times - disable(element); + keyboardEvents.forEach(function (eventType) { + element.removeEventListener(eventType, keyPress); + element.addEventListener(eventType, keyPress); + }); - _externalModules2.default.$(element).on(keyboardEvent, keyPress); - _externalModules2.default.$(element).on('mousemove', mouseMove); + element.removeEventListener('mousemove', mouseMove); + element.addEventListener('mousemove', mouseMove); } function disable(element) { - _externalModules2.default.$(element).off(keyboardEvent, keyPress); - _externalModules2.default.$(element).off('mousemove', mouseMove); + keyboardEvents.forEach(function (eventType) { + element.removeEventListener(eventType, keyPress); + }); + + element.removeEventListener('mousemove', mouseMove); } // Module exports @@ -9118,7 +9383,7 @@ var keyboardInput = { exports.default = keyboardInput; /***/ }), -/* 89 */ +/* 91 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9128,19 +9393,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _copyPoints = __webpack_require__(34); +var _copyPoints = __webpack_require__(36); var _copyPoints2 = _interopRequireDefault(_copyPoints); -var _pauseEvent = __webpack_require__(32); +var _pauseEvent = __webpack_require__(34); var _pauseEvent2 = _interopRequireDefault(_pauseEvent); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -9175,7 +9444,7 @@ function preventClickHandler() { function mouseDoubleClick(e) { var cornerstone = _externalModules2.default.cornerstone; var element = e.currentTarget; - var eventType = 'CornerstoneToolsMouseDoubleClick'; + var eventType = _events2.default.MOUSE_DOUBLE_CLICK; var startPoints = { page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e), @@ -9189,9 +9458,15 @@ function mouseDoubleClick(e) { startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); var lastPoints = (0, _copyPoints2.default)(startPoints); + + /* Note: It seems we can't trust MouseEvent.buttons for dblclick events? + For some reason they are always firing with e.buttons = 0 + so we have to use e.which for now instead. + Might be related to using preventDefault on the original mousedown or click events? + */ var eventData = { event: e, - which: getEventWhich(e), + which: e.which, viewport: cornerstone.getViewport(element), image: cornerstone.getEnabledElement(element).image, element: element, @@ -9205,7 +9480,7 @@ function mouseDoubleClick(e) { type: eventType }; - (0, _triggerEvent2.default)(eventData.element, eventType, eventData); + (0, _triggerEvent2.default)(element, eventType, eventData); } function mouseDown(e) { @@ -9213,10 +9488,10 @@ function mouseDown(e) { var cornerstone = _externalModules2.default.cornerstone; var element = e.currentTarget; - var eventType = 'CornerstoneToolsMouseDown'; + var eventType = _events2.default.MOUSE_DOWN; // Prevent CornerstoneToolsMouseMove while mouse is down - _externalModules2.default.$(element).off('mousemove', mouseMove); + element.removeEventListener('mousemove', mouseMove); var startPoints = { page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e), @@ -9250,15 +9525,15 @@ function mouseDown(e) { if (eventPropagated) { // No tools responded to this event, create a new tool - eventData.type = 'CornerstoneToolsMouseDownActivate'; - (0, _triggerEvent2.default)(eventData.element, 'CornerstoneToolsMouseDownActivate', eventData); + eventData.type = _events2.default.MOUSE_DOWN_ACTIVATE; + (0, _triggerEvent2.default)(eventData.element, _events2.default.MOUSE_DOWN_ACTIVATE, eventData); } var whichMouseButton = getEventWhich(e); function onMouseMove(e) { // Calculate our current points in page and image coordinates - var eventType = 'CornerstoneToolsMouseDrag'; + var eventType = _events2.default.MOUSE_DRAG; var currentPoints = { page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e), image: cornerstone.pageToPixel(element, e.pageX, e.pageY), @@ -9308,10 +9583,10 @@ function mouseDown(e) { // Cancel the timeout preventing the click event from triggering clearTimeout(preventClickTimeout); - var eventType = 'CornerstoneToolsMouseUp'; + var eventType = _events2.default.MOUSE_UP; if (isClickEvent) { - eventType = 'CornerstoneToolsMouseClick'; + eventType = _events2.default.MOUSE_CLICK; } // Calculate our current points in page and image coordinates @@ -9349,16 +9624,16 @@ function mouseDown(e) { (0, _triggerEvent2.default)(eventData.element, eventType, eventData); - _externalModules2.default.$(document).off('mousemove', onMouseMove); - _externalModules2.default.$(document).off('mouseup', onMouseUp); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); - _externalModules2.default.$(eventData.element).on('mousemove', mouseMove); + element.addEventListener('mousemove', mouseMove); isClickEvent = true; } - _externalModules2.default.$(document).on('mousemove', onMouseMove); - _externalModules2.default.$(document).on('mouseup', onMouseUp); + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); return (0, _pauseEvent2.default)(e); } @@ -9366,7 +9641,7 @@ function mouseDown(e) { function mouseMove(e) { var cornerstone = _externalModules2.default.cornerstone; var element = e.currentTarget; - var eventType = 'CornerstoneToolsMouseMove'; + var eventType = _events2.default.MOUSE_MOVE; var startPoints = { page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e), @@ -9381,8 +9656,6 @@ function mouseMove(e) { var lastPoints = (0, _copyPoints2.default)(startPoints); - var whichMouseButton = getEventWhich(e); - // Calculate our current points in page and image coordinates var currentPoints = { page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e), @@ -9404,7 +9677,6 @@ function mouseMove(e) { }; var eventData = { - which: whichMouseButton, viewport: cornerstone.getViewport(element), image: cornerstone.getEnabledElement(element).image, element: element, @@ -9422,18 +9694,18 @@ function mouseMove(e) { } function disable(element) { - _externalModules2.default.$(element).off('mousedown', mouseDown); - _externalModules2.default.$(element).off('mousemove', mouseMove); - _externalModules2.default.$(element).off('dblclick', mouseDoubleClick); + element.removeEventListener('mousedown', mouseDown); + element.removeEventListener('mousemove', mouseMove); + element.removeEventListener('dblclick', mouseDoubleClick); } function enable(element) { // Prevent handlers from being attached multiple times disable(element); - _externalModules2.default.$(element).on('mousedown', mouseDown); - _externalModules2.default.$(element).on('mousemove', mouseMove); - _externalModules2.default.$(element).on('dblclick', mouseDoubleClick); + element.addEventListener('mousedown', mouseDown); + element.addEventListener('mousemove', mouseMove); + element.addEventListener('dblclick', mouseDoubleClick); } // Module exports @@ -9445,7 +9717,7 @@ var mouseInput = { exports.default = mouseInput; /***/ }), -/* 90 */ +/* 92 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9455,11 +9727,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); @@ -9471,11 +9747,11 @@ function mouseWheel(e) { // Mac os x mavericks system when middle mouse button dragging. // I couldn't find any info about this so this might break other systems // Webkit hack - if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) { + if (e.type === 'mousewheel' && e.wheelDeltaY === 0) { return; } // Firefox hack - if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) { + if (e.type === 'DOMMouseScroll' && e.axis === 1) { return; } @@ -9490,9 +9766,6 @@ function mouseWheel(e) { if (e.pageX !== undefined && e.pageY !== undefined) { x = e.pageX; y = e.pageY; - } else if (e.originalEvent && e.originalEvent.pageX !== undefined && e.originalEvent.pageY !== undefined) { - x = e.originalEvent.pageX; - y = e.originalEvent.pageY; } else { // IE9 & IE10 x = e.x; @@ -9505,12 +9778,12 @@ function mouseWheel(e) { var wheelDelta = void 0; - if (e.originalEvent && e.originalEvent.wheelDelta) { - wheelDelta = -e.originalEvent.wheelDelta; - } else if (e.originalEvent && e.originalEvent.deltaY) { - wheelDelta = -e.originalEvent.deltaY; - } else if (e.originalEvent && e.originalEvent.detail) { - wheelDelta = -e.originalEvent.detail; + if (e.wheelDelta) { + wheelDelta = -e.wheelDelta; + } else if (e.deltaY) { + wheelDelta = -e.deltaY; + } else if (e.detail) { + wheelDelta = -e.detail; } else { wheelDelta = e.wheelDelta; } @@ -9528,20 +9801,24 @@ function mouseWheel(e) { imageY: startingCoords.y }; - (0, _triggerEvent2.default)(element, 'CornerstoneToolsMouseWheel', mouseWheelData); + (0, _triggerEvent2.default)(element, _events2.default.MOUSE_WHEEL, mouseWheelData); } -var mouseWheelEvents = 'mousewheel DOMMouseScroll'; +var mouseWheelEvents = ['mousewheel', 'DOMMouseScroll']; function enable(element) { // Prevent handlers from being attached multiple times disable(element); - _externalModules2.default.$(element).on(mouseWheelEvents, mouseWheel); + mouseWheelEvents.forEach(function (eventType) { + element.addEventListener(eventType, mouseWheel); + }); } function disable(element) { - _externalModules2.default.$(element).unbind(mouseWheelEvents, mouseWheel); + mouseWheelEvents.forEach(function (eventType) { + element.removeEventListener(eventType, mouseWheel); + }); } // Module exports @@ -9553,7 +9830,7 @@ var mouseWheelInput = { exports.default = mouseWheelInput; /***/ }), -/* 91 */ +/* 93 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9563,26 +9840,32 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _copyPoints = __webpack_require__(34); +var _copyPoints = __webpack_require__(36); var _copyPoints2 = _interopRequireDefault(_copyPoints); -var _pauseEvent = __webpack_require__(32); +var _pauseEvent = __webpack_require__(34); var _pauseEvent2 = _interopRequireDefault(_pauseEvent); -var _preventGhostClick = __webpack_require__(53); +var _preventGhostClick = __webpack_require__(54); var _preventGhostClick2 = _interopRequireDefault(_preventGhostClick); -var _triggerEvent = __webpack_require__(3); +var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var startPoints = void 0, @@ -9603,6 +9886,8 @@ var lastScale = 1.0, var pressDelay = 700, pressMaxDistance = 5; +var toolType = 'touchInput'; + function onTouch(e) { var cornerstone = _externalModules2.default.cornerstone; var element = e.currentTarget || e.srcEvent.currentTarget; @@ -9616,7 +9901,7 @@ function onTouch(e) { e.preventDefault(); // If more than one finger is placed on the element, stop the press timeout - if (e.pointers && e.pointers.length > 1 || e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 1) { + if (e.pointers && e.pointers.length > 1 || e.touches && e.touches.length > 1) { isPress = false; clearTimeout(pressTimeout); } @@ -9637,7 +9922,7 @@ function onTouch(e) { }; currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image); - eventType = 'CornerstoneToolsTap'; + eventType = _events2.default.TAP; eventData = { event: e, viewport: cornerstone.getViewport(element), @@ -9666,7 +9951,7 @@ function onTouch(e) { }; currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image); - eventType = 'CornerstoneToolsDoubleTap'; + eventType = _events2.default.DOUBLE_TAP; eventData = { event: e, viewport: cornerstone.getViewport(element), @@ -9705,7 +9990,7 @@ function onTouch(e) { }; startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchPinch'; + eventType = _events2.default.TOUCH_PINCH; eventData = { event: e, startPoints: startPoints, @@ -9731,18 +10016,18 @@ function onTouch(e) { clearTimeout(touchStartDelay); touchStartDelay = setTimeout(function () { startPoints = { - page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]), - image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY), + page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.touches[0]), + image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY), client: { - x: e.originalEvent.touches[0].clientX, - y: e.originalEvent.touches[0].clientY + x: e.touches[0].clientX, + y: e.touches[0].clientY } }; startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchStart'; - if (e.originalEvent.touches.length > 1) { - eventType = 'CornerstoneToolsMultiTouchStart'; + eventType = _events2.default.TOUCH_START; + if (e.touches.length > 1) { + eventType = _events2.default.MULTI_TOUCH_START; } eventData = { @@ -9764,9 +10049,9 @@ function onTouch(e) { // No current tools responded to the drag action. // Create new tool measurement - eventType = 'CornerstoneToolsTouchStartActive'; - if (e.originalEvent.touches.length > 1) { - eventType = 'CornerstoneToolsMultiTouchStartActive'; + eventType = _events2.default.TOUCH_START_ACTIVE; + if (e.touches.length > 1) { + eventType = _events2.default.MULTI_TOUCH_START_ACTIVE; } eventData.type = eventType; @@ -9785,16 +10070,16 @@ function onTouch(e) { } currentPoints = { - page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]), - image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY), + page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.touches[0]), + image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY), client: { - x: e.originalEvent.touches[0].clientX, - y: e.originalEvent.touches[0].clientY + x: e.touches[0].clientX, + y: e.touches[0].clientY } }; currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchPress'; + eventType = _events2.default.TOUCH_PRESS; eventData = { event: e, viewport: cornerstone.getViewport(element), @@ -9819,16 +10104,16 @@ function onTouch(e) { setTimeout(function () { startPoints = { - page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.originalEvent.changedTouches[0]), - image: cornerstone.pageToPixel(element, e.originalEvent.changedTouches[0].pageX, e.originalEvent.changedTouches[0].pageY), + page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.changedTouches[0]), + image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY), client: { - x: e.originalEvent.changedTouches[0].clientX, - y: e.originalEvent.changedTouches[0].clientY + x: e.changedTouches[0].clientX, + y: e.changedTouches[0].clientY } }; startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchEnd'; + eventType = _events2.default.TOUCH_END; eventData = { event: e, @@ -9890,9 +10175,9 @@ function onTouch(e) { clearTimeout(pressTimeout); } - eventType = 'CornerstoneToolsTouchDrag'; + eventType = _events2.default.TOUCH_DRAG; if (e.pointers.length > 1) { - eventType = 'CornerstoneToolsMultiTouchDrag'; + eventType = _events2.default.MULTI_TOUCH_DRAG; } eventData = { @@ -9959,7 +10244,7 @@ function onTouch(e) { canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) }; - eventType = 'CornerstoneToolsDragEnd'; + eventType = _events2.default.TOUCH_DRAG_END; eventData = { event: e.srcEvent, @@ -9992,7 +10277,7 @@ function onTouch(e) { lastRotation = e.rotation; - eventType = 'CornerstoneToolsTouchRotate'; + eventType = _events2.default.TOUCH_ROTATE; eventData = { event: e.srcEvent, viewport: cornerstone.getViewport(element), @@ -10032,7 +10317,6 @@ function enable(element) { threshold: 0 }); - // We want to detect both the same time pinch.recognizeWith(pan); pinch.recognizeWith(rotate); rotate.recognizeWith(pan); @@ -10052,17 +10336,34 @@ function enable(element) { mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch); _preventGhostClick2.default.enable(element); - _externalModules2.default.$(element).on('touchstart touchend', onTouch); - _externalModules2.default.$(element).data('hammer', mc); + + var touchEvents = ['touchstart', 'touchend']; + + touchEvents.forEach(function (eventType) { + element.addEventListener(eventType, onTouch); + }); + + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + options.hammer = mc; + + (0, _enabledElementTools.setToolOptions)(toolType, element, options); } function disable(element) { _preventGhostClick2.default.disable(element); - _externalModules2.default.$(element).off('touchstart touchend', onTouch); - var mc = _externalModules2.default.$(element).data('hammer'); + + var touchEvents = ['touchstart', 'touchend']; + + touchEvents.forEach(function (eventType) { + element.removeEventListener(eventType, onTouch); + }); + + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + var mc = options.hammer; if (mc) { - mc.off('tap doubletap panstart panmove panend pinchmove rotatemove', onTouch); + mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch); } } @@ -10075,7 +10376,7 @@ var touchInput = { exports.default = touchInput; /***/ }), -/* 92 */ +/* 94 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10090,23 +10391,23 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _roundToDecimal = __webpack_require__(30); +var _roundToDecimal = __webpack_require__(32); var _roundToDecimal2 = _interopRequireDefault(_roundToDecimal); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); @@ -10114,15 +10415,15 @@ var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -10189,7 +10490,8 @@ function pointNearTool(element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -10297,7 +10599,7 @@ exports.angle = angle; exports.angleTouch = angleTouch; /***/ }), -/* 93 */ +/* 95 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10308,23 +10610,27 @@ Object.defineProperty(exports, "__esModule", { }); exports.arrowAnnotateTouch = exports.arrowAnnotate = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); @@ -10332,39 +10638,41 @@ var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _drawArrow = __webpack_require__(48); +var _drawArrow = __webpack_require__(49); var _drawArrow2 = _interopRequireDefault(_drawArrow); -var _moveNewHandle = __webpack_require__(23); +var _moveNewHandle = __webpack_require__(25); var _moveNewHandle2 = _interopRequireDefault(_moveNewHandle); -var _moveNewHandleTouch = __webpack_require__(25); +var _moveNewHandleTouch = __webpack_require__(27); var _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _pointInsideBoundingBox = __webpack_require__(17); +var _pointInsideBoundingBox = __webpack_require__(19); var _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -10393,44 +10701,41 @@ var configuration = { // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement(mouseEventData) { + var element = mouseEventData.element; var measurementData = createNewMeasurement(mouseEventData); var cornerstone = _externalModules2.default.cornerstone; - var eventData = { - mouseButtonMask: mouseEventData.which - }; - function doneChangingTextCallback(text) { if (text === null) { - (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData); + (0, _toolState.removeToolState)(element, toolType, measurementData); } else { measurementData.text = text; } measurementData.active = false; - cornerstone.updateImage(mouseEventData.element); + cornerstone.updateImage(element); - _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseMove', eventData, arrowAnnotate.mouseMoveCallback); - _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseDown', eventData, arrowAnnotate.mouseDownCallback); - _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseDownActivate', eventData, arrowAnnotate.mouseDownActivateCallback); - _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseDoubleClick', eventData, arrowAnnotate.mouseDoubleClickCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, arrowAnnotate.mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback); + element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback); } // Associate this data with this imageId so we can render it and manipulate it - (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData); + (0, _toolState.addToolState)(element, toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseMove', arrowAnnotate.mouseMoveCallback); - _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseDown', arrowAnnotate.mouseDownCallback); - _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseDownActivate', arrowAnnotate.mouseDownActivateCallback); - _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseDoubleClick', arrowAnnotate.mouseDoubleClickCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, arrowAnnotate.mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback); + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback); - cornerstone.updateImage(mouseEventData.element); + cornerstone.updateImage(element); (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () { if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) { // Delete the measurement - (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData); + (0, _toolState.removeToolState)(element, toolType, measurementData); } var config = arrowAnnotate.getConfiguration(); @@ -10439,25 +10744,25 @@ function addNewMeasurement(mouseEventData) { config.getTextCallback(doneChangingTextCallback); } - cornerstone.updateImage(mouseEventData.element); + cornerstone.updateImage(element); }); } -function createNewMeasurement(mouseEventData) { +function createNewMeasurement(eventData) { // Create the measurement data for this tool with the end handle activated var measurementData = { visible: true, active: true, handles: { start: { - x: mouseEventData.currentPoints.image.x, - y: mouseEventData.currentPoints.image.y, + x: eventData.currentPoints.image.x, + y: eventData.currentPoints.image.y, highlight: true, active: false }, end: { - x: mouseEventData.currentPoints.image.x, - y: mouseEventData.currentPoints.image.y, + x: eventData.currentPoints.image.x, + y: eventData.currentPoints.image.y, highlight: true, active: false }, @@ -10490,7 +10795,9 @@ function pointNearTool(element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -10664,15 +10971,15 @@ function addNewMeasurementTouch(touchEventData) { measurementData.active = false; cornerstone.updateImage(element); - _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.addEventListener(_events2.default.TOUCH_PRESS, arrowAnnotateTouch.pressCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback); } (0, _toolState.addToolState)(element, toolType, measurementData); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, arrowAnnotateTouch.pressCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback); cornerstone.updateImage(element); (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () { @@ -10691,11 +10998,17 @@ function addNewMeasurementTouch(touchEventData) { }); } -function doubleClickCallback(e, eventData) { +function doubleClickCallback(e) { + var eventData = e.detail; var element = eventData.element; var cornerstone = _externalModules2.default.cornerstone; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); var data = void 0; + if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + return; + } + function doneChangingTextCallback(data, updatedText, deleteTool) { if (deleteTool === true) { (0, _toolState.removeToolState)(element, toolType, data); @@ -10707,10 +11020,6 @@ function doubleClickCallback(e, eventData) { cornerstone.updateImage(element); } - if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - return; - } - var config = arrowAnnotate.getConfiguration(); var coords = eventData.currentPoints.canvas; @@ -10736,7 +11045,8 @@ function doubleClickCallback(e, eventData) { } } -function pressCallback(e, eventData) { +function pressCallback(e) { + var eventData = e.detail; var element = eventData.element; var cornerstone = _externalModules2.default.cornerstone; var data = void 0; @@ -10752,13 +11062,9 @@ function pressCallback(e, eventData) { data.active = false; cornerstone.updateImage(element); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); - } - - if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - return; + element.addEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback); } var config = arrowAnnotate.getConfiguration(); @@ -10772,9 +11078,9 @@ function pressCallback(e, eventData) { } if (eventData.handlePressed) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback); @@ -10790,9 +11096,9 @@ function pressCallback(e, eventData) { data.active = true; cornerstone.updateImage(element); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); @@ -10803,7 +11109,8 @@ function pressCallback(e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } var arrowAnnotate = (0, _mouseButtonTool2.default)({ @@ -10830,7 +11137,7 @@ exports.arrowAnnotate = arrowAnnotate; exports.arrowAnnotateTouch = arrowAnnotateTouch; /***/ }), -/* 94 */ +/* 96 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10841,31 +11148,39 @@ Object.defineProperty(exports, "__esModule", { }); exports.crosshairsTouch = exports.crosshairs = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _loadHandlerManager = __webpack_require__(10); +var _loadHandlerManager = __webpack_require__(12); var _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _pointProjector = __webpack_require__(26); +var _pointProjector = __webpack_require__(28); -var _convertToVector = __webpack_require__(15); +var _convertToVector = __webpack_require__(17); var _convertToVector2 = _interopRequireDefault(_convertToVector); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var toolType = 'crosshairs'; -function chooseLocation(e, eventData) { +function chooseLocation(e) { + var eventData = e.detail; + e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events // If we have no toolData for this element, return immediately as there is nothing to do @@ -10967,31 +11282,38 @@ function chooseLocation(e, eventData) { }); } -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - chooseLocation(e, eventData); +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - return false; // False = cases jquery to preventDefault() and stopPropagation() this event + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + chooseLocation(e); + + e.preventDefault(); + e.stopPropagation(); } } -function mouseDragCallback(e, eventData) { - chooseLocation(e, eventData); +function mouseDragCallback(e) { + chooseLocation(e); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } function enable(element, mouseButtonMask, synchronizationContext) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); // Clear any currently existing toolData (0, _toolState.clearToolState)(element, toolType); @@ -11000,14 +11322,14 @@ function enable(element, mouseButtonMask, synchronizationContext) { synchronizationContext: synchronizationContext }); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); } // Disables the reference line tool for the given element function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); } // Module/private exports @@ -11018,23 +11340,30 @@ var crosshairs = { disable: disable }; -function dragEndCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsTouchDrag', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback); +function dragEndCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback); } -function dragStartCallback(e, eventData) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsTouchDrag', dragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback); - chooseLocation(e, eventData); +function dragStartCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.addEventListener(_events2.default.TOUCH_DRAG, dragCallback); + element.addEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback); + chooseLocation(e); return false; } -function dragCallback(e, eventData) { - chooseLocation(e, eventData); +function dragCallback(e) { + chooseLocation(e); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } function enableTouch(element, synchronizationContext) { @@ -11045,14 +11374,14 @@ function enableTouch(element, synchronizationContext) { synchronizationContext: synchronizationContext }); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', dragStartCallback); + element.removeEventListener(_events2.default.TOUCH_START, dragStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', dragStartCallback); + element.addEventListener(_events2.default.TOUCH_START, dragStartCallback); } // Disables the reference line tool for the given element function disableTouch(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', dragStartCallback); + element.removeEventListener(_events2.default.TOUCH_START, dragStartCallback); } var crosshairsTouch = { @@ -11066,7 +11395,7 @@ exports.crosshairs = crosshairs; exports.crosshairsTouch = crosshairsTouch; /***/ }), -/* 95 */ +/* 97 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11080,7 +11409,7 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _doubleTapTool = __webpack_require__(54); +var _doubleTapTool = __webpack_require__(55); var _doubleTapTool2 = _interopRequireDefault(_doubleTapTool); @@ -11090,10 +11419,13 @@ function fitToWindowStrategy(eventData) { _externalModules2.default.cornerstone.fitToWindow(eventData.element); } -function doubleTapCallback(e, eventData) { +function doubleTapCallback(e) { + var eventData = e.detail; + doubleTapZoom.strategy(eventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } var doubleTapZoom = (0, _doubleTapTool2.default)(doubleTapCallback); @@ -11107,7 +11439,7 @@ doubleTapZoom.strategy = fitToWindowStrategy; exports.default = doubleTapZoom; /***/ }), -/* 96 */ +/* 98 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11118,15 +11450,19 @@ Object.defineProperty(exports, "__esModule", { }); exports.dragProbeTouch = exports.dragProbe = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); @@ -11134,28 +11470,32 @@ var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _getRGBPixels = __webpack_require__(33); +var _getRGBPixels = __webpack_require__(35); var _getRGBPixels2 = _interopRequireDefault(_getRGBPixels); -var _calculateSUV = __webpack_require__(18); +var _calculateSUV = __webpack_require__(20); var _calculateSUV2 = _interopRequireDefault(_calculateSUV); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var toolType = 'dragProbe'; + var dragEventData = void 0; function defaultStrategy(eventData) { @@ -11324,27 +11664,31 @@ function minimalStrategy(eventData) { context.restore(); } -function mouseUpCallback(e, eventData) { +function mouseUpCallback(e) { + var eventData = e.detail; var element = eventData.element; - element.removeEventListener('cornerstoneimagerendered', imageRenderedCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, imageRenderedCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); _externalModules2.default.cornerstone.updateImage(eventData.element); } -function mouseDownCallback(e, eventData) { +function mouseDownCallback(e) { + var eventData = e.detail; var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - element.addEventListener('cornerstoneimagerendered', imageRenderedCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback); + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.IMAGE_RENDERED, imageRenderedCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); dragProbe.strategy(eventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -11358,16 +11702,18 @@ function imageRenderedCallback() { // The strategy can't be execute at this moment because the image is rendered asynchronously // (requestAnimationFrame). Then the eventData that contains all information needed is being // Cached and the strategy will be executed once cornerstoneimagerendered is triggered. -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; var element = eventData.element; dragEventData = eventData; _externalModules2.default.cornerstone.updateImage(element); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -var dragProbe = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var dragProbe = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); dragProbe.strategies = { default: defaultStrategy, @@ -11386,7 +11732,7 @@ exports.dragProbe = dragProbe; exports.dragProbeTouch = dragProbeTouch; /***/ }), -/* 97 */ +/* 99 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11401,47 +11747,47 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _drawEllipse = __webpack_require__(46); +var _drawEllipse = __webpack_require__(47); var _drawEllipse2 = _interopRequireDefault(_drawEllipse); -var _pointInEllipse = __webpack_require__(31); +var _pointInEllipse = __webpack_require__(33); var _pointInEllipse2 = _interopRequireDefault(_pointInEllipse); -var _calculateEllipseStatistics = __webpack_require__(49); +var _calculateEllipseStatistics = __webpack_require__(50); var _calculateEllipseStatistics2 = _interopRequireDefault(_calculateEllipseStatistics); -var _calculateSUV = __webpack_require__(18); +var _calculateSUV = __webpack_require__(20); var _calculateSUV2 = _interopRequireDefault(_calculateSUV); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -11529,7 +11875,9 @@ function numberWithCommas(x) { return parts.join('.'); } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -11847,7 +12195,7 @@ exports.ellipticalRoi = ellipticalRoi; exports.ellipticalRoiTouch = ellipticalRoiTouch; /***/ }), -/* 98 */ +/* 100 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11858,27 +12206,33 @@ Object.defineProperty(exports, "__esModule", { }); exports.freehand = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -11992,8 +12346,11 @@ function pointNearHandleAllTools(eventData) { // On next click, add another point -- continuously // On each click, if it intersects with a current point, end drawing loop -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); // Check if drawing is finished var toolData = (0, _toolState.getToolState)(eventData.element, toolType); @@ -12011,7 +12368,8 @@ function mouseUpCallback(e, eventData) { _externalModules2.default.cornerstone.updateImage(eventData.element); } -function mouseMoveCallback(e, eventData) { +function mouseMoveCallback(e) { + var eventData = e.detail; var toolData = (0, _toolState.getToolState)(eventData.element, toolType); if (!toolData) { @@ -12069,8 +12427,10 @@ function mouseMoveCallback(e, eventData) { } function startDrawing(eventData) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); + var element = eventData.element; + + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); var measurementData = { visible: true, @@ -12091,6 +12451,7 @@ function startDrawing(eventData) { } function endDrawing(eventData, handleNearby) { + var element = eventData.element; var toolData = (0, _toolState.getToolState)(eventData.element, toolType); if (!toolData) { @@ -12121,13 +12482,17 @@ function endDrawing(eventData, handleNearby) { config.currentHandle = 0; config.currentTool = -1; - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); _externalModules2.default.cornerstone.updateImage(eventData.element); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { var toolData = (0, _toolState.getToolState)(eventData.element, toolType); var handleNearby = void 0, @@ -12150,8 +12515,8 @@ function mouseDownCallback(e, eventData) { toolIndex = nearby.toolIndex; // This means the user is trying to modify a point if (handleNearby !== undefined) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); config.modifying = true; config.currentHandle = handleNearby; config.currentTool = toolIndex; @@ -12171,7 +12536,8 @@ function mouseDownCallback(e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -12260,51 +12626,50 @@ function onImageRendered(e) { context.restore(); } } + // /////// END IMAGE RENDERING /////// function enable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Disables the reference line tool for the given element function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Visible and interactive function activate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', eventData, mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); _externalModules2.default.cornerstone.updateImage(element); } // Visible, but not interactive function deactivate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } @@ -12330,7 +12695,7 @@ var freehand = { exports.freehand = freehand; /***/ }), -/* 99 */ +/* 101 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12345,27 +12710,27 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonRectangleTool = __webpack_require__(55); +var _mouseButtonRectangleTool = __webpack_require__(56); var _mouseButtonRectangleTool2 = _interopRequireDefault(_mouseButtonRectangleTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -12444,7 +12809,9 @@ function pointNearTool(element, data, coords) { // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -12536,7 +12903,7 @@ exports.highlight = highlight; exports.highlightTouch = highlightTouch; /***/ }), -/* 100 */ +/* 102 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12546,17 +12913,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _displayTool = __webpack_require__(24); +var _displayTool = __webpack_require__(26); var _displayTool2 = _interopRequireDefault(_displayTool); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; var image = eventData.image; var stats = image.stats; @@ -12584,7 +12952,7 @@ var imageStats = (0, _displayTool2.default)(onImageRendered); exports.default = imageStats; /***/ }), -/* 101 */ +/* 103 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12599,31 +12967,31 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -12675,7 +13043,9 @@ function pointNearTool(element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -12868,7 +13238,7 @@ exports.length = length; exports.lengthTouch = lengthTouch; /***/ }), -/* 102 */ +/* 104 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12879,22 +13249,30 @@ Object.defineProperty(exports, "__esModule", { }); exports.magnifyTouchDrag = exports.magnify = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); -var _getMaxSimultaneousRequests = __webpack_require__(20); +var _getMaxSimultaneousRequests = __webpack_require__(22); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var toolType = 'magnify'; + var configuration = { magnifySize: 100, magnificationLevel: 2 @@ -12905,36 +13283,43 @@ var browserName = void 0; var currentPoints = void 0; /** Remove the magnifying glass when the mouse event ends */ -function mouseUpCallback(e, eventData) { +function mouseUpCallback(e) { + var eventData = e.detail; var element = eventData.element; - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); + element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback); hideTool(eventData); } function hideTool(eventData) { - _externalModules2.default.$(eventData.element).find('.magnifyTool').hide(); + var element = eventData.element; + + element.querySelector('.magnifyTool').style.display = 'none'; + // Re-enable the mouse cursor document.body.style.cursor = 'default'; } /** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */ -function mouseDownCallback(e, eventData) { +function mouseDownCallback(e) { + var eventData = e.detail; var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', eventData, dragCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', eventData, mouseUpCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', eventData, mouseUpCallback); + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); currentPoints = eventData.currentPoints; - element.addEventListener('cornerstonenewimage', newImageCallback); + element.addEventListener(_events2.default.NEW_IMAGE, newImageCallback); drawMagnificationTool(eventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -12945,31 +13330,37 @@ function newImageCallback(e) { drawMagnificationTool(eventData); } -function dragEndCallback(e, eventData) { +function dragEndCallback(e) { + var eventData = e.detail; var element = eventData.element; - _externalModules2.default.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsTouchEnd', dragEndCallback); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback); + element.removeEventListener(_events2.default.TOUCH_END, dragEndCallback); + element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback); hideTool(eventData); } /** Drag callback is triggered by both the touch and mouse magnify tools */ -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; + var element = eventData.element; + currentPoints = eventData.currentPoints; drawMagnificationTool(eventData); if (eventData.isTouchEvent === true) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsTouchEnd', dragEndCallback); + element.addEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback); + element.addEventListener(_events2.default.TOUCH_END, dragEndCallback); } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } /** Draws the magnifying glass */ function drawMagnificationTool(eventData) { - var magnifyCanvas = _externalModules2.default.$(eventData.element).find('.magnifyTool').get(0); + var element = eventData.element; + var magnifyCanvas = element.querySelector('.magnifyTool'); if (!magnifyCanvas) { createMagnificationCanvas(eventData.element); @@ -12982,7 +13373,7 @@ function drawMagnificationTool(eventData) { // The 'not' magnifyTool class here is necessary because cornerstone places // No classes of it's own on the canvas we want to select - var canvas = _externalModules2.default.$(eventData.element).find('canvas').not('.magnifyTool').get(0); + var canvas = element.querySelector('canvas:not(.magnifyTool)'); var context = canvas.getContext('2d'); context.setTransform(1, 0, 0, 1, 0, 0); @@ -13048,7 +13439,7 @@ function drawMagnificationTool(eventData) { /** Creates the magnifying glass canvas */ function createMagnificationCanvas(element) { // If the magnifying glass canvas doesn't already exist - if (_externalModules2.default.$(element).find('.magnifyTool').length === 0) { + if (element.querySelector('.magnifyTool') === null) { // Create a canvas and append it as a child to the element var magnifyCanvas = document.createElement('canvas'); // The magnifyTool class is used to find the canvas later on @@ -13068,12 +13459,16 @@ function createMagnificationCanvas(element) { /** Find the magnifying glass canvas and remove it */ function removeMagnificationCanvas(element) { - _externalModules2.default.$(element).find('.magnifyTool').remove(); + var magnifyCanvas = element.querySelector('.magnifyTool'); + + if (magnifyCanvas) { + element.removeChild(magnifyCanvas); + } } // --- Mouse tool activate / disable --- // function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); removeMagnificationCanvas(element); } @@ -13089,13 +13484,11 @@ function enable(element) { } function activate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); createMagnificationCanvas(element); } @@ -13130,7 +13523,7 @@ exports.magnify = magnify; exports.magnifyTouchDrag = magnifyTouchDrag; /***/ }), -/* 103 */ +/* 105 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13144,19 +13537,19 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _index = __webpack_require__(41); +var _index = __webpack_require__(43); var _index2 = _interopRequireDefault(_index); -var _displayTool = __webpack_require__(24); +var _displayTool = __webpack_require__(26); var _displayTool2 = _interopRequireDefault(_displayTool); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); @@ -13222,7 +13615,8 @@ function getOrientationMarkerPositions(element) { }; } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; var element = eventData.element; var markers = getOrientationMarkers(element); @@ -13264,7 +13658,7 @@ var orientationMarkers = (0, _displayTool2.default)(onImageRendered); exports.default = orientationMarkers; /***/ }), -/* 104 */ +/* 106 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13275,41 +13669,58 @@ Object.defineProperty(exports, "__esModule", { }); exports.panTouchDrag = exports.pan = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +var toolType = 'pan'; + +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there. var widthScale = eventData.viewport.scale; @@ -13325,17 +13736,18 @@ function dragCallback(e, eventData) { eventData.viewport.translation.y += eventData.deltaPoints.page.y / heightScale; _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -var pan = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var pan = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); var panTouchDrag = (0, _touchDragTool2.default)(dragCallback); exports.pan = pan; exports.panTouchDrag = panTouchDrag; /***/ }), -/* 105 */ +/* 107 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13349,13 +13761,14 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _multiTouchDragTool = __webpack_require__(28); +var _multiTouchDragTool = __webpack_require__(30); var _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function touchPanCallback(e, eventData) { +function touchPanCallback(e) { + var eventData = e.detail; var config = panMultiTouch.getConfiguration(); if (config && config.testPointers(eventData)) { @@ -13363,7 +13776,8 @@ function touchPanCallback(e, eventData) { eventData.viewport.translation.y += eventData.deltaPoints.page.y / eventData.viewport.scale; _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -13380,7 +13794,7 @@ panMultiTouch.setConfiguration(configuration); exports.default = panMultiTouch; /***/ }), -/* 106 */ +/* 108 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13395,15 +13809,15 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); @@ -13411,23 +13825,23 @@ var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _getRGBPixels = __webpack_require__(33); +var _getRGBPixels = __webpack_require__(35); var _getRGBPixels2 = _interopRequireDefault(_getRGBPixels); -var _calculateSUV = __webpack_require__(18); +var _calculateSUV = __webpack_require__(20); var _calculateSUV2 = _interopRequireDefault(_calculateSUV); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -13460,7 +13874,9 @@ function pointNearTool(element, data, coords) { return _externalModules2.default.cornerstoneMath.point.distance(endCanvas, coords) < 5; } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -13557,7 +13973,7 @@ exports.probe = probe; exports.probeTouch = probeTouch; /***/ }), -/* 107 */ +/* 109 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13572,35 +13988,35 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _calculateSUV = __webpack_require__(18); +var _calculateSUV = __webpack_require__(20); var _calculateSUV2 = _interopRequireDefault(_calculateSUV); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -13706,7 +14122,9 @@ function numberWithCommas(x) { return parts.join('.'); } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -14024,7 +14442,7 @@ exports.rectangleRoi = rectangleRoi; exports.rectangleRoiTouch = rectangleRoiTouch; /***/ }), -/* 108 */ +/* 110 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14035,24 +14453,32 @@ Object.defineProperty(exports, "__esModule", { }); exports.rotateTouchDrag = exports.rotate = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var toolType = 'rotate'; + // --- Strategies --- // function defaultStrategy(eventData) { // Calculate distance from the center of the image @@ -14091,30 +14517,41 @@ function verticalStrategy(eventData) { } // --- Mouse event callbacks --- // -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; + rotate.strategy(eventData); _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -var rotate = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var rotate = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); rotate.strategies = { default: defaultStrategy, @@ -14130,7 +14567,7 @@ exports.rotate = rotate; exports.rotateTouchDrag = rotateTouchDrag; /***/ }), -/* 109 */ +/* 111 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14140,13 +14577,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function touchRotateCallback(e, eventData) { +function touchRotateCallback(e) { + var eventData = e.detail; + eventData.viewport.rotation += eventData.rotation; _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport); @@ -14154,12 +14597,12 @@ function touchRotateCallback(e, eventData) { } function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback); + element.removeEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback); } function activate(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchRotate', touchRotateCallback); + element.removeEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback); + element.addEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback); } var rotateTouch = { @@ -14170,7 +14613,7 @@ var rotateTouch = { exports.default = rotateTouch; /***/ }), -/* 110 */ +/* 112 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14179,46 +14622,39 @@ exports.default = rotateTouch; Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = saveAs; +function saveAs(element, filename) { + var mimetype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png'; -exports.default = function (element, filename, mimetype) { // Setting the default value for mimetype to image/png - mimetype = mimetype || 'image/png'; - var canvas = _externalModules2.default.$(element).find('canvas').get(0); + var canvas = element.querySelector('canvas'); // Thanks to Ken Fyrstenber // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas var lnk = document.createElement('a'); - // / the key here is to set the download attribute of the a tag + // The key here is to set the download attribute of the a tag lnk.download = filename; - // / convert canvas content to data-uri for link. When download - // / attribute is set the content pointed to by link will be - // / pushed as 'download' in HTML5 capable browsers + // Convert canvas content to data-uri for link. When download + // Attribute is set the content pointed to by link will be + // Pushed as 'download' in HTML5 capable browsers lnk.href = canvas.toDataURL(mimetype, 1); // / create a 'fake' click-event to trigger the download if (document.createEvent) { - var e = document.createEvent('MouseEvents'); e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); lnk.dispatchEvent(e); } else if (lnk.fireEvent) { - lnk.fireEvent('onclick'); } -}; - -var _externalModules = __webpack_require__(0); - -var _externalModules2 = _interopRequireDefault(_externalModules); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +} /***/ }), -/* 111 */ +/* 113 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14229,19 +14665,23 @@ Object.defineProperty(exports, "__esModule", { }); exports.seedAnnotateTouch = exports.seedAnnotate = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); @@ -14249,39 +14689,41 @@ var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _moveHandle = __webpack_require__(22); +var _moveHandle = __webpack_require__(24); var _moveHandle2 = _interopRequireDefault(_moveHandle); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _drawCircle = __webpack_require__(47); +var _drawCircle = __webpack_require__(48); var _drawCircle2 = _interopRequireDefault(_drawCircle); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _pointInsideBoundingBox = __webpack_require__(17); +var _pointInsideBoundingBox = __webpack_require__(19); var _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -14385,7 +14827,8 @@ function pointNearTool(element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -14569,10 +15012,16 @@ function addNewMeasurementTouch(touchEventData) { }); } -function doubleClickCallback(e, eventData) { +function doubleClickCallback(e) { + var eventData = e.detail; var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; var data = void 0; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + return; + } function doneChangingTextCallback(data, updatedText, deleteTool) { if (deleteTool === true) { @@ -14585,10 +15034,6 @@ function doubleClickCallback(e, eventData) { cornerstone.updateImage(element); } - if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - return; - } - var config = seedAnnotate.getConfiguration(); var coords = eventData.currentPoints.canvas; @@ -14614,10 +15059,12 @@ function doubleClickCallback(e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -function pressCallback(e, eventData) { +function pressCallback(e) { + var eventData = e.detail; var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; var data = void 0; @@ -14633,13 +15080,9 @@ function pressCallback(e, eventData) { data.active = false; cornerstone.updateImage(element); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', seedAnnotateTouch.tapCallback); - } - - if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - return false; + element.addEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback); } var config = seedAnnotate.getConfiguration(); @@ -14653,9 +15096,9 @@ function pressCallback(e, eventData) { } if (eventData.handlePressed) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback); @@ -14671,9 +15114,9 @@ function pressCallback(e, eventData) { data.active = true; cornerstone.updateImage(element); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); @@ -14684,7 +15127,8 @@ function pressCallback(e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } var seedAnnotate = (0, _mouseButtonTool2.default)({ @@ -14711,7 +15155,7 @@ exports.seedAnnotate = seedAnnotate; exports.seedAnnotateTouch = seedAnnotateTouch; /***/ }), -/* 112 */ +/* 114 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14722,19 +15166,23 @@ Object.defineProperty(exports, "__esModule", { }); exports.simpleAngleTouch = exports.simpleAngle = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _roundToDecimal = __webpack_require__(30); +var _roundToDecimal = __webpack_require__(32); var _roundToDecimal2 = _interopRequireDefault(_roundToDecimal); @@ -14742,35 +15190,35 @@ var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _anyHandlesOutsideImage = __webpack_require__(12); +var _anyHandlesOutsideImage = __webpack_require__(15); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); -var _moveNewHandle = __webpack_require__(23); +var _moveNewHandle = __webpack_require__(25); var _moveNewHandle2 = _interopRequireDefault(_moveNewHandle); -var _moveNewHandleTouch = __webpack_require__(25); +var _moveNewHandleTouch = __webpack_require__(27); var _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch); -var _drawHandles = __webpack_require__(8); +var _drawHandles = __webpack_require__(10); var _drawHandles2 = _interopRequireDefault(_drawHandles); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -14842,7 +15290,8 @@ function length(vector) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType); @@ -15041,19 +15490,15 @@ function addNewMeasurement(mouseEventData) { var measurementData = createNewMeasurement(mouseEventData); var element = mouseEventData.element; - var eventData = { - mouseButtonMask: mouseEventData.which - }; - // Associate this data with this imageId so we can render it and manipulate it (0, _toolState.addToolState)(element, toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', simpleAngle.mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', simpleAngle.mouseDownActivateCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback); cornerstone.updateImage(element); (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () { @@ -15062,10 +15507,10 @@ function addNewMeasurement(mouseEventData) { // Delete the measurement (0, _toolState.removeToolState)(element, toolType, measurementData); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback); cornerstone.updateImage(element); return; @@ -15081,10 +15526,10 @@ function addNewMeasurement(mouseEventData) { (0, _toolState.removeToolState)(element, toolType, measurementData); } - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback); cornerstone.updateImage(element); }); }); @@ -15100,20 +15545,20 @@ function addNewMeasurementTouch(touchEventData) { // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', simpleAngleTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback); + element.removeEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback); cornerstone.updateImage(element); (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.middle, function () { if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, toolType, measurementData); - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback); + element.addEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback); + element.addEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback); cornerstone.updateImage(element); return; @@ -15126,10 +15571,10 @@ function addNewMeasurementTouch(touchEventData) { cornerstone.updateImage(element); } - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback); + element.addEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback); + element.addEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback); + element.addEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback); }); }); } @@ -15154,7 +15599,7 @@ exports.simpleAngle = simpleAngle; exports.simpleAngleTouch = simpleAngleTouch; /***/ }), -/* 113 */ +/* 115 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15165,35 +15610,41 @@ Object.defineProperty(exports, "__esModule", { }); exports.textMarkerTouch = exports.textMarker = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _mouseButtonTool = __webpack_require__(7); +var _mouseButtonTool = __webpack_require__(9); var _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool); -var _touchTool = __webpack_require__(9); +var _touchTool = __webpack_require__(11); var _touchTool2 = _interopRequireDefault(_touchTool); -var _pointInsideBoundingBox = __webpack_require__(17); +var _pointInsideBoundingBox = __webpack_require__(19); var _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _drawTextBox = __webpack_require__(6); +var _drawTextBox = __webpack_require__(7); var _drawTextBox2 = _interopRequireDefault(_drawTextBox); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); + +var _enabledElementTools = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -15278,7 +15729,9 @@ function pointNearTool(element, data, coords) { return distanceToPoint < 10 || insideBoundingBox; } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do var toolData = (0, _toolState.getToolState)(eventData.element, toolType); @@ -15325,18 +15778,22 @@ function onImageRendered(e, eventData) { } }; - var boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y - 10, color, options); - - data.handles.end.boundingBox = boundingBox; + data.handles.end.boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y - 10, color, options); context.restore(); } } -function doubleClickCallback(e, eventData) { +function doubleClickCallback(e) { + var eventData = e.detail; var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; var data = void 0; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + return; + } function doneChangingTextCallback(data, updatedText, deleteTool) { if (deleteTool === true) { @@ -15348,22 +15805,13 @@ function doubleClickCallback(e, eventData) { data.active = false; cornerstone.updateImage(element); - var mouseButtonData = { - mouseButtonMask: e.data.mouseButtonMask - }; - - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', mouseButtonData, textMarker.mouseMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', mouseButtonData, textMarker.mouseDownCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', mouseButtonData, textMarker.mouseDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', mouseButtonData, textMarker.mouseDoubleClickCallback); - } - - if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - return; + element.addEventListener(_events2.default.MOUSE_MOVE, textMarker.mouseMoveCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, textMarker.mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback); + element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback); } var config = textMarker.getConfiguration(); - var coords = eventData.currentPoints.canvas; var toolData = (0, _toolState.getToolState)(element, toolType); @@ -15378,23 +15826,27 @@ function doubleClickCallback(e, eventData) { data.active = true; cornerstone.updateImage(element); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', textMarker.mouseMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', textMarker.mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', textMarker.mouseDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', textMarker.mouseDoubleClickCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, textMarker.mouseMoveCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, textMarker.mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback); + element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); - return false; + return; } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -function touchPressCallback(e, eventData) { +function touchPressCallback(e) { + var eventData = e.detail; var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; var data = void 0; @@ -15409,11 +15861,11 @@ function touchPressCallback(e, eventData) { data.active = false; cornerstone.updateImage(element); - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTap', textMarkerTouch.tapCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback); + element.addEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback); + element.addEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback); + element.addEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback); + element.addEventListener(_events2.default.TAP, textMarkerTouch.tapCallback); + element.addEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback); } var config = textMarker.getConfiguration(); @@ -15430,18 +15882,20 @@ function touchPressCallback(e, eventData) { eventData.handlePressed.active = true; cornerstone.updateImage(element); - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback); + element.removeEventListener(_events2.default.TAP, textMarkerTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback); // Allow relabelling via a callback config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback); e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); - return false; + return; } for (var i = 0; i < toolData.data.length; i++) { @@ -15450,21 +15904,24 @@ function touchPressCallback(e, eventData) { data.active = true; cornerstone.updateImage(element); - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback); + element.removeEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback); + element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback); + element.removeEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback); + element.removeEventListener(_events2.default.TAP, textMarkerTouch.tapCallback); + element.removeEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); - return false; + return; } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } var textMarker = (0, _mouseButtonTool2.default)({ @@ -15487,7 +15944,7 @@ exports.textMarker = textMarker; exports.textMarkerTouch = textMarkerTouch; /***/ }), -/* 114 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15498,37 +15955,53 @@ Object.defineProperty(exports, "__esModule", { }); exports.wwwcTouchDrag = exports.wwwc = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +var toolType = 'wwwc'; + +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); + + e.preventDefault(); + e.stopPropagation(); } } @@ -15549,14 +16022,18 @@ function defaultStrategy(eventData) { eventData.viewport.voi.windowCenter += deltaY; } -function mouseDragCallback(e, eventData) { +function mouseDragCallback(e) { + var eventData = e.detail; + wwwc.strategy(eventData); _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport); return false; // False = cases jquery to preventDefault() and stopPropagation() this event } -function touchDragCallback(e, eventData) { +function touchDragCallback(e) { + var eventData = e.detail; + e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events var dragData = eventData; @@ -15585,7 +16062,7 @@ function touchDragCallback(e, eventData) { _externalModules2.default.cornerstone.setViewport(dragData.element, dragData.viewport); } -var wwwc = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var wwwc = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); wwwc.strategies = { default: defaultStrategy @@ -15599,7 +16076,7 @@ exports.wwwc = wwwc; exports.wwwcTouchDrag = wwwcTouchDrag; /***/ }), -/* 115 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15610,28 +16087,34 @@ Object.defineProperty(exports, "__esModule", { }); exports.wwwcRegionTouch = exports.wwwcRegion = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolStyle = __webpack_require__(5); +var _toolStyle = __webpack_require__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); -var _toolColors = __webpack_require__(4); +var _toolColors = __webpack_require__(6); var _toolColors2 = _interopRequireDefault(_toolColors); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _getLuminance = __webpack_require__(45); +var _getLuminance = __webpack_require__(46); var _getLuminance2 = _interopRequireDefault(_getLuminance); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var toolType = 'wwwcRegion'; @@ -15640,8 +16123,6 @@ var configuration = { minWindowWidth: 10 }; -var currentMouseButtonMask = void 0; - /** Calculates the minimum, maximum, and mean value in the given pixel array */ function calculateMinMaxMean(storedPixelLuminanceData, globalMin, globalMax) { var numPixels = storedPixelLuminanceData.length; @@ -15676,38 +16157,34 @@ function calculateMinMaxMean(storedPixelLuminanceData, globalMin, globalMax) { /* Erases the toolData and rebinds the handlers when the image changes */ function newImageCallback(e) { var eventData = e.detail; - var toolData = (0, _toolState.getToolState)(eventData.element, toolType); + var element = eventData.element; + var toolData = (0, _toolState.getToolState)(element, toolType); if (toolData && toolData.data) { toolData.data = []; } - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback); - - var mouseData = { - mouseButtonMask: currentMouseButtonMask - }; + element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); } /* Applies the windowing procedure when the mouse drag ends */ -function dragEndCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); +function dragEndCallback(e) { + var eventData = e.detail; + var element = eventData.element; - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); - var mouseData = { - mouseButtonMask: currentMouseButtonMask - }; + element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); var toolData = (0, _toolState.getToolState)(eventData.element, toolType); @@ -15775,28 +16252,33 @@ function applyWWWCRegion(eventData) { cornerstone.updateImage(eventData.element); } -function whichMovement(e, eventData) { +function whichMovement(e) { + var eventData = e.detail; var element = eventData.element; - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove'); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag'); + element.removeEventListener(_events2.default.MOUSE_MOVE, whichMovement); + element.removeEventListener(_events2.default.MOUSE_DRAG, whichMovement); - _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', dragCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', dragCallback); + element.addEventListener(_events2.default.MOUSE_MOVE, dragCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', dragEndCallback); - if (e.type === 'CornerstoneToolsMouseDrag') { - _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', dragEndCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, dragEndCallback); + if (e.type === _events2.default.MOUSE_DRAG) { + element.addEventListener(_events2.default.MOUSE_UP, dragEndCallback); } } /** Records the start point and attaches the drag event handler */ -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', eventData, whichMovement); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', eventData, whichMovement); +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDown', mouseDownCallback); + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { + element.addEventListener(_events2.default.MOUSE_DRAG, whichMovement); + element.addEventListener(_events2.default.MOUSE_MOVE, whichMovement); + + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); recordStartPoint(eventData); return false; @@ -15822,26 +16304,30 @@ function recordStartPoint(eventData) { } /** Draws the rectangular region while the touch or mouse event drag occurs */ -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; + var element = eventData.element; + // If we have no toolData for this element, return immediately as there is nothing to do - var toolData = (0, _toolState.getToolState)(eventData.element, toolType); + var toolData = (0, _toolState.getToolState)(element, toolType); if (!toolData || !toolData.data || !toolData.data.length) { return; } // Update the endpoint as the mouse/touch is dragged - var endPoint = { + toolData.data[0].endPoint = { x: eventData.currentPoints.image.x, y: eventData.currentPoints.image.y }; - toolData.data[0].endPoint = endPoint; - _externalModules2.default.cornerstone.updateImage(eventData.element); + _externalModules2.default.cornerstone.updateImage(element); } function onImageRendered(e) { var eventData = e.detail; + var element = eventData.element; + var context = eventData.canvasContext; var cornerstone = _externalModules2.default.cornerstone; var toolData = (0, _toolState.getToolState)(eventData.element, toolType); @@ -15856,18 +16342,14 @@ function onImageRendered(e) { return; } - // Get the current element's canvas - var canvas = _externalModules2.default.$(eventData.element).find('canvas').get(0); - var context = canvas.getContext('2d'); - context.setTransform(1, 0, 0, 1, 0, 0); // Set to the active tool color var color = _toolColors2.default.getActiveColor(); // Calculate the rectangle parameters - var startPointCanvas = cornerstone.pixelToCanvas(eventData.element, startPoint); - var endPointCanvas = cornerstone.pixelToCanvas(eventData.element, endPoint); + var startPointCanvas = cornerstone.pixelToCanvas(element, startPoint); + var endPointCanvas = cornerstone.pixelToCanvas(element, endPoint); var left = Math.min(startPointCanvas.x, endPointCanvas.x); var top = Math.min(startPointCanvas.y, endPointCanvas.y); @@ -15897,26 +16379,22 @@ function onImageRendered(e) { // --- Mouse tool enable / disable --- /// function disable(element) { - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', dragEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', dragCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback); _externalModules2.default.cornerstone.updateImage(element); } function activate(element, mouseButtonMask) { - var eventData = { - mouseButtonMask: mouseButtonMask - }; - - currentMouseButtonMask = mouseButtonMask; + (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); var toolData = (0, _toolState.getToolState)(element, toolType); @@ -15926,33 +16404,33 @@ function activate(element, mouseButtonMask) { (0, _toolState.addToolState)(element, toolType, data); } - _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', dragEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', dragCallback); + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); + element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback); - _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); // If the displayed image changes after the user has started clicking, we should // Cancel the handlers and prepare for another click - element.addEventListener('cornerstonenewimage', newImageCallback); + element.addEventListener(_events2.default.NEW_IMAGE, newImageCallback); _externalModules2.default.cornerstone.updateImage(element); } // --- Touch tool enable / disable --- // function disableTouchDrag(element) { - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', dragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', recordStartPoint); - _externalModules2.default.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback); + element.removeEventListener(_events2.default.TOUCH_START, recordStartPoint); + element.removeEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); } function activateTouchDrag(element) { @@ -15964,15 +16442,15 @@ function activateTouchDrag(element) { (0, _toolState.addToolState)(element, toolType, data); } - _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', dragCallback); - _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', recordStartPoint); - _externalModules2.default.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback); + element.removeEventListener(_events2.default.TOUCH_START, recordStartPoint); + element.removeEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion); + element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); - _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', dragCallback); - _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', recordStartPoint); - _externalModules2.default.$(element).on('CornerstoneToolsDragEnd', applyWWWCRegion); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(_events2.default.TOUCH_DRAG, dragCallback); + element.addEventListener(_events2.default.TOUCH_START, recordStartPoint); + element.addEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion); + element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered); } function getConfiguration() { @@ -16002,7 +16480,7 @@ exports.wwwcRegion = wwwcRegion; exports.wwwcRegionTouch = wwwcRegionTouch; /***/ }), -/* 116 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16013,32 +16491,39 @@ Object.defineProperty(exports, "__esModule", { }); exports.zoomTouchDrag = exports.zoomTouchPinch = exports.zoomWheel = exports.zoom = undefined; +var _events = __webpack_require__(1); + +var _events2 = _interopRequireDefault(_events); + var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _simpleMouseButtonTool = __webpack_require__(13); +var _simpleMouseButtonTool = __webpack_require__(16); var _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool); -var _isMouseButtonEnabled = __webpack_require__(2); +var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); -var _mouseWheelTool = __webpack_require__(21); +var _mouseWheelTool = __webpack_require__(23); var _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool); -var _touchPinchTool = __webpack_require__(56); +var _touchPinchTool = __webpack_require__(57); var _touchPinchTool2 = _interopRequireDefault(_touchPinchTool); -var _touchDragTool = __webpack_require__(11); +var _touchDragTool = __webpack_require__(13); var _touchDragTool2 = _interopRequireDefault(_touchDragTool); +var _enabledElementTools = __webpack_require__(3); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var toolType = 'zoom'; var startPoints = void 0; function changeViewportScale(viewport, ticks) { @@ -16233,24 +16718,34 @@ function zoomToCenterStrategy(eventData, ticks) { _externalModules2.default.cornerstone.setViewport(element, viewport); } -function mouseUpCallback(e, eventData) { - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseUpCallback(e) { + var eventData = e.detail; + var element = eventData.element; + + element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback(e, eventData) { - if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback(e) { + var eventData = e.detail; + var element = eventData.element; + var options = (0, _enabledElementTools.getToolOptions)(toolType, element); + + if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { startPoints = eventData.startPoints; // Used for translateStrategy - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback); + element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback); + element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback); - return false; // False = cases jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } -function dragCallback(e, eventData) { +function dragCallback(e) { + var eventData = e.detail; + if (!eventData.deltaPoints.page.y) { return false; } @@ -16259,10 +16754,12 @@ function dragCallback(e, eventData) { zoom.strategy(eventData, ticks); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -function mouseWheelCallback(e, eventData) { +function mouseWheelCallback(e) { + var eventData = e.detail; var ticks = -eventData.direction / 4; // Allow inversion of the mouse wheel scroll via a configuration option @@ -16277,7 +16774,8 @@ function mouseWheelCallback(e, eventData) { _externalModules2.default.cornerstone.setViewport(eventData.element, viewport); } -function touchPinchCallback(e, eventData) { +function touchPinchCallback(e) { + var eventData = e.detail; var cornerstone = _externalModules2.default.cornerstone; var config = zoom.getConfiguration(); var viewport = eventData.viewport; @@ -16307,7 +16805,7 @@ function touchPinchCallback(e, eventData) { cornerstone.setViewport(element, viewport); } -var zoom = (0, _simpleMouseButtonTool2.default)(mouseDownCallback); +var zoom = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType); zoom.strategies = { default: defaultStrategy, @@ -16327,7 +16825,7 @@ exports.zoomTouchPinch = zoomTouchPinch; exports.zoomTouchDrag = zoomTouchDrag; /***/ }), -/* 117 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16342,17 +16840,17 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _brushTool = __webpack_require__(57); +var _brushTool = __webpack_require__(58); var _brushTool2 = _interopRequireDefault(_brushTool); -var _getCircle = __webpack_require__(58); +var _getCircle = __webpack_require__(59); var _getCircle2 = _interopRequireDefault(_getCircle); -var _drawBrush = __webpack_require__(59); +var _drawBrush = __webpack_require__(60); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -16398,29 +16896,39 @@ function paint(eventData) { _externalModules2.default.cornerstone.updateImage(element); } -function onMouseUp(e, eventData) { +function onMouseUp(e) { + var eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; dragging = false; } -function onMouseDown(e, eventData) { +function onMouseDown(e) { + var eventData = e.detail; + paint(eventData); dragging = true; lastImageCoords = eventData.currentPoints.image; } -function onMouseMove(e, eventData) { +function onMouseMove(e) { + var eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; _externalModules2.default.cornerstone.updateImage(eventData.element); } -function onDrag(e, eventData) { +function onDrag(e) { + var eventData = e.detail; + paint(eventData); dragging = true; lastImageCoords = eventData.currentPoints.image; } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + if (!lastImageCoords) { return; } @@ -16464,7 +16972,7 @@ brush.setConfiguration(configuration); exports.brush = brush; /***/ }), -/* 118 */ +/* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16479,17 +16987,17 @@ var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); -var _toolState = __webpack_require__(1); +var _toolState = __webpack_require__(2); -var _brushTool = __webpack_require__(57); +var _brushTool = __webpack_require__(58); var _brushTool2 = _interopRequireDefault(_brushTool); -var _getCircle = __webpack_require__(58); +var _getCircle = __webpack_require__(59); var _getCircle2 = _interopRequireDefault(_getCircle); -var _drawBrush = __webpack_require__(59); +var _drawBrush = __webpack_require__(60); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -16624,7 +17132,9 @@ function erase(eventData) { _externalModules2.default.cornerstone.updateImage(element); } -function onMouseUp(e, eventData) { +function onMouseUp(e) { + var eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; var configuration = adaptiveBrush.getConfiguration(); @@ -16633,7 +17143,9 @@ function onMouseUp(e, eventData) { _externalModules2.default.cornerstone.updateImage(eventData.element); } -function onMouseDown(e, eventData) { +function onMouseDown(e) { + var eventData = e.detail; + var element = eventData.element; var configuration = adaptiveBrush.getConfiguration(); var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId); @@ -16658,12 +17170,16 @@ function onMouseDown(e, eventData) { lastImageCoords = eventData.currentPoints.image; } -function onMouseMove(e, eventData) { +function onMouseMove(e) { + var eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; _externalModules2.default.cornerstone.updateImage(eventData.element); } -function onDrag(e, eventData) { +function onDrag(e) { + var eventData = e.detail; + if (configuration.draw === 0) { erase(eventData); } else { @@ -16674,7 +17190,9 @@ function onDrag(e, eventData) { lastImageCoords = eventData.currentPoints.image; } -function onImageRendered(e, eventData) { +function onImageRendered(e) { + var eventData = e.detail; + if (!lastImageCoords) { return; } @@ -16720,7 +17238,7 @@ adaptiveBrush.setConfiguration(configuration); exports.adaptiveBrush = adaptiveBrush; /***/ }), -/* 119 */ +/* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -16729,7 +17247,7 @@ exports.adaptiveBrush = adaptiveBrush; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = '1.1.2'; +exports.default = '2.0.0'; /***/ }) /******/ ]); diff --git a/dist/cornerstoneTools.js.map b/dist/cornerstoneTools.js.map index 134db0107..cb99ca3a5 100644 --- a/dist/cornerstoneTools.js.map +++ b/dist/cornerstoneTools.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 7cdeb7029b01093072ab","webpack:///./externalModules.js","webpack:///./stateManagement/toolState.js","webpack:///./util/isMouseButtonEnabled.js","webpack:///./util/triggerEvent.js","webpack:///./stateManagement/toolColors.js","webpack:///./stateManagement/toolStyle.js","webpack:///./util/drawTextBox.js","webpack:///./imageTools/mouseButtonTool.js","webpack:///./manipulators/drawHandles.js","webpack:///./imageTools/touchTool.js","webpack:///./stateManagement/loadHandlerManager.js","webpack:///./imageTools/touchDragTool.js","webpack:///./manipulators/anyHandlesOutsideImage.js","webpack:///./imageTools/simpleMouseButtonTool.js","webpack:///./stateManagement/textStyle.js","webpack:///./util/convertToVector3.js","webpack:///./stateManagement/imageIdSpecificStateManager.js","webpack:///./util/pointInsideBoundingBox.js","webpack:///./util/calculateSUV.js","webpack:///./manipulators/getHandleNearImagePoint.js","webpack:///./util/getMaxSimultaneousRequests.js","webpack:///./imageTools/mouseWheelTool.js","webpack:///./manipulators/moveHandle.js","webpack:///./manipulators/moveNewHandle.js","webpack:///./imageTools/displayTool.js","webpack:///./manipulators/moveNewHandleTouch.js","webpack:///./util/pointProjector.js","webpack:///./requestPool/requestPoolManager.js","webpack:///./imageTools/multiTouchDragTool.js","webpack:///./util/scroll.js","webpack:///./util/roundToDecimal.js","webpack:///./util/pointInEllipse.js","webpack:///./util/pauseEvent.js","webpack:///./util/getRGBPixels.js","webpack:///./util/copyPoints.js","webpack:///./stateManagement/toolCoordinates.js","webpack:///./manipulators/handleActivator.js","webpack:///./manipulators/moveAllHandles.js","webpack:///./timeSeriesTools/incrementTimePoint.js","webpack:///./referenceLines/calculateReferenceLine.js","webpack:///./referenceLines/renderActiveReferenceLine.js","webpack:///./orientation/index.js","webpack:///./util/setContextToDisplayFontSize.js","webpack:///./util/scrollToIndex.js","webpack:///./stackTools/stackScroll.js","webpack:///./util/getLuminance.js","webpack:///./util/drawEllipse.js","webpack:///./util/drawCircle.js","webpack:///./util/drawArrow.js","webpack:///./util/calculateEllipseStatistics.js","webpack:///./imageTools/keyboardTool.js","webpack:///./manipulators/touchMoveAllHandles.js","webpack:///./manipulators/touchMoveHandle.js","webpack:///./inputSources/preventGhostClick.js","webpack:///./imageTools/doubleTapTool.js","webpack:///./imageTools/mouseButtonRectangleTool.js","webpack:///./imageTools/touchPinchTool.js","webpack:///./paintingTools/brushTool.js","webpack:///./paintingTools/getCircle.js","webpack:///./paintingTools/drawBrush.js","webpack:///./index.js","webpack:///./referenceLines/index.js","webpack:///./referenceLines/referenceLinesTool.js","webpack:///./orientation/getOrientationString.js","webpack:///./orientation/invertOrientationString.js","webpack:///./timeSeriesTools/probeTool4D.js","webpack:///./measurementManager/measurementManager.js","webpack:///./measurementManager/lineSampleMeasurement.js","webpack:///./timeSeriesTools/timeSeriesPlayer.js","webpack:///./timeSeriesTools/timeSeriesScroll.js","webpack:///./synchronization/wwwcSynchronizer.js","webpack:///./synchronization/updateImageSynchronizer.js","webpack:///./synchronization/Synchronizer.js","webpack:///./synchronization/stackScrollSynchronizer.js","webpack:///./synchronization/stackImagePositionSynchronizer.js","webpack:///./synchronization/stackImagePositionOffsetSynchronizer.js","webpack:///./synchronization/stackImageIndexSynchronizer.js","webpack:///./synchronization/panZoomSynchronizer.js","webpack:///./stateManagement/timeSeriesSpecificStateManager.js","webpack:///./stateManagement/stackSpecificStateManager.js","webpack:///./stateManagement/frameOfReferenceStateManager.js","webpack:///./stateManagement/appState.js","webpack:///./stackTools/stackScrollKeyboard.js","webpack:///./stackTools/stackPrefetch.js","webpack:///./stackTools/scrollIndicator.js","webpack:///./stackTools/stackRenderers.js","webpack:///./stackTools/fusionRenderer.js","webpack:///./stackTools/playClip.js","webpack:///./inputSources/keyboardInput.js","webpack:///./inputSources/mouseInput.js","webpack:///./inputSources/mouseWheelInput.js","webpack:///./inputSources/touchInput.js","webpack:///./imageTools/angleTool.js","webpack:///./imageTools/arrowAnnotate.js","webpack:///./imageTools/crosshairs.js","webpack:///./imageTools/doubleTapZoom.js","webpack:///./imageTools/dragProbe.js","webpack:///./imageTools/ellipticalRoi.js","webpack:///./imageTools/freehand.js","webpack:///./imageTools/highlight.js","webpack:///./imageTools/imageStats.js","webpack:///./imageTools/length.js","webpack:///./imageTools/magnify.js","webpack:///./imageTools/orientationMarkers.js","webpack:///./imageTools/pan.js","webpack:///./imageTools/panMultiTouch.js","webpack:///./imageTools/probe.js","webpack:///./imageTools/rectangleRoi.js","webpack:///./imageTools/rotate.js","webpack:///./imageTools/rotateTouch.js","webpack:///./imageTools/saveAs.js","webpack:///./imageTools/seedAnnotate.js","webpack:///./imageTools/simpleAngle.js","webpack:///./imageTools/textMarker.js","webpack:///./imageTools/wwwc.js","webpack:///./imageTools/wwwcRegion.js","webpack:///./imageTools/zoom.js","webpack:///./paintingTools/brush.js","webpack:///./paintingTools/adaptiveBrush.js","webpack:///./version.js"],"names":["cornerstone","window","cornerstoneMath","$","Hammer","cs","cm","module","getElementToolStateManager","element","enabledImage","getEnabledElement","toolStateManager","undefined","addToolState","toolType","measurementData","add","eventType","eventData","getToolState","get","removeToolState","data","toolData","indexOfData","i","length","splice","clearToolState","setElementToolStateManager","which","mouseButtonMask","mouseButton","triggerEvent","el","type","detail","event","CustomEvent","toLocaleLowerCase","cancelable","document","createEvent","initCustomEvent","jqEvent","Event","trigger","isImmediatePropagationStopped","dispatchEvent","defaultColor","activeColor","fillColor","setFillColor","color","getFillColor","setToolColor","getToolColor","setActiveColor","getActiveColor","getColorIfActive","active","toolColors","defaultWidth","activeWidth","setToolWidth","width","getToolWidth","setActiveWidth","getActiveWidth","toolStyle","context","textLines","x","y","options","Object","prototype","toString","call","padding","font","getFont","fontSize","getFontSize","backgroundColor","getBackgroundColor","save","textBaseline","strokeStyle","maxWidth","forEach","text","measureText","Math","max","fillStyle","boundingBox","height","centering","left","top","debug","fillRect","index","fillText","restore","mouseToolInterface","configuration","addNewMeasurement","mouseEventData","createNewMeasurement","off","mouseMoveCallback","mouseDownCallback","mouseDownActivateCallback","mouseDoubleClickCallback","updateImage","handleMover","keys","handles","preventHandleOutsideImage","end","invalidated","on","e","setCoords","imageNeedsUpdate","coords","currentPoints","canvas","pointNearTool","handleDoneMove","startPoints","currentTarget","distance","handle","stopImmediatePropagation","deleteIfHandleOutsideImage","disable","removeEventListener","onImageRendered","enable","addEventListener","activate","deactivate","statusChangeEventData","getConfiguration","setConfiguration","config","toolInterface","renderData","name","drawnIndependently","drawHandlesIfActive","beginPath","lineWidth","handleCanvasCoords","pixelToCanvas","arc","handleRadius","PI","fill","stroke","deactivateAllHandles","deactivateAllToolInstances","touchTool","touchToolInterface","touchEventData","highlight","touchDownActivateCallback","tapCallback","touchStartCallback","preventDefault","doneMovingCallback","distanceSq","lastEvent","lastEventData","pressCallback","doubleTapCallback","defaultStartLoadHandler","defaultEndLoadHandler","defaultErrorLoadingHandler","setStartLoadHandler","handler","getStartLoadHandler","setEndLoadHandler","getEndLoadHandler","setErrorLoadingHandler","getErrorLoadingHandler","loadHandlerManager","touchDragCallback","events","fireOnTouchStart","activateCallback","disableCallback","enableCallback","deactivateCallback","image","imageRect","handleOutsideImage","allowedOutsideImage","point","insideRect","defaultFontSize","defaultFont","defaultBackgroundColor","setFont","setFontSize","setBackgroundColor","textStyle","convertToVector3","arrayOrVector3","Vector3","newImageIdSpecificToolStateManager","toolState","saveImageIdToolState","imageId","restoreImageIdToolState","imageIdToolState","saveToolState","restoreToolState","savedToolState","addImageIdSpecificToolState","hasOwnProperty","push","getImageIdSpecificToolState","clearImageIdSpecificToolStateManager","clear","globalImageIdSpecificToolStateManager","storedPixelValue","patientStudyModule","metaData","seriesModule","modality","modalityPixelValue","slope","intercept","patientWeight","petSequenceModule","radiopharmaceuticalInfo","startTime","radiopharmaceuticalStartTime","totalDose","radionuclideTotalDose","halfLife","radionuclideHalfLife","seriesAcquisitionTime","seriesTime","acquisitionTimeInSeconds","fracToDec","fractionalSeconds","seconds","minutes","hours","injectionStartTimeInSeconds","durationInSeconds","correctedDose","exp","log","suv","fractionalValue","parseFloat","distanceThreshold","nearbyHandle","pointNearHandle","hasBoundingBox","handleCanvas","configMaxSimultaneousRequests","maxSimultaneousRequests","default","IE","Firefox","Opera","Chrome","Safari","getBrowserInfo","ua","navigator","userAgent","M","match","tem","test","exec","slice","join","replace","appName","appVersion","setMaxSimultaneousRequests","newMaxSimultaneousRequests","getMaxSimultaneousRequests","getDefaultSimultaneousRequests","infoString","info","split","browserName","browserVersion","browserData","isMobileDevice","pattern","RegExp","mouseWheelCallback","distanceFromTool","mouseDragCallback","hasMoved","min","modifiedEventData","mouseUpCallback","moveCallback","whichMovement","moveEndCallback","measurementRemovedCallback","toolDeactivatedCallback","customEventOnImageRendered","imageCoords","pageToPixel","page","distanceFromTouch","projectPatientPointToImagePlane","imagePointToPatientPoint","planePlaneIntersection","patientPoint","imagePlane","rowCosines","columnCosines","imagePositionPatient","clone","sub","dot","columnPixelSpacing","rowPixelSpacing","imagePoint","multiplyScalar","getRectangleFromImagePlane","topLeft","topRight","columns","bottomLeft","rows","bottomRight","rect","Line3","right","bottom","lineRectangleIntersection","line","intersections","side","segment","intersection","intersectLine","targetImagePlane","referenceImagePlane","targetRowCosines","targetColumnCosines","targetImagePositionPatient","referenceRowCosines","referenceColumnCosines","referenceImagePositionPatient","targetNormal","cross","targetPlane","Plane","setFromNormalAndCoplanarPoint","referenceNormal","referencePlane","originDirection","intersectPlane","origin","direction","distanceTo","start","requestPool","interaction","thumbnail","prefetch","numRequests","maxNumRequests","awake","grabDelay","addRequest","preventCache","doneCallback","failCallback","Error","requestDetails","imagePromise","imageCache","getImagePromise","then","error","clearRequestStack","startAgain","setTimeout","startGrabbing","sendRequest","requestTypeToLoadPriority","priority","loader","loadImage","loadAndCacheImage","currentRequests","requestsToSend","getNextRequest","shift","getRequestPool","images","loop","stackData","newImageIdIndex","currentImageIdIndex","nbImages","imageIds","value","precision","multiplier","pow","round","ellipse","location","xRadius","yRadius","center","normalized","inEllipse","stopPropagation","cancelBubble","returnValue","enabledElement","storedPixelData","pixelData","getPixelData","spIndex","row","column","red","green","blue","alpha","points","copy","client","coordsData","getCoords","toolCoordinates","canvasPoint","activeHandle","getActiveHandle","movesIndependently","deltaPoints","timePoints","wrap","timeSeriesData","currentStack","stacks","currentStackIndex","newStackIndex","viewport","getViewport","newStack","startLoadingHandler","endLoadingHandler","errorLoadingHandler","displayImage","targetElement","referenceElement","targetImage","referenceImage","frameOfReferenceUID","angleInRadians","angleTo","abs","referenceLine","refLineStartCanvas","refLineEndCanvas","setTransform","moveTo","lineTo","orientation","getOrientationString","invertOrientationString","fontScale","setToPixelCoordinateSystem","scaledFontSize","scale","lineHeight","stackRenderer","stackRendererData","render","newImageId","retryLoadOnScroll","newImagePromise","state","removeImagePromise","Boolean","dragCallback","mouseDragEventData","deltaY","stackScroll","pixelsPerImage","stackScrollSpeed","imageDelta","imageIdIndexOffset","imageDeltaMod","stackScrollWheel","stackScrollTouchDrag","multiTouchDragCallback","stackScrollMultiTouch","testPointers","numPointers","luminance","w","h","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","closePath","headLength","angle","atan2","cos","sin","sp","sum","sumSquared","count","mean","variance","stdDev","sqrt","keyDownCallback","touchEndCallback","runAnimation","time","Date","getTime","fingerDistance","aboveFinger","targetLocation","touchEndEvents","handlePressed","animate","lastTime","distanceRemaining","linearDistEachFrame","console","requestAnimationFrame","antiGhostDelay","pointerType","mouse","touch","lastInteractionType","lastInteractionTime","handleTap","now","handleTapMouse","bind","handleTapTouch","attachEvents","eventList","interactionType","tapHandler","eventName","removeEvents","mouseEvents","touchEvents","preventGhostClick","pointInsideRect","touchPinchCallback","brushToolInterface","onMouseMove","onMouseUp","onDrag","onMouseDown","TOOL_STATE_TOOL_TYPE","Uint8ClampedArray","layer","getLayer","brushLayerId","setPixelData","invalid","brushTool","colormapId","colormap","colors","getColormap","setNumberOfColors","setColor","labelMapImage","minPixelValue","maxPixelValue","rgba","labelmap","invert","sizeInBytes","pixelReplication","addLayer","getCircle","radius","xCoord","yCoord","x0","y0","circleArray","drawBrushPixels","pointerArray","storedPixels","brushPixelValue","getPixelIndex","drawBrushOnCanvas","canvasContext","canvasPtTL","canvasPtBR","sizeX","sizeY","canvasPt","timeSeriesScroll","timeSeriesScrollWheel","timeSeriesScrollTouchDrag","addTimeSeriesStateManager","newTimeSeriesSpecificToolStateManager","stackSpecificStateManager","newStackSpecificToolStateManager","addStackStateManager","newFrameOfReferenceSpecificToolStateManager","globalFrameOfReferenceSpecificToolStateManager","playClip","stopClip","angleTouch","arrowAnnotate","arrowAnnotateTouch","crosshairs","crosshairsTouch","dragProbe","dragProbeTouch","ellipticalRoi","ellipticalRoiTouch","freehand","highlightTouch","lengthTouch","magnify","magnifyTouchDrag","pan","panTouchDrag","probe","probeTouch","rectangleRoi","rectangleRoiTouch","rotate","rotateTouchDrag","seedAnnotate","seedAnnotateTouch","simpleAngle","simpleAngleTouch","textMarker","textMarkerTouch","wwwc","wwwcTouchDrag","wwwcRegion","wwwcRegionTouch","zoom","zoomWheel","zoomTouchPinch","zoomTouchDrag","brush","adaptiveBrush","referenceLines","calculateReferenceLine","tool","renderActiveReferenceLine","syncContext","synchronizationContext","enabledElements","getSourceElements","renderer","getContext","referenceEnabledElement","vector","vec3","orientationX","orientationY","orientationZ","z","string","inverted","toUpperCase","updateLineSample","samples","timeSeries","stack","imageIdIndex","offset","sample","lineSample","set","timeSeriestoolData","visible","fontParameters","textX","textY","probeTool4D","MeasurementManager","that","measurements","measurement","eventDetail","remove","manager","framesPerSecond","timeSeriesToolData","playClipToolData","playClipData","intervalId","lastFrameTimeStamp","frameRate","setInterval","clearInterval","timeSeriesPlayer","stop","pixelsPerTimeSeries","timeSeriesScrollSpeed","timeSeriesDelta","timeSeriesDeltaMod","mouseMoveData","originalEvent","synchronizer","sourceElement","sourceViewport","targetViewport","voi","windowWidth","windowCenter","setViewport","Synchronizer","sourceElements","targetElements","ignoreFiredEvents","initialData","eventHandler","setHandler","getHandler","getDistances","distances","sourceEnabledElement","sourceImageId","sourceImagePlane","sourceImagePosition","targetEnabledElement","targetImageId","targetImagePosition","fireEvent","targetIndex","indexOf","sourceIndex","positionDifference","onEvent","addSource","updateDisableHandlers","addTarget","removeSource","removeTarget","getTargetElements","disableHandler","elements","unique","concat","destroy","stackToolDataSource","sourceImage","minDistance","Number","MAX_VALUE","imagePosition","distanceToSquared","finalPosition","sourceStackToolDataSource","sourceStackData","targetStackToolDataSource","targetStackData","translation","toolTypes","oldStateManager","addStackSpecificToolState","getStackSpecificToolState","imageIdToolStateManager","timeSeriesStateManagers","tools","timeSeriesSpecificStateManager","stackToolState","stackSpecificToolStateManager","stackStateManagers","otherTools","stackTools","addFrameOfReferenceSpecificToolState","frameOfReference","frameOfReferenceToolState","getFrameOfReferenceSpecificToolState","removeFrameOfReferenceSpecificToolState","saveApplicationState","appState","elementToolState","elementViewport","id","restoreApplicationState","elementId","getElementById","savedViewport","UP","DOWN","keyCode","stackScrollKeyboard","requestType","maxImagesToPrefetch","Infinity","resetPrefetchTimeout","resetPrefetchDelay","range","lowEnd","highEnd","arr","c","apply","nearestIndex","l","v","low","high","stackPrefetchData","stackPrefetch","indicesToRequest","enabled","removeFromList","sort","a","b","indicesToRequestCopy","nearest","nextImageIdIndex","lowerIndex","higherIndex","currentIndex","shouldSkipLower","shouldSkipHigher","shouldLoadLower","shouldLoadHigher","getPromiseRemovedHandler","onImageUpdated","clearTimeout","target","stackPrefetchDataArray","warn","indexOfCurrentImage","promiseRemovedHandler","scrollBarHeight","scrollIndicator","cursorWidth","cursorHeight","xPosition","yPosition","stackRenderers","FusionRenderer","layerIds","findImageFn","imageStacks","isInteger","baseImageObject","currentImageId","overlayImageStacks","baseImage","baseLayerId","setLayerImage","imgObj","overlayLayerIndex","layerIndex","currentLayerId","setActiveLayer","getPlayClipTimeouts","speed","delay","limit","timeouts","isTimeVarying","stopClipWithData","usingFrameTimeVector","triggerStopEvent","playClipTimeouts","stackToolData","frameTimeVector","ignoreFrameTimeVector","reverse","playClipAction","imageCount","playClipTimeoutHandler","mouseX","mouseY","keyPress","keyPressData","keyPressEvents","keydown","keypress","keyup","mouseMove","pageX","pageY","keyboardEvent","keyboardInput","isClickEvent","preventClickTimeout","clickDelay","getEventWhich","buttons","preventClickHandler","mouseDoubleClick","pageToPoint","clientX","clientY","lastPoints","mouseDown","eventPropagated","whichMouseButton","subtract","ctrlKey","metaKey","shiftKey","mouseInput","mouseWheel","wheelDeltaY","axis","startingCoords","wheelDelta","mouseWheelData","imageX","imageY","mouseWheelEvents","unbind","mouseWheelInput","touchStartDelay","pressTimeout","pageDistanceMoved","lastScale","lastRotation","preventNextPinch","isPress","lastDelta","pressDelay","pressMaxDistance","onTouch","srcEvent","scaleChange","delta","remainingPointers","rotation","pointers","touches","isTouchEvent","changedTouches","deltaX","changedPointers","hammerOptions","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","TouchInput","mc","Manager","panOptions","DIRECTION_ALL","threshold","Pan","pinch","Pinch","Rotate","recognizeWith","doubleTap","Tap","taps","interval","posThreshold","touchInput","angleData","start2","end2","lineSegment","distanceToPoint","shadow","shadowColor","shadowOffsetX","shadowOffsetY","handleStartCanvas","handleEndCanvas","dx1","ceil","dy1","dx2","dy2","acos","rAngle","str","String","fromCharCode","parseInt","getTextCallback","doneChangingTextCallback","prompt","changeTextCallback","drawHandles","drawHandlesOnHover","arrowFirst","textBox","handleOptions","textWidth","textHeight","textCoords","transform","internal","getTransform","transformPoint","link","midpointCanvas","findClosestPoint","boundingBoxPoints","setLineDash","addNewMeasurementTouch","doubleClickCallback","updatedText","deleteTool","chooseLocation","sourceImagePoint","normal","dragEndCallback","dragStartCallback","enableTouch","disableTouch","fitToWindowStrategy","fitToWindow","doubleTapZoom","strategy","strategies","dragEventData","defaultStrategy","fontHeight","getStoredPixels","mo","toFixed","minimalStrategy","toolCoords","modalityPixelValueText","imageRenderedCallback","minimal","pointNearEllipse","startCanvas","endCanvas","minorEllipse","majorEllipse","pointInMinorEllipse","pointInMajorEllipse","pointNearToolTouch","numberWithCommas","parts","leftCanvas","topCanvas","widthCanvas","heightCanvas","area","meanStdDev","meanStdDevSUV","pixels","getPixels","isNaN","moSuffix","meanText","stdDevText","SUVtext","suffix","areaText","ellipsePoints","mouseLocation","modifying","currentHandle","currentTool","addPoint","handleData","lines","toolIndex","mousePoint","pointNearHandleAllTools","handleNearby","lastLineIndex","lastLine","startDrawing","endDrawing","nearby","handleStart","j","k","lineCanvas","mouseLocationCanvas","existingToolData","insideBox","clientWidth","clientHeight","strokeRect","stats","key","imageStats","colPixelSpacing","rowImagePixelSpacing","colImagePixelSpacing","dx","dy","magnifySize","magnificationLevel","newImageCallback","hideTool","find","hide","body","style","cursor","drawMagnificationTool","magnifyCanvas","createMagnificationCanvas","not","zoomCtx","getSize","canvasLocation","clearRect","copyFrom","scaledMagnify","drawImage","display","createElement","classList","position","appendChild","removeMagnificationCanvas","getOrientationMarkers","imagePlaneMetaData","rowString","columnString","oppositeRowString","oppositeColumnString","getOrientationMarkerPositions","markers","textWidths","orientationMarkers","drawAllMarkers","widthScale","heightScale","touchPanCallback","panMultiTouch","calculateMeanStdDev","getBoundingClientRect","pointsFromCenter","rotationRadians","rotationDegrees","horizontalStrategy","verticalStrategy","horizontal","vertical","touchRotateCallback","rotateTouch","filename","mimetype","lnk","download","href","toDataURL","initMouseEvent","doneGetTextCallback","currentLetter","currentNumber","showCoordinates","countUp","realCoords","canvasWidth","textPlusCoords","middle","handleMiddleCanvas","sideA","sideB","sideC","sideALength","sideBLength","sideCLength","touchMoveCallback","current","ascending","insideBoundingBox","mouseButtonData","touchPressCallback","maxVOI","minVOI","imageDynamicRange","dragData","minWindowWidth","currentMouseButtonMask","calculateMinMaxMean","storedPixelLuminanceData","globalMin","globalMax","numPixels","spv","mouseData","endPoint","applyWWWCRegion","startPoint","floor","pixelLuminanceData","minMaxMean","recordStartPoint","startPointCanvas","endPointCanvas","disableTouchDrag","activateTouchDrag","changeViewportScale","ticks","oldFactor","factor","maxScale","minScale","boundPosition","correctShift","hflip","vflip","cosA","sinA","newX","newY","newCoords","translateStrategy","translateSpeed","outwardsMinScaleToTranslate","minTranslation","preventZoomOutsideImage","desiredTranslation","distanceToDesired","zoomToCenterStrategy","translate","zoomToCenter","draw","hoverColor","dragColor","lastImageCoords","dragging","paint","tolerance","minRadius","thrMax","thrMin","currentRadius","getGreyValues","imageColumns","minValue","maxValue","pixelIndex","greyValue","paintAdaptiveBrush","imagePixelData","brushPixelData","numPixelsOutsideThresholdWindow","pixelValue","baseLayer","getLayers","brushData","erase"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;AC7DA,IAAIA,cAAcC,OAAOD,WAAzB;AACA,IAAIE,kBAAkBD,OAAOC,eAA7B;AACA,IAAIC,IAAIF,OAAOE,CAAf;AACA,IAAIC,SAASH,OAAOG,MAApB;;kBAEe;AACb,MAAIJ,WAAJ,CAAiBK,EAAjB,EAAqB;AACnBL,kBAAcK,EAAd;AACD,GAHY;AAIb,MAAIL,WAAJ,GAAmB;AACjB,WAAOA,WAAP;AACD,GANY;AAOb,MAAIE,eAAJ,CAAqBI,EAArB,EAAyB;AACvBJ,sBAAkBI,EAAlB;AACD,GATY;AAUb,MAAIJ,eAAJ,GAAuB;AACrB,WAAOA,eAAP;AACD,GAZY;AAab,MAAIC,CAAJ,CAAOI,MAAP,EAAe;AACbJ,QAAII,MAAJ;AACD,GAfY;AAgBb,MAAIJ,CAAJ,GAAS;AACP,WAAOA,CAAP;AACD,GAlBY;AAmBb,MAAIC,MAAJ,CAAYG,MAAZ,EAAoB;AAClBH,aAASG,MAAT;AACD,GArBY;AAsBb,MAAIH,MAAJ,GAAc;AACZ,WAAOA,MAAP;AACD;AAxBY,C;;;;;;;;;;;;;;ACLf;;;;AACA;;AACA;;;;;;AAEA,SAASI,0BAAT,CAAqCC,OAArC,EAA8C;AAC5C,MAAMC,eAAe,0BAASV,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAArB;AACA;AACA;;AAEA,MAAIC,aAAaE,gBAAb,KAAkCC,SAAtC,EAAiD;AAC/CH,iBAAaE,gBAAb;AACD;;AAED,SAAOF,aAAaE,gBAApB;AACD;;AAED;AACA;AACA,SAASE,YAAT,CAAuBL,OAAvB,EAAgCM,QAAhC,EAA0CC,eAA1C,EAA2D;AACzD,MAAMJ,mBAAmBJ,2BAA2BC,OAA3B,CAAzB;;AAEAG,mBAAiBK,GAAjB,CAAqBR,OAArB,EAA8BM,QAA9B,EAAwCC,eAAxC;;AAEA,MAAME,YAAY,kCAAlB;AACA,MAAMC,YAAY;AAChBJ,sBADgB;AAEhBN,oBAFgB;AAGhBO;AAHgB,GAAlB;;AAMA,8BAAaP,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACD;;AAED;AACA;AACA,SAASC,YAAT,CAAuBX,OAAvB,EAAgCM,QAAhC,EAA0C;AACxC,MAAMH,mBAAmBJ,2BAA2BC,OAA3B,CAAzB;;AAGA,SAAOG,iBAAiBS,GAAjB,CAAqBZ,OAArB,EAA8BM,QAA9B,CAAP;AACD;;AAED,SAASO,eAAT,CAA0Bb,OAA1B,EAAmCM,QAAnC,EAA6CQ,IAA7C,EAAmD;AACjD,MAAMX,mBAAmBJ,2BAA2BC,OAA3B,CAAzB;AACA,MAAMe,WAAWZ,iBAAiBS,GAAjB,CAAqBZ,OAArB,EAA8BM,QAA9B,CAAjB;AACA;AACA,MAAIU,cAAc,CAAC,CAAnB;;AAEA,OAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C,QAAIF,SAASD,IAAT,CAAcG,CAAd,MAAqBH,IAAzB,EAA+B;AAC7BE,oBAAcC,CAAd;AACD;AACF;;AAED,MAAID,gBAAgB,CAAC,CAArB,EAAwB;AACtBD,aAASD,IAAT,CAAcK,MAAd,CAAqBH,WAArB,EAAkC,CAAlC;;AAEA,QAAMP,YAAY,oCAAlB;AACA,QAAMC,YAAY;AAChBJ,wBADgB;AAEhBN,sBAFgB;AAGhBO,uBAAiBO;AAHD,KAAlB;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACD;AACF;;AAED,SAASU,cAAT,CAAyBpB,OAAzB,EAAkCM,QAAlC,EAA4C;AAC1C,MAAMH,mBAAmBJ,2BAA2BC,OAA3B,CAAzB;AACA,MAAMe,WAAWZ,iBAAiBS,GAAjB,CAAqBZ,OAArB,EAA8BM,QAA9B,CAAjB;;AAEA;AACA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1BW,aAASD,IAAT,GAAgB,EAAhB;AACD;AACF;;AAED;AACA,SAASO,0BAAT,CAAqCrB,OAArC,EAA8CG,gBAA9C,EAAgE;AAC9D,MAAMF,eAAe,0BAASV,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAArB;;AAEAC,eAAaE,gBAAb,GAAgCA,gBAAhC;AACD;;QAGCE,Y,GAAAA,Y;QACAM,Y,GAAAA,Y;QACAE,e,GAAAA,e;QACAO,c,GAAAA,c;QACAC,0B,GAAAA,0B;QACAtB,0B,GAAAA,0B;;;;;;;;;;;;;kBCzFa,UAAUuB,KAAV,EAAiBC,eAAjB,EAAkC;AAC/C,MAAMC,cAAe,KAAMF,QAAQ,CAAnC;;AAGA,SAAQ,CAACC,kBAAkBC,WAAnB,MAAoC,CAA5C;AACD,C;;;;;;;;;;;;kBCGuBC,Y;;AAVxB;;;;;;AAEA;;;;;;;;AAQe,SAASA,YAAT,CAAuBC,EAAvB,EAA2BC,IAA3B,EAAgD;AAAA,MAAfC,MAAe,uEAAN,IAAM;;AAC7D,MAAIC,cAAJ;;AAEA;AACA,MAAI,OAAOrC,OAAOsC,WAAd,KAA8B,UAAlC,EAA8C;AAC5CD,YAAQ,IAAIC,WAAJ,CAAgBH,KAAKI,iBAAL,EAAhB,EAA0C;AAChDH,oBADgD;AAEhDI,kBAAY;AAFoC,KAA1C,CAAR;AAID,GALD,MAKO;AACLH,YAAQI,SAASC,WAAT,CAAqB,aAArB,CAAR;AACAL,UAAMM,eAAN,CAAsBR,KAAKI,iBAAL,EAAtB,EAAgD,IAAhD,EAAsD,IAAtD,EAA4DH,MAA5D;AACD;;AAED;AACA,MAAMQ,UAAU,0BAAS1C,CAAT,CAAW2C,KAAX,CAAiBV,IAAjB,EAAuBC,MAAvB,CAAhB;;AAEA,4BAASlC,CAAT,CAAWgC,EAAX,EAAeY,OAAf,CAAuBF,OAAvB,EAAgCR,MAAhC;AACA,MAAIQ,QAAQG,6BAAR,EAAJ,EAA6C;AAC3C,WAAO,KAAP;AACD;;AAED,SAAOb,GAAGc,aAAH,CAAiBX,KAAjB,CAAP;AACD,C;;;;;;;;;;;;;AChCD,IAAIY,eAAe,OAAnB;AAAA,IACEC,cAAc,aADhB;AAAA,IAEEC,YAAY,aAFd;;AAIA,SAASC,YAAT,CAAuBC,KAAvB,EAA8B;AAC5BF,cAAYE,KAAZ;AACD;;AAED,SAASC,YAAT,GAAyB;AACvB,SAAOH,SAAP;AACD;;AAED,SAASI,YAAT,CAAuBF,KAAvB,EAA8B;AAC5BJ,iBAAeI,KAAf;AACD;;AAED,SAASG,YAAT,GAAyB;AACvB,SAAOP,YAAP;AACD;;AAED,SAASQ,cAAT,CAAyBJ,KAAzB,EAAgC;AAC9BH,gBAAcG,KAAd;AACD;;AAED,SAASK,cAAT,GAA2B;AACzB,SAAOR,WAAP;AACD;;AAED,SAASS,gBAAT,CAA2BC,MAA3B,EAAmC;AACjC,SAAOA,SAASV,WAAT,GAAuBD,YAA9B;AACD;;AAED,IAAMY,aAAa;AACjBT,4BADiB;AAEjBE,4BAFiB;AAGjBC,4BAHiB;AAIjBC,4BAJiB;AAKjBC,gCALiB;AAMjBC,gCANiB;AAOjBC;AAPiB,CAAnB;;kBAUeE,U;;;;;;;;;;;;AC3Cf,IAAIC,eAAe,CAAnB;AAAA,IACEC,cAAc,CADhB;;AAGA,SAASC,YAAT,CAAuBC,KAAvB,EAA8B;AAC5BH,iBAAeG,KAAf;AACD;;AAED,SAASC,YAAT,GAAyB;AACvB,SAAOJ,YAAP;AACD;;AAED,SAASK,cAAT,CAAyBF,KAAzB,EAAgC;AAC9BF,gBAAcE,KAAd;AACD;;AAED,SAASG,cAAT,GAA2B;AACzB,SAAOL,WAAP;AACD;;AAED,IAAMM,YAAY;AAChBL,4BADgB;AAEhBE,4BAFgB;AAGhBC,gCAHgB;AAIhBC;AAJgB,CAAlB;;kBAOeC,S;;;;;;;;;;;;;kBCxBA,UAAUC,OAAV,EAAmBC,SAAnB,EAA8BC,CAA9B,EAAiCC,CAAjC,EAAoCpB,KAApC,EAA2CqB,OAA3C,EAAoD;AACjE,MAAIC,OAAOC,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BP,SAA/B,MAA8C,gBAAlD,EAAoE;AAClEA,gBAAY,CAACA,SAAD,CAAZ;AACD;;AAED,MAAMQ,UAAU,CAAhB;AACA,MAAMC,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMC,WAAW,oBAAUC,WAAV,EAAjB;AACA,MAAMC,kBAAkB,oBAAUC,kBAAV,EAAxB;;AAEAf,UAAQgB,IAAR;AACAhB,UAAQU,IAAR,GAAeA,IAAf;AACAV,UAAQiB,YAAR,GAAuB,KAAvB;AACAjB,UAAQkB,WAAR,GAAsBnC,KAAtB;;AAEA;AACA,MAAIoC,WAAW,CAAf;;AAEAlB,YAAUmB,OAAV,CAAkB,UAAUC,IAAV,EAAgB;AAChC;AACA,QAAM1B,QAAQK,QAAQsB,WAAR,CAAoBD,IAApB,EAA0B1B,KAAxC;;AAEA;AACAwB,eAAWI,KAAKC,GAAL,CAASL,QAAT,EAAmBxB,KAAnB,CAAX;AACD,GAND;;AAQA;AACAK,UAAQyB,SAAR,GAAoBX,eAApB;;AAEA;AACA,MAAMY,cAAc;AAClB/B,WAAOwB,WAAYV,UAAU,CADX;AAElBkB,YAAQlB,UAAUR,UAAU7C,MAAV,IAAoBwD,WAAWH,OAA/B;AAFA,GAApB;;AAKA,MAAIL,WAAWA,QAAQwB,SAAnB,IAAgCxB,QAAQwB,SAAR,CAAkB1B,CAAlB,KAAwB,IAA5D,EAAkE;AAChEA,SAAKwB,YAAY/B,KAAZ,GAAoB,CAAzB;AACD;;AAED,MAAIS,WAAWA,QAAQwB,SAAnB,IAAgCxB,QAAQwB,SAAR,CAAkBzB,CAAlB,KAAwB,IAA5D,EAAkE;AAChEA,SAAKuB,YAAYC,MAAZ,GAAqB,CAA1B;AACD;;AAEDD,cAAYG,IAAZ,GAAmB3B,CAAnB;AACAwB,cAAYI,GAAZ,GAAkB3B,CAAlB;;AAEA,MAAIC,WAAWA,QAAQ2B,KAAR,KAAkB,IAAjC,EAAuC;AACrC/B,YAAQyB,SAAR,GAAoB,SAApB;AACD;;AAEDzB,UAAQgC,QAAR,CAAiBN,YAAYG,IAA7B,EAAmCH,YAAYI,GAA/C,EAAoDJ,YAAY/B,KAAhE,EAAuE+B,YAAYC,MAAnF;;AAEA;AACA1B,YAAUmB,OAAV,CAAkB,UAAUC,IAAV,EAAgBY,KAAhB,EAAuB;AACvCjC,YAAQyB,SAAR,GAAoB1C,KAApB;;AAEA;;;;;;;AAOAiB,YAAQkC,QAAR,CAAiBb,IAAjB,EAAuBnB,IAAIO,OAA3B,EAAoCN,IAAIM,OAAJ,GAAcwB,SAASrB,WAAWH,OAApB,CAAlD;AACD,GAXD;;AAaAT,UAAQmC,OAAR;;AAEA;AACA,SAAOT,WAAP;AACD,C;;AAxED;;;;;;;;;;;;;;;;;kBCYe,UAAUU,kBAAV,EAA8B;AAC3C,MAAIC,gBAAgB,EAApB;;AAEA;AACA,WAASC,iBAAT,CAA4BC,cAA5B,EAA4C;AAC1C,QAAM9G,cAAc,0BAASA,WAA7B;AACA,QAAMS,UAAUqG,eAAerG,OAA/B;;AAEA,QAAMO,kBAAkB2F,mBAAmBI,oBAAnB,CAAwCD,cAAxC,CAAxB;;AAEA,QAAI,CAAC9F,eAAL,EAAsB;AACpB;AACD;;AAED,QAAMG,YAAY;AAChBa,uBAAiB8E,eAAe/E;AADhB,KAAlB;;AAIA;AACA,iCAAa+E,eAAerG,OAA5B,EAAqCkG,mBAAmB5F,QAAxD,EAAkEC,eAAlE;;AAEA;AACA;AACA,8BAASb,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBO,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DL,mBAAmBQ,yBAAnB,IAAgDA,yBAA7G;;AAEA,QAAIR,mBAAmBS,wBAAvB,EAAiD;AAC/C,gCAASjH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DL,mBAAmBS,wBAA/E;AACD;;AAEDpH,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI6G,oBAAJ;;AAEA,QAAI1C,OAAO2C,IAAP,CAAYvG,gBAAgBwG,OAA5B,EAAqC7F,MAArC,KAAgD,CAApD,EAAuD;AACrD2F;AACD,KAFD,MAEO;AACLA;AACD;;AAED,QAAIG,kCAAJ;;AAEA,QAAId,mBAAmBhC,OAAnB,IAA8BgC,mBAAmBhC,OAAnB,CAA2B8C,yBAA3B,KAAyD5G,SAA3F,EAAsG;AACpG4G,kCAA4Bd,mBAAmBhC,OAAnB,CAA2B8C,yBAAvD;AACD,KAFD,MAEO;AACLA,kCAA4B,KAA5B;AACD;;AAEDH,gBAAYR,cAAZ,EAA4BH,mBAAmB5F,QAA/C,EAAyDC,eAAzD,EAA0EA,gBAAgBwG,OAAhB,CAAwBE,GAAlG,EAAuG,YAAY;AACjH1G,sBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7C,sBAAgB2G,WAAhB,GAA8B,IAA9B;AACA,UAAI,sCAAuBb,cAAvB,EAAuC9F,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,wCAAgB/G,OAAhB,EAAyBkG,mBAAmB5F,QAA5C,EAAsDC,eAAtD;AACD;;AAED,gCAASb,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBM,iBAAnB,IAAwCA,iBAAvG;AACA,gCAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBO,iBAAnB,IAAwCA,iBAAvG;AACA,gCAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuEwF,mBAAmBQ,yBAAnB,IAAgDA,yBAAvH;;AAEA,UAAIR,mBAAmBS,wBAAvB,EAAiD;AAC/C,kCAASjH,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DzG,SAA3D,EAAsEwF,mBAAmBS,wBAAzF;AACD;;AAEDpH,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,KAjBD,EAiBGgH,yBAjBH;AAkBD;;AAED,WAASN,yBAAT,CAAoCU,CAApC,EAAuC1G,SAAvC,EAAkD;AAChD,QAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,UAAI2E,mBAAmBE,iBAAvB,EAA0C;AACxCF,2BAAmBE,iBAAnB,CAAqC1F,SAArC;AACD,OAFD,MAEO;AACL0F,0BAAkB1F,SAAlB;AACD;;AAED,aAAO,KAAP,CAPiE,CAOnD;AACf;AACF;;AAED;;AAEA;;AAEA,WAAS8F,iBAAT,CAA4BY,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,8BAAgB2G,SAAhB,CAA0B3G,SAA1B;AACA;AACA,QAAIA,UAAUY,KAAV,KAAoB,CAAxB,EAA2B;AACzB;AACD;;AAED;AACA,QAAMP,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCkG,mBAAmB5F,QAAnD,CAAjB;;AAEA,QAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED;AACA;AACA,QAAIuG,mBAAmB,KAAvB;;AAEA,SAAK,IAAIrG,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C;AACA,UAAMsG,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;;AAEA,UAAM3G,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,UAAI,+BAAgBP,UAAUV,OAA1B,EAAmCc,KAAKiG,OAAxC,EAAiDQ,MAAjD,MAA6D,IAAjE,EAAuE;AACrED,2BAAmB,IAAnB;AACD;;AAED,UAAKpB,mBAAmBwB,aAAnB,CAAiChH,UAAUV,OAA3C,EAAoDc,IAApD,EAA0DyG,MAA1D,KAAqE,CAACzG,KAAKsC,MAA5E,IAAwF,CAAC8C,mBAAmBwB,aAAnB,CAAiChH,UAAUV,OAA3C,EAAoDc,IAApD,EAA0DyG,MAA1D,CAAD,IAAsEzG,KAAKsC,MAAvK,EAAgL;AAC9KtC,aAAKsC,MAAL,GAAc,CAACtC,KAAKsC,MAApB;AACAkE,2BAAmB,IAAnB;AACD;AACF;;AAED;AACA,QAAIA,qBAAqB,IAAzB,EAA+B;AAC7B,gCAAS/H,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;AACF;;AAED,WAASyG,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,QAAII,aAAJ;AACA,QAAMd,UAAUU,UAAUV,OAA1B;;AAEA,aAAS2H,cAAT,GAA2B;AACzB7G,WAAKoG,WAAL,GAAmB,IAAnB;AACA,UAAI,sCAAuBxG,SAAvB,EAAkCI,KAAKiG,OAAvC,CAAJ,EAAqD;AACnD;AACA,wCAAgB/G,OAAhB,EAAyBkG,mBAAmB5F,QAA5C,EAAsDQ,IAAtD;AACD;;AAED,gCAASvB,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACA,gCAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBM,iBAAnB,IAAwCA,iBAAvG;AACD;;AAED,QAAI,CAAC,oCAAqB9F,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAL,EAAoE;AAClE;AACD;;AAED,QAAMgG,SAAS7G,UAAUkH,WAAV,CAAsBH,MAArC;AACA,QAAM1G,WAAW,6BAAaqG,EAAES,aAAf,EAA8B3B,mBAAmB5F,QAAjD,CAAjB;;AAEA,QAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,QAAIE,UAAJ;;AAEA;;AAEA,QAAI+F,kCAAJ;;AAEA,QAAId,mBAAmBhC,OAAnB,IAA8BgC,mBAAmBhC,OAAnB,CAA2B8C,yBAA3B,KAAyD5G,SAA3F,EAAsG;AACpG4G,kCAA4Bd,mBAAmBhC,OAAnB,CAA2B8C,yBAAvD;AACD,KAFD,MAEO;AACLA,kCAA4B,KAA5B;AACD;;AAED,SAAK/F,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,aAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,UAAM6G,WAAW,CAAjB;AACA,UAAMC,SAAS,uCAAwB/H,OAAxB,EAAiCc,KAAKiG,OAAtC,EAA+CQ,MAA/C,EAAuDO,QAAvD,CAAf;;AAEA,UAAIC,MAAJ,EAAY;AACV,kCAASrI,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA1F,aAAKsC,MAAL,GAAc,IAAd;AACA,kCAAW1C,SAAX,EAAsBwF,mBAAmB5F,QAAzC,EAAmDQ,IAAnD,EAAyDiH,MAAzD,EAAiEJ,cAAjE,EAAiFX,yBAAjF;AACAI,UAAEY,wBAAF;;AAEA,eAAO,KAAP;AACD;AACF;;AAED;AACA;AACA,QAAI,CAAC9B,mBAAmBwB,aAAxB,EAAuC;AACrC;AACD;;AAED,QAAMxD,UAAUgC,mBAAmBhC,OAAnB,IAA8B;AAC5C+D,kCAA4B,IADgB;AAE5CjB,iCAA2B;AAFiB,KAA9C;;AAKA,SAAK/F,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,aAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACAH,WAAKsC,MAAL,GAAc,KAAd;AACA,UAAI8C,mBAAmBwB,aAAnB,CAAiC1H,OAAjC,EAA0Cc,IAA1C,EAAgDyG,MAAhD,CAAJ,EAA6D;AAC3DzG,aAAKsC,MAAL,GAAc,IAAd;AACA,kCAAS1D,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA,sCAAeY,CAAf,EAAkBtG,IAAlB,EAAwBC,QAAxB,EAAkCmF,mBAAmB5F,QAArD,EAA+D4D,OAA/D,EAAwEyD,cAAxE;AACAP,UAAEY,wBAAF;;AAEA,eAAO,KAAP;AACD;AACF;AACF;AACD;;AAEA;AACA,WAASE,OAAT,CAAkBlI,OAAlB,EAA2B;AACzBA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBO,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DL,mBAAmBQ,yBAAnB,IAAgDA,yBAA7G;;AAEA,QAAIR,mBAAmBS,wBAAvB,EAAiD;AAC/C,gCAASjH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DL,mBAAmBS,wBAA/E;AACD;;AAED,8BAASpH,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA;AACA;AACA,WAASoI,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3BlB,uBAAmBkC,eAAnB,CAAmChB,CAAnC,EAAsCA,EAAExF,MAAxC;AACD;;AAED;AACA,WAASyG,MAAT,CAAiBrI,OAAjB,EAA0B;AACxBA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBO,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DL,mBAAmBQ,yBAAnB,IAAgDA,yBAA7G;;AAEA,QAAIR,mBAAmBS,wBAAvB,EAAiD;AAC/C,gCAASjH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DL,mBAAmBS,wBAA/E;AACD;;AAED3G,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;;AAEA,8BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASuI,QAAT,CAAmBvI,OAAnB,EAA4BuB,eAA5B,EAA6C;AAC3C,QAAMb,YAAY;AAChBa;AADgB,KAAlB;;AAIAvB,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBO,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DL,mBAAmBQ,yBAAnB,IAAgDA,yBAA7G;;AAEA1G,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBM,iBAAnB,IAAwCA,iBAAvG;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBO,iBAAnB,IAAwCA,iBAAvG;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuEwF,mBAAmBQ,yBAAnB,IAAgDA,yBAAvH;;AAEA,QAAIR,mBAAmBS,wBAAvB,EAAiD;AAC/C,gCAASjH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DL,mBAAmBS,wBAA/E;AACA,gCAASjH,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DzG,SAA3D,EAAsEwF,mBAAmBS,wBAAzF;AACD;;AAED,8BAASpH,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASwI,UAAT,CAAqBxI,OAArB,EAA8BuB,eAA9B,EAA+C;AAC7C,QAAMb,YAAY;AAChBa;AADgB,KAAlB;;AAIA,QAAMd,YAAY,iCAAlB;AACA,QAAMgI,wBAAwB;AAC5BlH,sCAD4B;AAE5BjB,gBAAU4F,mBAAmB5F,QAFD;AAG5BqB,YAAMlB;AAHsB,KAA9B;;AAMA,gCAAaT,OAAb,EAAsBS,SAAtB,EAAiCgI,qBAAjC;;AAEAzI,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBM,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDL,mBAAmBO,iBAAnB,IAAwCA,iBAA7F;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DL,mBAAmBQ,yBAAnB,IAAgDA,yBAA7G;;AAEA1G,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBM,iBAAnB,IAAwCA,iBAAvG;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DwF,mBAAmBO,iBAAnB,IAAwCA,iBAAvG;;AAEA,QAAIP,mBAAmBS,wBAAvB,EAAiD;AAC/C,gCAASjH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DL,mBAAmBS,wBAA/E;AACA,gCAASjH,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DzG,SAA3D,EAAsEwF,mBAAmBS,wBAAzF;AACD;;AAED,QAAIT,mBAAmBsC,UAAvB,EAAmC;AACjCtC,yBAAmBsC,UAAnB,CAA8BxI,OAA9B,EAAuCuB,eAAvC;AACD;;AAED,8BAAShC,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,WAAS0I,gBAAT,GAA6B;AAC3B,WAAOvC,aAAP;AACD;;AAED,WAASwC,gBAAT,CAA2BC,MAA3B,EAAmC;AACjCzC,oBAAgByC,MAAhB;AACD;;AAED,MAAMC,gBAAgB;AACpBR,kBADoB;AAEpBH,oBAFoB;AAGpBK,sBAHoB;AAIpBC,0BAJoB;AAKpBE,sCALoB;AAMpBC,sCANoB;AAOpBlC,wCAPoB;AAQpBD,wCARoB;AASpBE;AAToB,GAAtB;;AAYE;AACF,MAAIR,mBAAmBwB,aAAvB,EAAsC;AACpCmB,kBAAcnB,aAAd,GAA8BxB,mBAAmBwB,aAAjD;AACD;;AAED,MAAIxB,mBAAmBS,wBAAvB,EAAiD;AAC/CkC,kBAAclC,wBAAd,GAAyCT,mBAAmBS,wBAA5D;AACD;;AAED,MAAIT,mBAAmBE,iBAAvB,EAA0C;AACxCyC,kBAAczC,iBAAd,GAAkCF,mBAAmBE,iBAArD;AACD;;AAED,SAAOyC,aAAP;AACD,C;;AA3VD;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCLe,UAAU/E,OAAV,EAAmBgF,UAAnB,EAA+B/B,OAA/B,EAAwClE,KAAxC,EAA+CqB,OAA/C,EAAwD;AACrEJ,UAAQkB,WAAR,GAAsBnC,KAAtB;;AAEAsB,SAAO2C,IAAP,CAAYC,OAAZ,EAAqB7B,OAArB,CAA6B,UAAU6D,IAAV,EAAgB;AAC3C,QAAMhB,SAAShB,QAAQgC,IAAR,CAAf;;AAEA,QAAIhB,OAAOiB,kBAAP,KAA8B,IAAlC,EAAwC;AACtC;AACD;;AAED,QAAI9E,WAAWA,QAAQ+E,mBAAR,KAAgC,IAA3C,IAAmD,CAAClB,OAAO3E,MAA/D,EAAuE;AACrE;AACD;;AAEDU,YAAQoF,SAAR;;AAEA,QAAInB,OAAO3E,MAAX,EAAmB;AACjBU,cAAQqF,SAAR,GAAoB,oBAAUvF,cAAV,EAApB;AACD,KAFD,MAEO;AACLE,cAAQqF,SAAR,GAAoB,oBAAUzF,YAAV,EAApB;AACD;;AAED,QAAM0F,qBAAqB,0BAAS7J,WAAT,CAAqB8J,aAArB,CAAmCP,WAAW9I,OAA9C,EAAuD+H,MAAvD,CAA3B;;AAEAjE,YAAQwF,GAAR,CAAYF,mBAAmBpF,CAA/B,EAAkCoF,mBAAmBnF,CAArD,EAAwDsF,YAAxD,EAAsE,CAAtE,EAAyE,IAAIlE,KAAKmE,EAAlF;;AAEA,QAAItF,WAAWA,QAAQuF,IAAvB,EAA6B;AAC3B3F,cAAQyB,SAAR,GAAoBrB,QAAQuF,IAA5B;AACA3F,cAAQ2F,IAAR;AACD;;AAED3F,YAAQ4F,MAAR;AACD,GA7BD;AA8BD,C;;AAtCD;;;;AACA;;;;;;AAEA,IAAMH,eAAe,CAArB,C;;;;;;;;;;;;;ACHA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;;;AAEA,SAASI,oBAAT,CAA+B5C,OAA/B,EAAwC;AACtC5C,SAAO2C,IAAP,CAAYC,OAAZ,EAAqB7B,OAArB,CAA6B,UAAU6D,IAAV,EAAgB;AAC3C,QAAMhB,SAAShB,QAAQgC,IAAR,CAAf;;AAEAhB,WAAO3E,MAAP,GAAgB,KAAhB;AACD,GAJD;AAKD;;AAED,SAASwG,0BAAT,CAAqC7I,QAArC,EAA+C;AAC7C,MAAI,CAACA,QAAL,EAAe;AACb;AACD;;AAED,OAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C,QAAMH,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEAH,SAAKsC,MAAL,GAAc,KAAd;AACA,QAAI,CAACtC,KAAKiG,OAAV,EAAmB;AACjB;AACD;;AAED4C,yBAAqB7I,KAAKiG,OAA1B;AACD;AACF;;AAED,SAAS8C,SAAT,CAAoBC,kBAApB,EAAwC;AACtC;AACA,WAAS1D,iBAAT,CAA4B2D,cAA5B,EAA4C;AAC1C;AACA,QAAMxK,cAAc,0BAASA,WAA7B;AACA,QAAMS,UAAU+J,eAAe/J,OAA/B;;AAEA,QAAMO,kBAAkBuJ,mBAAmBxD,oBAAnB,CAAwCyD,cAAxC,CAAxB;;AAEA,QAAI,CAACxJ,eAAL,EAAsB;AACpB;AACD;;AAED,iCAAaP,OAAb,EAAsB8J,mBAAmBxJ,QAAzC,EAAmDC,eAAnD;;AAEA,QAAI4D,OAAO2C,IAAP,CAAYvG,gBAAgBwG,OAA5B,EAAqC7F,MAArC,KAAgD,CAAhD,IAAqD6I,eAAepI,IAAf,KAAwB,qBAAjF,EAAwG;AACtGpB,sBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7C,sBAAgBwG,OAAhB,CAAwBE,GAAxB,CAA4B7D,MAA5B,GAAqC,KAArC;AACA7C,sBAAgBwG,OAAhB,CAAwBE,GAAxB,CAA4B+C,SAA5B,GAAwC,KAAxC;AACAzJ,sBAAgB2G,WAAhB,GAA8B,IAA9B;AACA,UAAI,sCAAuB6C,cAAvB,EAAuCxJ,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,wCAAgB/G,OAAhB,EAAyB8J,mBAAmBxJ,QAA5C,EAAsDC,eAAtD;AACD;;AAEDhB,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA;AACD;;AAED,8BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DuD,mBAAmBG,yBAAnB,IAAgDA,yBAA5G;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;AACA,8BAASxK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;;AAEA5K,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACA,sCAAmB+J,cAAnB,EAAmCD,mBAAmBxJ,QAAtD,EAAgEC,eAAhE,EAAiFA,gBAAgBwG,OAAhB,CAAwBE,GAAzG,EAA8G,YAAY;AACxH1G,sBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7C,sBAAgB2G,WAAhB,GAA8B,IAA9B;AACA,UAAI,sCAAuB6C,cAAvB,EAAuCxJ,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,wCAAgB/G,OAAhB,EAAyB8J,mBAAmBxJ,QAA5C,EAAsDC,eAAtD;AACD;;AAED,gCAASb,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2D2C,mBAAmBG,yBAAnB,IAAgDA,yBAA3G;AACA,gCAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C2C,mBAAmBI,WAAnB,IAAkCA,WAAhF;AACA,gCAASxK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBK,kBAAnB,IAAyCA,kBAA9F;AACA5K,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,KAZD;AAaD;;AAED,WAASiK,yBAAT,CAAoC7C,CAApC,EAAuC1G,SAAvC,EAAkD;AAChD;AACA,QAAIoJ,mBAAmB1D,iBAAvB,EAA0C;AACxC0D,yBAAmB1D,iBAAnB,CAAqC1F,SAArC;AACD,KAFD,MAEO;AACL0F,wBAAkB1F,SAAlB;AACD;;AAED0G,MAAEY,wBAAF;AACAZ,MAAEgD,cAAF;AACD;AACD;;AAEA;AACA,WAASF,WAAT,CAAsB9C,CAAtB,EAAyB1G,SAAzB,EAAoC;AAClC;AACA,QAAMnB,cAAc,0BAASA,WAA7B;AACA,QAAMS,UAAUU,UAAUV,OAA1B;AACA,QAAMuH,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,QAAM1G,WAAW,6BAAaqG,EAAES,aAAf,EAA8BiC,mBAAmBxJ,QAAjD,CAAjB;AACA,QAAIQ,aAAJ;AACA,QAAIG,UAAJ;;AAEA;AACA2I,+BAA2B7I,QAA3B;;AAEA,aAASsJ,kBAAT,GAA+B;AAC7B;AACAT,iCAA2B7I,QAA3B;AACA,UAAI,sCAAuBL,SAAvB,EAAkCI,KAAKiG,OAAvC,CAAJ,EAAqD;AACnD;AACA,wCAAgB/G,OAAhB,EAAyB8J,mBAAmBxJ,QAA5C,EAAsDQ,IAAtD;AACD;;AAEDvB,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACA,gCAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBK,kBAAnB,IAAyCA,kBAA9F;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C2C,mBAAmBI,WAAnB,IAAkCA,WAAhF;AACD;;AAED;AACA,QAAInJ,QAAJ,EAAc;AACZ,WAAKE,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,eAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,YAAMqJ,aAAa,EAAnB,CAFyC,CAElB;AACvB,YAAMvC,SAAS,uCAAwB/H,OAAxB,EAAiCc,KAAKiG,OAAtC,EAA+CQ,MAA/C,EAAuD+C,UAAvD,CAAf;;AAEA,YAAIvC,MAAJ,EAAY;AACV,oCAASrI,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,oCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;AACApJ,eAAKsC,MAAL,GAAc,IAAd;AACA2E,iBAAO3E,MAAP,GAAgB,IAAhB;AACA7D,sBAAYqH,WAAZ,CAAwB5G,OAAxB;AACA,yCAAgBoH,CAAhB,EAAmB0C,mBAAmBxJ,QAAtC,EAAgDQ,IAAhD,EAAsDiH,MAAtD,EAA8DsC,kBAA9D;AACAjD,YAAEY,wBAAF;AACAZ,YAAEgD,cAAF;;AAEA;AACD;AACF;AACF;;AAED;AACA,QAAIrJ,YAAY+I,mBAAmBpC,aAAnC,EAAkD;AAChD,WAAKzG,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,eAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,YAAI6I,mBAAmBpC,aAAnB,CAAiC1H,OAAjC,EAA0Cc,IAA1C,EAAgDyG,MAAhD,CAAJ,EAA6D;AAC3D,oCAAS7H,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,oCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;AACApJ,eAAKsC,MAAL,GAAc,IAAd;AACA7D,sBAAYqH,WAAZ,CAAwB5G,OAAxB;AACA,6CAAoBoH,CAApB,EAAuBtG,IAAvB,EAA6BC,QAA7B,EAAuC+I,mBAAmBxJ,QAA1D,EAAoE,IAApE,EAA0E+J,kBAA1E;AACAjD,YAAEY,wBAAF;AACAZ,YAAEgD,cAAF;;AAEA;AACD;AACF;AACF;;AAED;AACA;AACA,QAAIN,mBAAmBG,yBAAvB,EAAkD;AAChDH,yBAAmBG,yBAAnB,CAA6C7C,CAA7C,EAAgD1G,SAAhD;AACD,KAFD,MAEO;AACLuJ,gCAA0B7C,CAA1B,EAA6B1G,SAA7B;AACD;;AAED,WAAO,KAAP;AACD;;AAED,WAASyJ,kBAAT,CAA6B/C,CAA7B,EAAgC1G,SAAhC,EAA2C;AACzC;AACA,QAAMnB,cAAc,0BAASA,WAA7B;AACA,QAAMS,UAAUU,UAAUV,OAA1B;AACA,QAAMuH,SAAS7G,UAAUkH,WAAV,CAAsBH,MAArC;AACA,QAAI3G,aAAJ;AACA,QAAMC,WAAW,6BAAaqG,EAAES,aAAf,EAA8BiC,mBAAmBxJ,QAAjD,CAAjB;AACA,QAAIW,UAAJ;;AAEA,aAASoJ,kBAAT,CAA6BE,SAA7B,EAAwCC,aAAxC,EAAuD;AACrD;AACA1J,WAAKsC,MAAL,GAAc,KAAd;AACAtC,WAAKoG,WAAL,GAAmB,IAAnB;AACA,UAAI,sCAAuBxG,SAAvB,EAAkCI,KAAKiG,OAAvC,CAAJ,EAAqD;AACnD;AACA,wCAAgBrG,UAAUV,OAA1B,EAAmC8J,mBAAmBxJ,QAAtD,EAAgEQ,IAAhE;AACD;;AAEDvB,kBAAYqH,WAAZ,CAAwBlG,UAAUV,OAAlC;AACA,gCAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBK,kBAAnB,IAAyCA,kBAA9F;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C2C,mBAAmBI,WAAnB,IAAkCA,WAAhF;;AAEA,UAAIJ,mBAAmBW,aAAvB,EAAsC;AACpC,kCAAS/K,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBW,aAAxE;AACD;;AAED,UAAIF,aAAaA,UAAU5I,IAAV,KAAmB,4BAApC,EAAkE;AAChE,oCAAa3B,OAAb,EAAsBuK,UAAU5I,IAAhC,EAAsC6I,aAAtC;AACD;AACF;;AAED;;AAEA;AACA;AACA,QAAM1C,WAAW,EAAjB;;AAEA,QAAI,CAAC/G,QAAL,EAAe;AACb;AACD;;AAED,SAAKE,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,aAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;;AAEA,UAAM8G,SAAS,uCAAwBrH,UAAUV,OAAlC,EAA2Cc,KAAKiG,OAAhD,EAAyDQ,MAAzD,EAAiEO,QAAjE,CAAf;;AAEA,UAAIC,MAAJ,EAAY;AACV,kCAASrI,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,kCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;AACA,YAAIJ,mBAAmBW,aAAvB,EAAsC;AACpC,oCAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBW,aAAzE;AACD;;AAED3J,aAAKsC,MAAL,GAAc,IAAd;AACA,uCAAgBgE,CAAhB,EAAmB0C,mBAAmBxJ,QAAtC,EAAgDQ,IAAhD,EAAsDiH,MAAtD,EAA8DsC,kBAA9D;AACAjD,UAAEY,wBAAF;AACAZ,UAAEgD,cAAF;;AAEA;AACD;AACF;;AAED;AACA,QAAI,CAACN,mBAAmBpC,aAAxB,EAAuC;AACrC;AACD;;AAED,SAAKzG,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,aAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;;AAEA,UAAI6I,mBAAmBpC,aAAnB,CAAiChH,UAAUV,OAA3C,EAAoDc,IAApD,EAA0DyG,MAA1D,CAAJ,EAAuE;AACrE,kCAAS7H,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,kCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;AACA,YAAIJ,mBAAmBW,aAAvB,EAAsC;AACpC,oCAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBW,aAAzE;AACD;;AAED,2CAAoBrD,CAApB,EAAuBtG,IAAvB,EAA6BC,QAA7B,EAAuC+I,mBAAmBxJ,QAA1D,EAAoE,IAApE,EAA0E+J,kBAA1E;AACAjD,UAAEY,wBAAF;AACAZ,UAAEgD,cAAF;;AAEA;AACD;AACF;AACF;AACD;;AAEA;AACA,WAASlC,OAAT,CAAkBlI,OAAlB,EAA2B;AACzBA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DuD,mBAAmBG,yBAAnB,IAAgDA,yBAA5G;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;;AAEA,QAAIJ,mBAAmBY,iBAAvB,EAA0C;AACxC,gCAAShL,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDuD,mBAAmBY,iBAAxE;AACD;;AAED,QAAIZ,mBAAmBW,aAAvB,EAAsC;AACpC,gCAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBW,aAAzE;AACD;;AAED,8BAASlL,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASqI,MAAT,CAAiBrI,OAAjB,EAA0B;AACxBA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DuD,mBAAmBG,yBAAnB,IAAgDA,yBAA5G;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;;AAEAlK,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;;AAEA,QAAI0B,mBAAmBY,iBAAvB,EAA0C;AACxC,gCAAShL,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDuD,mBAAmBY,iBAAxE;AACD;;AAED,QAAIZ,mBAAmBW,aAAvB,EAAsC;AACpC,gCAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBW,aAAzE;AACD;;AAED,8BAASlL,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASuI,QAAT,CAAmBvI,OAAnB,EAA4B;AAC1BA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DuD,mBAAmBG,yBAAnB,IAAgDA,yBAA5G;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;;AAEAlK,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBK,kBAAnB,IAAyCA,kBAA9F;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2D2C,mBAAmBG,yBAAnB,IAAgDA,yBAA3G;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C2C,mBAAmBI,WAAnB,IAAkCA,WAAhF;;AAEA,QAAIJ,mBAAmBY,iBAAvB,EAA0C;AACxC,gCAAShL,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDuD,mBAAmBY,iBAAxE;AACA,gCAAShL,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD2C,mBAAmBY,iBAAvE;AACD;;AAED,QAAIZ,mBAAmBW,aAAvB,EAAsC;AACpC,gCAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBW,aAAzE;AACA,gCAAS/K,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBW,aAAxE;AACD;;AAED,8BAASlL,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA;AACA;AACA,WAASoI,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3B0C,uBAAmB1B,eAAnB,CAAmChB,CAAnC,EAAsCA,EAAExF,MAAxC;AACD;;AAED;AACA,WAAS4G,UAAT,CAAqBxI,OAArB,EAA8B;AAC5B,QAAMS,YAAY,iCAAlB;AACA,QAAMgI,wBAAwB;AAC5BnI,gBAAUwJ,mBAAmBxJ,QADD;AAE5BqB,YAAMlB;AAFsB,KAA9B;;AAKA,gCAAaT,OAAb,EAAsBS,SAAtB,EAAiCgI,qBAAjC;;AAEAzI,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBK,kBAAnB,IAAyCA,kBAA/F;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DuD,mBAAmBG,yBAAnB,IAAgDA,yBAA5G;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CuD,mBAAmBI,WAAnB,IAAkCA,WAAjF;;AAEAlK,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD2C,mBAAmBK,kBAAnB,IAAyCA,kBAA9F;;AAEA,QAAIL,mBAAmBY,iBAAvB,EAA0C;AACxC,gCAAShL,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDuD,mBAAmBY,iBAAxE;AACD;;AAED,QAAIZ,mBAAmBW,aAAvB,EAAsC;AACpC,gCAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDuD,mBAAmBW,aAAzE;AACD;;AAED,8BAASlL,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,MAAM6I,gBAAgB;AACpBR,kBADoB;AAEpBH,oBAFoB;AAGpBK,sBAHoB;AAIpBC,0BAJoB;AAKpB2B,wBAAoBL,mBAAmBK,kBAAnB,IAAyCA,kBALzC;AAMpBF,+BAA2BH,mBAAmBG,yBAAnB,IAAgDA,yBANvD;AAOpBC,iBAAaJ,mBAAmBI,WAAnB,IAAkCA;AAP3B,GAAtB;;AAUE;AACF,MAAIJ,mBAAmBpC,aAAvB,EAAsC;AACpCmB,kBAAcnB,aAAd,GAA8BoC,mBAAmBpC,aAAjD;AACD;;AAED,MAAIoC,mBAAmBY,iBAAvB,EAA0C;AACxC7B,kBAAc6B,iBAAd,GAAkCZ,mBAAmBY,iBAArD;AACD;;AAED,MAAIZ,mBAAmBW,aAAvB,EAAsC;AACpC5B,kBAAc4B,aAAd,GAA8BX,mBAAmBW,aAAjD;AACD;;AAED,MAAIX,mBAAmB1D,iBAAvB,EAA0C;AACxCyC,kBAAczC,iBAAd,GAAkC0D,mBAAmB1D,iBAArD;AACD;;AAED,SAAOyC,aAAP;AACD;;kBAEcgB,S;;;;;;;;;;;;ACtYf,IAAIc,gCAAJ;AACA,IAAIC,8BAAJ;AACA,IAAIC,mCAAJ;;AAEA,SAASC,mBAAT,CAA8BC,OAA9B,EAAuC;AACrCJ,4BAA0BI,OAA1B;AACD;;AAED,SAASC,mBAAT,GAAgC;AAC9B,SAAOL,uBAAP;AACD;;AAED,SAASM,iBAAT,CAA4BF,OAA5B,EAAqC;AACnCH,0BAAwBG,OAAxB;AACD;;AAED,SAASG,iBAAT,GAA8B;AAC5B,SAAON,qBAAP;AACD;;AAED,SAASO,sBAAT,CAAiCJ,OAAjC,EAA0C;AACxCF,+BAA6BE,OAA7B;AACD;;AAED,SAASK,sBAAT,GAAmC;AACjC,SAAOP,0BAAP;AACD;;AAED,IAAMQ,qBAAqB;AACzBP,0CADyB;AAEzBE,0CAFyB;AAGzBC,sCAHyB;AAIzBC,sCAJyB;AAKzBC,gDALyB;AAMzBC;AANyB,CAA3B;;kBASeC,kB;;;;;;;;;;;;;kBCnCA,UAAUC,iBAAV,EAA6BpH,OAA7B,EAAsC;AACnD,MAAIqH,SAAS,2BAAb;;AAEA,MAAIrH,WAAWA,QAAQsH,gBAAR,KAA6B,IAA5C,EAAkD;AAChDD,cAAU,6BAAV;AACD;;AAED,MAAM1C,gBAAgB;AACpBN,YADoB,oBACVvI,OADU,EACD;AACjB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;;AAEA,UAAIpH,WAAWA,QAAQxD,SAAvB,EAAkC;AAChC,kCAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBoE,MAAvB,EAA+BrH,QAAQxD,SAAvC,EAAkD4K,iBAAlD;AACD,OAFD,MAEO;AACL,kCAAS5L,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBoE,MAAvB,EAA+BD,iBAA/B;AACD;;AAED,UAAIpH,WAAWA,QAAQuH,gBAAvB,EAAyC;AACvCvH,gBAAQuH,gBAAR,CAAyBzL,OAAzB;AACD;AACF,KAbmB;AAcpBkI,WAdoB,mBAcXlI,OAdW,EAcF;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;AACA,UAAIpH,WAAWA,QAAQwH,eAAvB,EAAwC;AACtCxH,gBAAQwH,eAAR,CAAwB1L,OAAxB;AACD;AACF,KAnBmB;AAoBpBqI,UApBoB,kBAoBZrI,OApBY,EAoBH;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;AACA,UAAIpH,WAAWA,QAAQyH,cAAvB,EAAuC;AACrCzH,gBAAQyH,cAAR,CAAuB3L,OAAvB;AACD;AACF,KAzBmB;AA0BpBwI,cA1BoB,sBA0BRxI,OA1BQ,EA0BC;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;AACA,UAAIpH,WAAWA,QAAQ0H,kBAAvB,EAA2C;AACzC1H,gBAAQ0H,kBAAR,CAA2B5L,OAA3B;AACD;AACF;AA/BmB,GAAtB;;AAmCA,SAAO6I,aAAP;AACD,C;;AA7CD;;;;;;;;;;;;;;;;;kBCEe,UAAUC,UAAV,EAAsB/B,OAAtB,EAA+B;AAC5C,MAAM8E,QAAQ/C,WAAW+C,KAAzB;AACA,MAAMC,YAAY;AAChBnG,UAAM,CADU;AAEhBC,SAAK,CAFW;AAGhBnC,WAAOoI,MAAMpI,KAHG;AAIhBgC,YAAQoG,MAAMpG;AAJE,GAAlB;;AAOA,MAAIsG,qBAAqB,KAAzB;;AAEA5H,SAAO2C,IAAP,CAAYC,OAAZ,EAAqB7B,OAArB,CAA6B,UAAU6D,IAAV,EAAgB;AAC3C,QAAMhB,SAAShB,QAAQgC,IAAR,CAAf;;AAEA,QAAIhB,OAAOiE,mBAAP,KAA+B,IAAnC,EAAyC;AACvC;AACD;;AAED,QAAI,0BAASvM,eAAT,CAAyBwM,KAAzB,CAA+BC,UAA/B,CAA0CnE,MAA1C,EAAkD+D,SAAlD,MAAiE,KAArE,EAA4E;AAC1EC,2BAAqB,IAArB;AACD;AACF,GAVD;;AAYA,SAAOA,kBAAP;AACD,C;;AA1BD;;;;;;;;;;;;;;;;;kBCEe,UAAUtF,iBAAV,EAA6B;AAC1C,MAAIN,gBAAgB,EAApB;;AAEA,MAAM0C,gBAAgB;AACpBN,YADoB,oBACVvI,OADU,EACDuB,eADC,EACgB2C,OADhB,EACyB;AAC3C,gCAASxE,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DE,iBAA7D;AACA,UAAM/F,YAAY;AAChBa,wCADgB;AAEhB2C;AAFgB,OAAlB;;AAKA,gCAASxE,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuE+F,iBAAvE;AACD,KATmB;AAUpByB,WAVoB,mBAUXlI,OAVW,EAUF;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DE,iBAA7D;AACD,KAZmB;AAapB4B,UAboB,kBAaZrI,OAbY,EAaH;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DE,iBAA7D;AACD,KAfmB;AAgBpB+B,cAhBoB,sBAgBRxI,OAhBQ,EAgBC;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DE,iBAA7D;AACD,KAlBmB;AAmBpBiC,oBAnBoB,8BAmBA;AAClB,aAAOvC,aAAP;AACD,KArBmB;AAsBpBwC,oBAtBoB,4BAsBFC,MAtBE,EAsBM;AACxBzC,sBAAgByC,MAAhB;AACD;AAxBmB,GAAtB;;AA4BA,SAAOC,aAAP;AACD,C;;AAlCD;;;;;;;;;;;;;;;;ACAA,IAAIsD,kBAAkB,EAAtB;AAAA,IACEC,cAAiBD,eAAjB,aADF;AAAA,IAEEE,yBAAyB,aAF3B;;AAIA,SAASC,OAAT,CAAkB9H,IAAlB,EAAwB;AACtB4H,gBAAc5H,IAAd;AACD;;AAED,SAASC,OAAT,GAAoB;AAClB,SAAO2H,WAAP;AACD;;AAED,SAASG,WAAT,CAAsB7H,QAAtB,EAAgC;AAC9ByH,oBAAkBzH,QAAlB;AACD;;AAED,SAASC,WAAT,GAAwB;AACtB,SAAOwH,eAAP;AACD;;AAED,SAASK,kBAAT,CAA6B5H,eAA7B,EAA8C;AAC5CyH,2BAAyBzH,eAAzB;AACD;;AAED,SAASC,kBAAT,GAA+B;AAC7B,SAAOwH,sBAAP;AACD;;AAED,IAAMI,YAAY;AAChBH,kBADgB;AAEhB7H,kBAFgB;AAGhB8H,0BAHgB;AAIhB5H,0BAJgB;AAKhB6H,wCALgB;AAMhB3H;AANgB,CAAlB;;kBASe4H,S;;;;;;;;;;;;kBC7BSC,gB;;AARxB;;;;;;AAEA;;;;;;AAMe,SAASA,gBAAT,CAA2BC,cAA3B,EAA2C;AACxD,MAAMlN,kBAAkB,0BAASA,eAAjC;;AAEA,MAAIkN,0BAA0BlN,gBAAgBmN,OAA9C,EAAuD;AACrD,WAAOD,cAAP;AACD;;AAED,SAAO,IAAIlN,gBAAgBmN,OAApB,CAA4BD,eAAe,CAAf,CAA5B,EAA+CA,eAAe,CAAf,CAA/C,EAAkEA,eAAe,CAAf,CAAlE,CAAP;AACD,C;;;;;;;;;;;;;;AChBD;;;;;;AAEA;AACA;AACA;;AAEA,SAASE,kCAAT,GAA+C;AAC7C,MAAIC,YAAY,EAAhB;;AAEA;AACA;;AAEA,WAASC,oBAAT,CAA+BC,OAA/B,EAAwC;AACtC,WAAOF,UAAUE,OAAV,CAAP;AACD;;AAED,WAASC,uBAAT,CAAkCD,OAAlC,EAA2CE,gBAA3C,EAA6D;AAC3DJ,cAAUE,OAAV,IAAqBE,gBAArB;AACD;;AAED,WAASC,aAAT,GAA0B;AACxB,WAAOL,SAAP;AACD;;AAED,WAASM,gBAAT,CAA2BC,cAA3B,EAA2C;AACzCP,gBAAYO,cAAZ;AACD;;AAED;AACA;AACA,WAASC,2BAAT,CAAsCtN,OAAtC,EAA+CM,QAA/C,EAAyDQ,IAAzD,EAA+D;AAC7D,QAAMb,eAAe,0BAASV,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAArB;AACA;;AAEA,QAAI,CAACC,aAAa4L,KAAd,IAAuBiB,UAAUS,cAAV,CAAyBtN,aAAa4L,KAAb,CAAmBmB,OAA5C,MAAyD,KAApF,EAA2F;AACzFF,gBAAU7M,aAAa4L,KAAb,CAAmBmB,OAA7B,IAAwC,EAAxC;AACD;;AAED,QAAME,mBAAmBJ,UAAU7M,aAAa4L,KAAb,CAAmBmB,OAA7B,CAAzB;;AAEA;AACA,QAAIE,iBAAiBK,cAAjB,CAAgCjN,QAAhC,MAA8C,KAAlD,EAAyD;AACvD4M,uBAAiB5M,QAAjB,IAA6B;AAC3BQ,cAAM;AADqB,OAA7B;AAGD;;AAED,QAAMC,WAAWmM,iBAAiB5M,QAAjB,CAAjB;;AAEA;AACAS,aAASD,IAAT,CAAc0M,IAAd,CAAmB1M,IAAnB;AACD;;AAED;AACA;AACA,WAAS2M,2BAAT,CAAsCzN,OAAtC,EAA+CM,QAA/C,EAAyD;AACvD,QAAML,eAAe,0BAASV,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAArB;AACA;;AAEA,QAAI,CAACC,aAAa4L,KAAd,IAAuBiB,UAAUS,cAAV,CAAyBtN,aAAa4L,KAAb,CAAmBmB,OAA5C,MAAyD,KAApF,EAA2F;AACzF;AACD;;AAED,QAAME,mBAAmBJ,UAAU7M,aAAa4L,KAAb,CAAmBmB,OAA7B,CAAzB;;AAEA;AACA,QAAIE,iBAAiBK,cAAjB,CAAgCjN,QAAhC,MAA8C,KAAlD,EAAyD;AACvD;AACD;;AAED,QAAMS,WAAWmM,iBAAiB5M,QAAjB,CAAjB;;AAGA,WAAOS,QAAP;AACD;;AAED;AACA,WAAS2M,oCAAT,CAA+C1N,OAA/C,EAAwD;AACtD,QAAMC,eAAe,0BAASV,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAArB;;AAEA,QAAI,CAACC,aAAa4L,KAAd,IAAuBiB,UAAUS,cAAV,CAAyBtN,aAAa4L,KAAb,CAAmBmB,OAA5C,MAAyD,KAApF,EAA2F;AACzF;AACD;;AAED,WAAOF,UAAU7M,aAAa4L,KAAb,CAAmBmB,OAA7B,CAAP;AACD;;AAED,SAAO;AACLpM,SAAK6M,2BADA;AAELjN,SAAK8M,2BAFA;AAGLK,WAAOD,oCAHF;AAILX,8CAJK;AAKLE,oDALK;AAMLE,gCANK;AAOLC,sCAPK;AAQLN;AARK,GAAP;AAUD;;AAED;AACA;AACA,IAAMc,wCAAwCf,oCAA9C;;QAGEA,kC,GAAAA,kC;QACAe,qC,GAAAA,qC;;;;;;;;;;;;;kBCvGa,UAAU7F,MAAV,EAAkBR,MAAlB,EAA0B;AACvC,MAAI,CAACQ,OAAOvC,WAAZ,EAAyB;AACvB;AACD;;AAED,SAAO,0BAAS/F,eAAT,CAAyBwM,KAAzB,CAA+BC,UAA/B,CAA0C3E,MAA1C,EAAkDQ,OAAOvC,WAAzD,CAAP;AACD,C;;AARD;;;;;;;;;;;;;;;;;kBCOe,UAAUqG,KAAV,EAAiBgC,gBAAjB,EAAmC;AAChD,MAAMtO,cAAc,0BAASA,WAA7B;AACA,MAAMuO,qBAAqBvO,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,oBAAzB,EAA+CiL,MAAMmB,OAArD,CAA3B;AACA,MAAMgB,eAAezO,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,qBAAzB,EAAgDiL,MAAMmB,OAAtD,CAArB;;AAEA,MAAI,CAACc,kBAAD,IAAuB,CAACE,YAA5B,EAA0C;AACxC;AACD;;AAED,MAAMC,WAAWD,aAAaC,QAA9B;;AAEA;AACA,MAAIA,aAAa,IAAjB,EAAuB;AACrB;AACD;;AAED,MAAMC,qBAAqBL,mBAAmBhC,MAAMsC,KAAzB,GAAiCtC,MAAMuC,SAAlE;;AAEA,MAAMC,gBAAgBP,mBAAmBO,aAAzC,CAlBgD,CAkBQ;;AAExD,MAAI,CAACA,aAAL,EAAoB;AAClB;AACD;;AAED,MAAMC,oBAAoB/O,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CiL,MAAMmB,OAAnD,CAA1B;;AAEA,MAAI,CAACsB,iBAAL,EAAwB;AACtB;AACD;;AAED,MAAMC,0BAA0BD,kBAAkBC,uBAAlD;AACA,MAAMC,YAAYD,wBAAwBE,4BAA1C;AACA,MAAMC,YAAYH,wBAAwBI,qBAA1C;AACA,MAAMC,WAAWL,wBAAwBM,oBAAzC;AACA,MAAMC,wBAAwBd,aAAae,UAA3C;;AAEA,MAAI,CAACP,SAAD,IAAc,CAACE,SAAf,IAA4B,CAACE,QAA7B,IAAyC,CAACE,qBAA9C,EAAqE;AACnE;AACD;;AAED,MAAME,2BAA2BC,UAAUH,sBAAsBI,iBAAtB,IAA2C,CAArD,IAA0DJ,sBAAsBK,OAAhF,GAA0FL,sBAAsBM,OAAtB,GAAgC,EAA1H,GAA+HN,sBAAsBO,KAAtB,GAA8B,EAA9B,GAAmC,EAAnM;AACA,MAAMC,8BAA8BL,UAAUT,UAAUU,iBAApB,IAAyCV,UAAUW,OAAnD,GAA6DX,UAAUY,OAAV,GAAoB,EAAjF,GAAsFZ,UAAUa,KAAV,GAAkB,EAAlB,GAAuB,EAAjJ;AACA,MAAME,oBAAoBP,2BAA2BM,2BAArD;AACA,MAAME,gBAAgBd,YAAYrJ,KAAKoK,GAAL,CAAS,CAACF,iBAAD,GAAqBlK,KAAKqK,GAAL,CAAS,CAAT,CAArB,GAAmCd,QAA5C,CAAlC;AACA,MAAMe,MAAMzB,qBAAqBG,aAArB,GAAqCmB,aAArC,GAAqD,IAAjE;;AAEA,SAAOG,GAAP;AACD,C;;AAtDD;;;;;;AAEA;AACA,SAASV,SAAT,CAAoBW,eAApB,EAAqC;AACnC,SAAOC,iBAAeD,eAAf,CAAP;AACD,C;;;;;;;;;;;;;kBCFc,UAAU5P,OAAV,EAAmB+G,OAAnB,EAA4BQ,MAA5B,EAAoCuI,iBAApC,EAAuD;AACpE,MAAIC,qBAAJ;;AAEA,MAAI,CAAChJ,OAAL,EAAc;AACZ;AACD;;AAED5C,SAAO2C,IAAP,CAAYC,OAAZ,EAAqB7B,OAArB,CAA6B,UAAU6D,IAAV,EAAgB;AAC3C,QAAMhB,SAAShB,QAAQgC,IAAR,CAAf;;AAEA,QAAIhB,OAAOwF,cAAP,CAAsB,iBAAtB,CAAJ,EAA8C;AAC5C,UAAIxF,OAAOiI,eAAP,CAAuBhQ,OAAvB,EAAgC+H,MAAhC,EAAwCR,MAAxC,CAAJ,EAAqD;AACnDwI,uBAAehI,MAAf;;AAEA;AACD;AACF,KAND,MAMO,IAAIA,OAAOkI,cAAP,KAA0B,IAA9B,EAAoC;AACzC,UAAI,sCAAuBlI,MAAvB,EAA+BR,MAA/B,CAAJ,EAA4C;AAC1CwI,uBAAehI,MAAf;;AAEA;AACD;AACF,KANM,MAMA;AACL,UAAMmI,eAAe,0BAAS3Q,WAAT,CAAqB8J,aAArB,CAAmCrJ,OAAnC,EAA4C+H,MAA5C,CAArB;AACA,UAAMD,WAAW,0BAASrI,eAAT,CAAyBwM,KAAzB,CAA+BnE,QAA/B,CAAwCoI,YAAxC,EAAsD3I,MAAtD,CAAjB;;AAEA,UAAIO,YAAYgI,iBAAhB,EAAmC;AACjCC,uBAAehI,MAAf;;AAEA;AACD;AACF;AACF,GAzBD;;AA2BA,SAAOgI,YAAP;AACD,C;;AAtCD;;;;AACA;;;;;;;;;;;;;;;;ACDA,IAAII,sCAAJ;;AAEA;AACA;AACA,IAAMC,0BAA0B;AAC9BC,WAAS,CADqB;AAE9BC,MAAI;AACF,OAAG,CADD;AAEF,QAAI,CAFF;AAGFD,aAAS;AAHP,GAF0B;AAO9BE,WAAS;AACPF,aAAS;AADF,GAPqB;AAU9BG,SAAO;AACL,QAAI,CADC;AAEL,QAAI,CAFC;AAGL,QAAI,CAHC;AAILH,aAAS;AAJJ,GAVuB;AAgB9BI,UAAQ;AACNJ,aAAS;AADH,GAhBsB;AAmB9BK,UAAQ;AACNL,aAAS;AADH;AAnBsB,CAAhC;;AAwBA;AACA;AACA,SAASM,cAAT,GAA2B;AACzB,MAAMC,KAAKC,UAAUC,SAArB;AACA,MAAIC,IAAIH,GAAGI,KAAH,CAAS,8DAAT,KAA4E,EAApF;AACA,MAAIC,YAAJ;;AAEA,MAAI,WAAWC,IAAX,CAAgBH,EAAE,CAAF,CAAhB,CAAJ,EAA2B;AACzBE,UAAO,iBAAD,CAAoBE,IAApB,CAAyBP,EAAzB,KAAgC,EAAtC;;AAEA,oBAAaK,IAAI,CAAJ,KAAU,EAAvB;AACD;;AAED,MAAIF,EAAE,CAAF,MAAS,QAAb,EAAuB;AACrBE,UAAML,GAAGI,KAAH,CAAS,qBAAT,CAAN;AACA,QAAIC,QAAQ,IAAZ,EAAkB;AAChB,aAAOA,IAAIG,KAAJ,CAAU,CAAV,EAAaC,IAAb,CAAkB,GAAlB,EAAuBC,OAAvB,CAA+B,KAA/B,EAAsC,OAAtC,CAAP;AACD;AACF;;AAEDP,MAAIA,EAAE,CAAF,IAAO,CAACA,EAAE,CAAF,CAAD,EAAOA,EAAE,CAAF,CAAP,CAAP,GAAsB,CAACF,UAAUU,OAAX,EAAoBV,UAAUW,UAA9B,EAA0C,IAA1C,CAA1B;AACA,MAAI,CAACP,MAAML,GAAGI,KAAH,CAAS,iBAAT,CAAP,MAAwC,IAA5C,EAAkD;AAChDD,MAAE5P,MAAF,CAAS,CAAT,EAAY,CAAZ,EAAe8P,IAAI,CAAJ,CAAf;AACD;;AAED,SAAOF,EAAEM,IAAF,CAAO,GAAP,CAAP;AACD;;AAED,SAASI,0BAAT,CAAqCC,0BAArC,EAAiE;AAC/DvB,kCAAgCuB,0BAAhC;AACD;;AAED,SAASC,0BAAT,GAAuC;AACrC,MAAIxB,6BAAJ,EAAmC;AACjC,WAAOA,6BAAP;AACD;;AAED,SAAOyB,gCAAP;AACD;;AAED,SAASA,8BAAT,GAA2C;AACzC,MAAMC,aAAalB,gBAAnB;AACA,MAAMmB,OAAOD,WAAWE,KAAX,CAAiB,GAAjB,CAAb;AACA,MAAMC,cAAcF,KAAK,CAAL,CAApB;AACA,MAAMG,iBAAiBH,KAAK,CAAL,CAAvB;AACA,MAAMI,cAAc9B,wBAAwB4B,WAAxB,CAApB;;AAEA,MAAI,CAACE,WAAL,EAAkB;AAChB,WAAO9B,wBAAwBC,OAA/B;AACD;;AAED,MAAI,CAAC6B,YAAYD,cAAZ,CAAL,EAAkC;AAChC,WAAOC,YAAY7B,OAAnB;AACD;;AAED,SAAO6B,YAAYD,cAAZ,CAAP;AACD;;AAED,SAASE,cAAT,GAA2B;AACzB,MAAMC,UAAU,IAAIC,MAAJ,CAAW,+DAAX,CAAhB;;AAGA,SAAOD,QAAQlB,IAAR,CAAaL,UAAUC,SAAvB,CAAP;AACD;;QAGCc,8B,GAAAA,8B;QACAD,0B,GAAAA,0B;QACAF,0B,GAAAA,0B;QACAd,c,GAAAA,c;QACAwB,c,GAAAA,c;;;;;;;;;;;;;kBChGa,UAAUG,kBAAV,EAA8B;AAC3C,MAAMzJ,gBAAgB;AACpBN,YADoB,oBACVvI,OADU,EACD;AACjB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+L,kBAAtD;AACA,UAAM5R,YAAY,EAAlB;;AAGA,gCAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDzG,SAArD,EAAgE4R,kBAAhE;AACD,KAPmB;AAQpBpK,WARoB,mBAQXlI,OARW,EAQF;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+L,kBAAtD;AACD,KAVmB;AAWpBjK,UAXoB,kBAWZrI,OAXY,EAWH;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+L,kBAAtD;AACD,KAbmB;AAcpB9J,cAdoB,sBAcRxI,OAdQ,EAcC;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+L,kBAAtD;AACD;AAhBmB,GAAtB;;AAoBA,SAAOzJ,aAAP;AACD,C;;AAxBD;;;;;;;;;;;;;;;;;kBCGe,UAAUxC,cAAV,EAA0B/F,QAA1B,EAAoCQ,IAApC,EAA0CiH,MAA1C,EAAkDsC,kBAAlD,EAAsErD,yBAAtE,EAAiG;AAC9G,MAAMzH,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUqG,eAAerG,OAA/B;AACA,MAAMuS,mBAAmB;AACvBvO,OAAG+D,OAAO/D,CAAP,GAAWqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CAD1B;AAEvBC,OAAG8D,OAAO9D,CAAP,GAAWoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H;AAF1B,GAAzB;;AAKA,WAASuO,iBAAT,CAA4BpL,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,QAAIqH,OAAO0K,QAAP,KAAoB,KAAxB,EAA+B;AAC7B1K,aAAO0K,QAAP,GAAkB,IAAlB;AACD;;AAED1K,WAAO3E,MAAP,GAAgB,IAAhB;AACA2E,WAAO/D,CAAP,GAAWtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAA9B,GAAkCuO,iBAAiBvO,CAA9D;AACA+D,WAAO9D,CAAP,GAAWvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAA9B,GAAkCsO,iBAAiBtO,CAA9D;;AAEA,QAAI+C,yBAAJ,EAA+B;AAC7Be,aAAO/D,CAAP,GAAWqB,KAAKC,GAAL,CAASyC,OAAO/D,CAAhB,EAAmB,CAAnB,CAAX;AACA+D,aAAO/D,CAAP,GAAWqB,KAAKqN,GAAL,CAAS3K,OAAO/D,CAAhB,EAAmBtD,UAAUmL,KAAV,CAAgBpI,KAAnC,CAAX;;AAEAsE,aAAO9D,CAAP,GAAWoB,KAAKC,GAAL,CAASyC,OAAO9D,CAAhB,EAAmB,CAAnB,CAAX;AACA8D,aAAO9D,CAAP,GAAWoB,KAAKqN,GAAL,CAAS3K,OAAO9D,CAAhB,EAAmBvD,UAAUmL,KAAV,CAAgBpG,MAAnC,CAAX;AACD;;AAEDlG,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMS,YAAY,qCAAlB;AACA,QAAMkS,oBAAoB;AACxBrS,wBADwB;AAExBN,sBAFwB;AAGxBO,uBAAiBO;AAHO,KAA1B;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCkS,iBAAjC;AACD;;AAED,4BAASjT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDqL,iBAApD;;AAEA,WAASI,eAAT,GAA4B;AAC1B7K,WAAO3E,MAAP,GAAgB,KAAhB;AACA,8BAAS1D,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiM,iBAArD;AACA,8BAAS9S,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,8BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDqM,eAAtD;AACArT,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI,OAAOqK,kBAAP,KAA8B,UAAlC,EAA8C;AAC5CA;AACD;AACF;;AAED,4BAAS3K,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkDyL,eAAlD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDyL,eAArD;AACD,C;;AAxDD;;;;AACA;;;;;;;;;;;;;;;;;kBCEe,UAAUvM,cAAV,EAA0B/F,QAA1B,EAAoCQ,IAApC,EAA0CiH,MAA1C,EAAkDsC,kBAAlD,EAAsErD,yBAAtE,EAAiG;AAC9G,MAAMzH,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUqG,eAAerG,OAA/B;;AAEA,WAAS6S,YAAT,CAAuBzL,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnCqH,WAAO3E,MAAP,GAAgB,IAAhB;AACA2E,WAAO/D,CAAP,GAAWtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAAzC;AACA+D,WAAO9D,CAAP,GAAWvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAAzC;;AAEA,QAAI+C,yBAAJ,EAA+B;AAC7Be,aAAO/D,CAAP,GAAWqB,KAAKC,GAAL,CAASyC,OAAO/D,CAAhB,EAAmB,CAAnB,CAAX;AACA+D,aAAO/D,CAAP,GAAWqB,KAAKqN,GAAL,CAAS3K,OAAO/D,CAAhB,EAAmBtD,UAAUmL,KAAV,CAAgBpI,KAAnC,CAAX;;AAEAsE,aAAO9D,CAAP,GAAWoB,KAAKC,GAAL,CAASyC,OAAO9D,CAAhB,EAAmB,CAAnB,CAAX;AACA8D,aAAO9D,CAAP,GAAWoB,KAAKqN,GAAL,CAAS3K,OAAO9D,CAAhB,EAAmBvD,UAAUmL,KAAV,CAAgBpG,MAAnC,CAAX;AACD;;AAEDlG,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMS,YAAY,qCAAlB;AACA,QAAMkS,oBAAoB;AACxBrS,wBADwB;AAExBN,sBAFwB;AAGxBO,uBAAiBO;AAHO,KAA1B;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCkS,iBAAjC;AACD;;AAED,WAASG,aAAT,CAAwB1L,CAAxB,EAA2B;AACzB,8BAAS1H,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDuM,aAArD;AACA,8BAASpT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDuM,aAArD;;AAEA,8BAASpT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD0L,YAApD;AACA,8BAASnT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD0L,YAApD;;AAEA,8BAASnT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD4L,eAArD;AACA,QAAI3L,EAAEzF,IAAF,KAAW,2BAAf,EAA4C;AAC1C,gCAASjC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkD4L,eAAlD;AACD;AACF;;AAED,WAASC,0BAAT,CAAqC5L,CAArC,EAAwC1G,SAAxC,EAAmD;AACjD,QAAIA,UAAUH,eAAV,KAA8BO,IAAlC,EAAwC;AACtCiS;AACD;AACF;;AAED,WAASE,uBAAT,CAAkC7L,CAAlC,EAAqC1G,SAArC,EAAgD;AAC9C,QAAIA,UAAUJ,QAAV,KAAuBA,QAA3B,EAAqC;AACnC,gCAASZ,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsM,YAArD;AACA,gCAASnT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsM,YAArD;AACA,gCAASnT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDwM,eAAtD;AACA,gCAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDwM,eAAnD;AACA,gCAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,oCAAxB,EAA8DyM,0BAA9D;AACA,gCAAStT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,iCAAxB,EAA2D0M,uBAA3D;;AAEAlL,aAAO3E,MAAP,GAAgB,KAAhB;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;AACF;;AAED,4BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD2L,aAApD;AACA,4BAASpT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD2L,aAApD;AACA,4BAASpT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,oCAAvB,EAA6D6L,0BAA7D;AACA,4BAAStT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,iCAAvB,EAA0D8L,uBAA1D;;AAEA,WAASF,eAAT,GAA4B;AAC1B,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsM,YAArD;AACA,8BAASnT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsM,YAArD;AACA,8BAASnT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDwM,eAAtD;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDwM,eAAnD;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,oCAAxB,EAA8DyM,0BAA9D;AACA,8BAAStT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,iCAAxB,EAA2D0M,uBAA3D;;AAEAlL,WAAO3E,MAAP,GAAgB,KAAhB;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI,OAAOqK,kBAAP,KAA8B,UAAlC,EAA8C;AAC5CA;AACD;AACF;AACF,C;;AArFD;;;;AACA;;;;;;;;;;;;;;;;;kBCCe,UAAUjC,eAAV,EAA2B;AACxC,MAAIjC,gBAAgB,EAApB;;AAEA;AACA;AACA;AACA,WAAS+M,0BAAT,CAAqC9L,CAArC,EAAwC;AACtCgB,oBAAgBhB,CAAhB,EAAmBA,EAAExF,MAArB;AACD;;AAED,MAAMiH,gBAAgB;AACpBX,WADoB,mBACXlI,OADW,EACF;AAChBA,cAAQmI,mBAAR,CAA4B,0BAA5B,EAAwD+K,0BAAxD;AACD,KAHmB;AAIpB7K,UAJoB,kBAIZrI,OAJY,EAIH;AACfA,cAAQmI,mBAAR,CAA4B,0BAA5B,EAAwD+K,0BAAxD;AACAlT,cAAQsI,gBAAR,CAAyB,0BAAzB,EAAqD4K,0BAArD;AACA,gCAAS3T,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD,KARmB;AASpB0I,oBAToB,8BASA;AAClB,aAAOvC,aAAP;AACD,KAXmB;AAYpBwC,oBAZoB,4BAYFC,MAZE,EAYM;AACxBzC,sBAAgByC,MAAhB;AACD;AAdmB,GAAtB;;AAiBA,SAAOC,aAAP;AACD,C;;AA9BD;;;;;;;;;;;;;;;;;kBCGe,UAAUnI,SAAV,EAAqBJ,QAArB,EAA+BQ,IAA/B,EAAqCiH,MAArC,EAA6CsC,kBAA7C,EAAiErD,yBAAjE,EAA4F;AACzG;AACA,MAAMzH,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;AACA,MAAMmT,cAAc5T,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCU,UAAU8G,aAAV,CAAwB6L,IAAxB,CAA6BrP,CAA9D,EAAiEtD,UAAU8G,aAAV,CAAwB6L,IAAxB,CAA6BpP,CAA7B,GAAiC,EAAlG,CAApB;AACA,MAAMqP,oBAAoB;AACxBtP,OAAG+D,OAAO/D,CAAP,GAAWmP,YAAYnP,CADF;AAExBC,OAAG8D,OAAO9D,CAAP,GAAWkP,YAAYlP;AAFF,GAA1B;;AAKA8D,SAAO3E,MAAP,GAAgB,IAAhB;AACAtC,OAAKsC,MAAL,GAAc,IAAd;;AAEA,WAASyP,YAAT,CAAuBzL,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnCqH,WAAO/D,CAAP,GAAWtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAA9B,GAAkCsP,kBAAkBtP,CAA/D;AACA+D,WAAO9D,CAAP,GAAWvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAA9B,GAAkCqP,kBAAkBrP,CAA/D;;AAEA,QAAI+C,yBAAJ,EAA+B;AAC7Be,aAAO/D,CAAP,GAAWqB,KAAKC,GAAL,CAASyC,OAAO/D,CAAhB,EAAmB,CAAnB,CAAX;AACA+D,aAAO/D,CAAP,GAAWqB,KAAKqN,GAAL,CAAS3K,OAAO/D,CAAhB,EAAmBtD,UAAUmL,KAAV,CAAgBpI,KAAnC,CAAX;;AAEAsE,aAAO9D,CAAP,GAAWoB,KAAKC,GAAL,CAASyC,OAAO9D,CAAhB,EAAmB,CAAnB,CAAX;AACA8D,aAAO9D,CAAP,GAAWoB,KAAKqN,GAAL,CAAS3K,OAAO9D,CAAhB,EAAmBvD,UAAUmL,KAAV,CAAgBpG,MAAnC,CAAX;AACD;;AAEDlG,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMS,YAAY,qCAAlB;AACA,QAAMkS,oBAAoB;AACxBrS,wBADwB;AAExBN,sBAFwB;AAGxBO,uBAAiBO;AAHO,KAA1B;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCkS,iBAAjC;AACD;;AAED,WAASI,eAAT,CAA0B3L,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,8BAAShB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsM,YAArD;AACA,8BAASnT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDwM,eAAtD;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,0BAAxB,EAAoDwM,eAApD;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CwM,eAA/C;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDyB,wBAAtD;AACA,8BAAStI,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,iCAAxB,EAA2D0M,uBAA3D;;AAEA,QAAI7L,EAAEzF,IAAF,KAAW,4BAAX,IAA2CyF,EAAEzF,IAAF,KAAW,4BAA1D,EAAwF;AACtFoG,aAAO3E,MAAP,GAAgB,KAAhB;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACAqK;;AAEA;AACD;;AAEDtC,WAAO3E,MAAP,GAAgB,KAAhB;AACAtC,SAAKsC,MAAL,GAAc,KAAd;AACA2E,WAAO/D,CAAP,GAAWtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAA9B,GAAkCsP,kBAAkBtP,CAA/D;AACA+D,WAAO9D,CAAP,GAAWvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAA9B,GAAkCqP,kBAAkBrP,CAA/D;;AAEA,QAAI+C,yBAAJ,EAA+B;AAC7Be,aAAO/D,CAAP,GAAWqB,KAAKC,GAAL,CAASyC,OAAO/D,CAAhB,EAAmB,CAAnB,CAAX;AACA+D,aAAO/D,CAAP,GAAWqB,KAAKqN,GAAL,CAAS3K,OAAO/D,CAAhB,EAAmBtD,UAAUmL,KAAV,CAAgBpI,KAAnC,CAAX;;AAEAsE,aAAO9D,CAAP,GAAWoB,KAAKC,GAAL,CAASyC,OAAO9D,CAAhB,EAAmB,CAAnB,CAAX;AACA8D,aAAO9D,CAAP,GAAWoB,KAAKqN,GAAL,CAAS3K,OAAO9D,CAAhB,EAAmBvD,UAAUmL,KAAV,CAAgBpG,MAAnC,CAAX;AACD;;AAEDlG,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI,OAAOqK,kBAAP,KAA8B,UAAlC,EAA8C;AAC5CA;AACD;AACF;;AAED,WAASrC,wBAAT,CAAmCZ,CAAnC,EAAsC;AACpC;AACA;AACA;AACAA,MAAEY,wBAAF;;AAEA,WAAO,KAAP;AACD;;AAED,4BAAStI,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD0L,YAApD;AACA,4BAASnT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD4L,eAArD;AACA,4BAASrT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,0BAAvB,EAAmD4L,eAAnD;AACA,4BAASrT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C4L,eAA9C;AACA,4BAASrT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDa,wBAArD;;AAEA,WAASiL,uBAAT,GAAoC;AAClC,8BAASvT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsM,YAArD;AACA,8BAASnT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDwM,eAAtD;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,0BAAxB,EAAoDwM,eAApD;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CwM,eAA/C;AACA,8BAASrT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDyB,wBAAtD;AACA,8BAAStI,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,iCAAxB,EAA2D0M,uBAA3D;;AAEAlL,WAAO3E,MAAP,GAAgB,KAAhB;AACAtC,SAAKsC,MAAL,GAAc,KAAd;AACA2E,WAAO/D,CAAP,GAAWtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAA9B,GAAkCsP,kBAAkBtP,CAA/D;AACA+D,WAAO9D,CAAP,GAAWvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAA9B,GAAkCqP,kBAAkBrP,CAA/D;;AAEA,QAAI+C,yBAAJ,EAA+B;AAC7Be,aAAO/D,CAAP,GAAWqB,KAAKC,GAAL,CAASyC,OAAO/D,CAAhB,EAAmB,CAAnB,CAAX;AACA+D,aAAO/D,CAAP,GAAWqB,KAAKqN,GAAL,CAAS3K,OAAO/D,CAAhB,EAAmBtD,UAAUmL,KAAV,CAAgBpI,KAAnC,CAAX;;AAEAsE,aAAO9D,CAAP,GAAWoB,KAAKC,GAAL,CAASyC,OAAO9D,CAAhB,EAAmB,CAAnB,CAAX;AACA8D,aAAO9D,CAAP,GAAWoB,KAAKqN,GAAL,CAAS3K,OAAO9D,CAAhB,EAAmBvD,UAAUmL,KAAV,CAAgBpG,MAAnC,CAAX;AACD;;AAEDlG,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;;AAED,4BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,iCAAvB,EAA0D8L,uBAA1D;AACD,C;;AApHD;;;;AACA;;;;;;;;;;;;;;;;QCGgBM,+B,GAAAA,+B;QAgBAC,wB,GAAAA,wB;QAiEAC,sB,GAAAA,sB;;AArFhB;;;;AACA;;;;;;AAEA;AACO,SAASF,+BAAT,CAA0CG,YAA1C,EAAwDC,UAAxD,EAAoE;AACzE,MAAMC,aAAa,+BAAiBD,WAAWC,UAA5B,CAAnB;AACA,MAAMC,gBAAgB,+BAAiBF,WAAWE,aAA5B,CAAtB;AACA,MAAMC,uBAAuB,+BAAiBH,WAAWG,oBAA5B,CAA7B;AACA,MAAM7H,QAAQyH,aAAaK,KAAb,GAAqBC,GAArB,CAAyBF,oBAAzB,CAAd;AACA,MAAM9P,IAAI4P,WAAWK,GAAX,CAAehI,KAAf,IAAwB0H,WAAWO,kBAA7C;AACA,MAAMjQ,IAAI4P,cAAcI,GAAd,CAAkBhI,KAAlB,IAA2B0H,WAAWQ,eAAhD;;AAGA,SAAO;AACLnQ,QADK;AAELC;AAFK,GAAP;AAID;;AAED;AACO,SAASuP,wBAAT,CAAmCY,UAAnC,EAA+CT,UAA/C,EAA2D;AAChE,MAAMC,aAAa,+BAAiBD,WAAWC,UAA5B,CAAnB;AACA,MAAMC,gBAAgB,+BAAiBF,WAAWE,aAA5B,CAAtB;AACA,MAAMC,uBAAuB,+BAAiBH,WAAWG,oBAA5B,CAA7B;;AAEA,MAAM9P,IAAI4P,WAAWG,KAAX,GAAmBM,cAAnB,CAAkCD,WAAWpQ,CAA7C,CAAV;;AAEAA,IAAEqQ,cAAF,CAAiBV,WAAWO,kBAA5B;AACA,MAAMjQ,IAAI4P,cAAcE,KAAd,GAAsBM,cAAtB,CAAqCD,WAAWnQ,CAAhD,CAAV;;AAEAA,IAAEoQ,cAAF,CAAiBV,WAAWQ,eAA5B;AACA,MAAMT,eAAe1P,EAAExD,GAAF,CAAMyD,CAAN,CAArB;;AAEAyP,eAAalT,GAAb,CAAiBsT,oBAAjB;;AAEA,SAAOJ,YAAP;AACD;;AAED,SAASY,0BAAT,CAAqCX,UAArC,EAAiD;AAC/C;AACA,MAAMY,UAAUf,yBAAyB;AACvCxP,OAAG,CADoC;AAEvCC,OAAG;AAFoC,GAAzB,EAGb0P,UAHa,CAAhB;AAIA,MAAMa,WAAWhB,yBAAyB;AACxCxP,OAAG2P,WAAWc,OAD0B;AAExCxQ,OAAG;AAFqC,GAAzB,EAGd0P,UAHc,CAAjB;AAIA,MAAMe,aAAalB,yBAAyB;AAC1CxP,OAAG,CADuC;AAE1CC,OAAG0P,WAAWgB;AAF4B,GAAzB,EAGhBhB,UAHgB,CAAnB;AAIA,MAAMiB,cAAcpB,yBAAyB;AAC3CxP,OAAG2P,WAAWc,OAD6B;AAE3CxQ,OAAG0P,WAAWgB;AAF6B,GAAzB,EAGjBhB,UAHiB,CAApB;;AAKE;AACF,MAAMkB,OAAO;AACXjP,SAAK,IAAI,0BAASnG,eAAT,CAAyBqV,KAA7B,CAAmCP,OAAnC,EAA4CC,QAA5C,CADM;AAEX7O,UAAM,IAAI,0BAASlG,eAAT,CAAyBqV,KAA7B,CAAmCP,OAAnC,EAA4CG,UAA5C,CAFK;AAGXK,WAAO,IAAI,0BAAStV,eAAT,CAAyBqV,KAA7B,CAAmCN,QAAnC,EAA6CI,WAA7C,CAHI;AAIXI,YAAQ,IAAI,0BAASvV,eAAT,CAAyBqV,KAA7B,CAAmCJ,UAAnC,EAA+CE,WAA/C;AAJG,GAAb;;AAQA,SAAOC,IAAP;AACD;;AAED,SAASI,yBAAT,CAAoCC,IAApC,EAA0CL,IAA1C,EAAgD;AAC9C,MAAMM,gBAAgB,EAAtB;;AAEAhR,SAAO2C,IAAP,CAAY+N,IAAZ,EAAkB3P,OAAlB,CAA0B,UAAUkQ,IAAV,EAAgB;AACxC,QAAMC,UAAUR,KAAKO,IAAL,CAAhB;AACA,QAAME,eAAeJ,KAAKK,aAAL,CAAmBF,OAAnB,CAArB;;AAEA,QAAIC,YAAJ,EAAkB;AAChBH,oBAAc3H,IAAd,CAAmB8H,YAAnB;AACD;AACF,GAPD;;AASA,SAAOH,aAAP;AACD;;AAED;AACO,SAAS1B,sBAAT,CAAiC+B,gBAAjC,EAAmDC,mBAAnD,EAAwE;AAC7E,MAAMC,mBAAmB,+BAAiBF,iBAAiB5B,UAAlC,CAAzB;AACA,MAAM+B,sBAAsB,+BAAiBH,iBAAiB3B,aAAlC,CAA5B;AACA,MAAM+B,6BAA6B,+BAAiBJ,iBAAiB1B,oBAAlC,CAAnC;AACA,MAAM+B,sBAAsB,+BAAiBJ,oBAAoB7B,UAArC,CAA5B;AACA,MAAMkC,yBAAyB,+BAAiBL,oBAAoB5B,aAArC,CAA/B;AACA,MAAMkC,gCAAgC,+BAAiBN,oBAAoB3B,oBAArC,CAAtC;;AAEA;AACA,MAAMkC,eAAeN,iBAAiB3B,KAAjB,GAAyBkC,KAAzB,CAA+BN,mBAA/B,CAArB;AACA,MAAMO,cAAc,IAAI,0BAASzW,eAAT,CAAyB0W,KAA7B,EAApB;;AAEAD,cAAYE,6BAAZ,CAA0CJ,YAA1C,EAAwDJ,0BAAxD;;AAEA,MAAMS,kBAAkBR,oBAAoB9B,KAApB,GAA4BkC,KAA5B,CAAkCH,sBAAlC,CAAxB;AACA,MAAMQ,iBAAiB,IAAI,0BAAS7W,eAAT,CAAyB0W,KAA7B,EAAvB;;AAEAG,iBAAeF,6BAAf,CAA6CC,eAA7C,EAA8DN,6BAA9D;;AAEA,MAAMQ,kBAAkBD,eAAevC,KAAf,GAAuByC,cAAvB,CAAsCN,WAAtC,CAAxB;AACA,MAAMO,SAASF,gBAAgBE,MAA/B;AACA,MAAMC,YAAYH,gBAAgBG,SAAlC;;AAEA;AACA,MAAM9B,cAAcpB,yBAAyB;AAC3CxP,OAAGyR,oBAAoBhB,OADoB;AAE3CxQ,OAAGwR,oBAAoBd;AAFoB,GAAzB,EAGjBc,mBAHiB,CAApB;AAIA,MAAM3N,WAAWiO,8BAA8BY,UAA9B,CAAyC/B,WAAzC,CAAjB;;AAEA;AACA,MAAMM,OAAO,IAAI,0BAASzV,eAAT,CAAyBqV,KAA7B,EAAb;;AAEAI,OAAK0B,KAAL,GAAaH,MAAb;AACAvB,OAAKjO,GAAL,GAAWwP,OAAO1C,KAAP,GAAevT,GAAf,CAAmBkW,UAAUrC,cAAV,CAAyBvM,QAAzB,CAAnB,CAAX;;AAEA;AACA,MAAM+M,OAAOP,2BAA2BmB,mBAA3B,CAAb;AACA,MAAMN,gBAAgBF,0BAA0BC,IAA1B,EAAgCL,IAAhC,CAAtB;;AAEA;AACA;AACA,MAAIM,cAAcjU,MAAd,KAAyB,CAA7B,EAAgC;AAC9B;AACD;;AAED,SAAO;AACL0V,WAAOzB,cAAc,CAAd,CADF;AAELlO,SAAKkO,cAAc,CAAd;AAFA,GAAP;AAID,C;;;;;;;;;;;;;ACvID;;;;AACA;;;;AAEA,IAAM0B,cAAc;AAClBC,eAAa,EADK;AAElBC,aAAW,EAFO;AAGlBC,YAAU;AAHQ,CAApB;;AAMA,IAAMC,cAAc;AAClBH,eAAa,CADK;AAElBC,aAAW,CAFO;AAGlBC,YAAU;AAHQ,CAApB;;AAMA,IAAIE,iBAAiB;AACnBJ,eAAa,CADM;AAEnBC,aAAW,CAFQ;AAGnBC,YAAU;AAHS,CAArB;;AAMA,IAAIG,QAAQ,KAAZ;AACA,IAAMC,YAAY,EAAlB;;AAEA,SAASC,UAAT,CAAqBrX,OAArB,EAA8BgN,OAA9B,EAAuCrL,IAAvC,EAA6C2V,YAA7C,EAA2DC,YAA3D,EAAyEC,YAAzE,EAAuF;AACrF,MAAI,CAACX,YAAYtJ,cAAZ,CAA2B5L,IAA3B,CAAL,EAAuC;AACrC,UAAM,IAAI8V,KAAJ,CAAU,iEAAV,CAAN;AACD;;AAED,MAAI,CAACzX,OAAD,IAAY,CAACgN,OAAjB,EAA0B;AACxB;AACD;;AAED;AACA,MAAM0K,iBAAiB;AACrB/V,cADqB;AAErBqL,oBAFqB;AAGrBsK,8BAHqB;AAIrBC,8BAJqB;AAKrBC;AALqB,GAAvB;;AAQA;AACA,MAAMG,eAAe,0BAASpY,WAAT,CAAqBqY,UAArB,CAAgCC,eAAhC,CAAgD7K,OAAhD,CAArB;;AAEA,MAAI2K,YAAJ,EAAkB;AAChBA,iBAAaG,IAAb,CAAkB,UAAUjM,KAAV,EAAiB;AACjC0L,mBAAa1L,KAAb;AACD,KAFD,EAEG,UAAUkM,KAAV,EAAiB;AAClBP,mBAAaO,KAAb;AACD,KAJD;;AAMA;AACD;;AAED;AACAlB,cAAYlV,IAAZ,EAAkB6L,IAAlB,CAAuBkK,cAAvB;AACD;;AAED,SAASM,iBAAT,CAA4BrW,IAA5B,EAAkC;AAChC;AACA,MAAI,CAACkV,YAAYtJ,cAAZ,CAA2B5L,IAA3B,CAAL,EAAuC;AACrC,UAAM,IAAI8V,KAAJ,CAAU,iEAAV,CAAN;AACD;;AAEDZ,cAAYlV,IAAZ,IAAoB,EAApB;AACD;;AAED,SAASsW,UAAT,GAAuB;AACrB,MAAI,CAACd,KAAL,EAAY;AACV;AACD;;AAEDe,aAAW,YAAY;AACrBC;AACD,GAFD,EAEGf,SAFH;AAGD;;AAED,SAASgB,WAAT,CAAsBV,cAAtB,EAAsC;AACpC,MAAMnY,cAAc,0BAASA,WAA7B;AACA;AACA,MAAMoC,OAAO+V,eAAe/V,IAA5B;;AAEAsV,cAAYtV,IAAZ;;AAEAwV,UAAQ,IAAR;AACA,MAAMnK,UAAU0K,eAAe1K,OAA/B;AACA,MAAMuK,eAAeG,eAAeH,YAApC;AACA,MAAMC,eAAeE,eAAeF,YAApC;;AAEA;AACA,MAAMG,eAAepY,YAAYqY,UAAZ,CAAuBC,eAAvB,CAAuC7K,OAAvC,CAArB;;AAEA,MAAI2K,YAAJ,EAAkB;AAChB;AACA;AACAA,iBAAaG,IAAb,CAAkB,UAAUjM,KAAV,EAAiB;AACjCoL,kBAAYtV,IAAZ;AACA;;AAEA4V,mBAAa1L,KAAb;AACAoM;AACD,KAND,EAMG,UAAUF,KAAV,EAAiB;AAClBd,kBAAYtV,IAAZ;AACA;AACA6V,mBAAaO,KAAb;AACAE;AACD,KAXD;;AAaA;AACD;;AAED,WAASI,yBAAT,CAAoCX,cAApC,EAAoD;AAClD,QAAIA,eAAe/V,IAAf,KAAwB,UAA5B,EAAwC;AACtC,aAAO,CAAC,CAAR;AACD,KAFD,MAEO,IAAI+V,eAAe/V,IAAf,KAAwB,aAA5B,EAA2C;AAChD,aAAO,CAAP;AACD,KAFM,MAEA,IAAI+V,eAAe/V,IAAf,KAAwB,WAA5B,EAAyC;AAC9C,aAAO,CAAP;AACD;AACF;;AAED,MAAM2W,WAAWD,0BAA0BX,cAA1B,CAAjB;;AAEA,MAAIa,eAAJ;;AAEA,MAAIb,eAAeJ,YAAf,KAAgC,IAApC,EAA0C;AACxCiB,aAAShZ,YAAYiZ,SAAZ,CAAsBxL,OAAtB,EAA+B;AACtCsL,wBADsC;AAEtC3W,YAAM+V,eAAe/V;AAFiB,KAA/B,CAAT;AAID,GALD,MAKO;AACL4W,aAAShZ,YAAYkZ,iBAAZ,CAA8BzL,OAA9B,EAAuC;AAC9CsL,wBAD8C;AAE9C3W,YAAM+V,eAAe/V;AAFyB,KAAvC,CAAT;AAID;;AAED;AACA4W,SAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3BoL,gBAAYtV,IAAZ;AACA;AACA4V,iBAAa1L,KAAb;AACAoM;AACD,GALD,EAKG,UAAUF,KAAV,EAAiB;AAClBd,gBAAYtV,IAAZ;AACA;AACA6V,iBAAaO,KAAb;AACAE;AACD,GAVD;AAWD;;AAED,SAASE,aAAT,GAA0B;AACxB;AACA,MAAM/H,0BAA0B,6DAAhC;;AAEA8G,mBAAiB;AACfJ,iBAAazR,KAAKC,GAAL,CAAS8K,uBAAT,EAAkC,CAAlC,CADE;AAEf2G,eAAW1R,KAAKC,GAAL,CAAS8K,0BAA0B,CAAnC,EAAsC,CAAtC,CAFI;AAGf4G,cAAU3R,KAAKC,GAAL,CAAS8K,0BAA0B,CAAnC,EAAsC,CAAtC;AAHK,GAAjB;;AAMA,MAAMsI,kBAAkBzB,YAAYH,WAAZ,GAChBG,YAAYF,SADI,GAEhBE,YAAYD,QAFpB;AAGA,MAAM2B,iBAAiBvI,0BAA0BsI,eAAjD;;AAEA,OAAK,IAAIzX,IAAI,CAAb,EAAgBA,IAAI0X,cAApB,EAAoC1X,GAApC,EAAyC;AACvC,QAAMyW,iBAAiBkB,gBAAvB;;AAEA,QAAIlB,cAAJ,EAAoB;AAClBU,kBAAYV,cAAZ;AACD;AACF;AACF;;AAED,SAASkB,cAAT,GAA2B;AACzB,MAAI/B,YAAYC,WAAZ,CAAwB5V,MAAxB,IAAkC+V,YAAYH,WAAZ,GAA0BI,eAAeJ,WAA/E,EAA4F;AAC1F,WAAOD,YAAYC,WAAZ,CAAwB+B,KAAxB,EAAP;AACD;;AAED,MAAIhC,YAAYE,SAAZ,CAAsB7V,MAAtB,IAAgC+V,YAAYF,SAAZ,GAAwBG,eAAeH,SAA3E,EAAsF;AACpF,WAAOF,YAAYE,SAAZ,CAAsB8B,KAAtB,EAAP;AACD;;AAED,MAAIhC,YAAYG,QAAZ,CAAqB9V,MAArB,IAA+B+V,YAAYD,QAAZ,GAAuBE,eAAeF,QAAzE,EAAmF;AACjF,WAAOH,YAAYG,QAAZ,CAAqB6B,KAArB,EAAP;AACD;;AAED,MAAI,CAAChC,YAAYC,WAAZ,CAAwB5V,MAAzB,IACI,CAAC2V,YAAYE,SAAZ,CAAsB7V,MAD3B,IAEI,CAAC2V,YAAYG,QAAZ,CAAqB9V,MAF9B,EAEsC;AACpCiW,YAAQ,KAAR;AACD;;AAED,SAAO,KAAP;AACD;;AAED,SAAS2B,cAAT,GAA2B;AACzB,SAAOjC,WAAP;AACD;;kBAEc;AACbQ,wBADa;AAEbW,sCAFa;AAGbG,8BAHa;AAIbW;AAJa,C;;;;;;;;;;;;;kBCxMA,UAAUxN,iBAAV,EAA6BpH,OAA7B,EAAsC;AACnD,MAAIiC,gBAAgB,EAApB;AACA,MAAIoF,SAAS,gCAAb;;AAEA,MAAIrH,WAAWA,QAAQsH,gBAAR,KAA6B,IAA5C,EAAkD;AAChDD,cAAU,kCAAV;AACD;;AAED,MAAM1C,gBAAgB;AACpBN,YADoB,oBACVvI,OADU,EACD;AACjB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;;AAEA,UAAIpH,WAAWA,QAAQxD,SAAvB,EAAkC;AAChC,kCAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBoE,MAAvB,EAA+BrH,QAAQxD,SAAvC,EAAkD4K,iBAAlD;AACD,OAFD,MAEO;AACL,kCAAS5L,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBoE,MAAvB,EAA+BD,iBAA/B;AACD;;AAED,UAAIpH,WAAWA,QAAQuH,gBAAvB,EAAyC;AACvCvH,gBAAQuH,gBAAR,CAAyBzL,OAAzB;AACD;AACF,KAbmB;AAcpBkI,WAdoB,mBAcXlI,OAdW,EAcF;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;AACA,UAAIpH,WAAWA,QAAQwH,eAAvB,EAAwC;AACtCxH,gBAAQwH,eAAR,CAAwB1L,OAAxB;AACD;AACF,KAnBmB;AAoBpBqI,UApBoB,kBAoBZrI,OApBY,EAoBH;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;AACA,UAAIpH,WAAWA,QAAQyH,cAAvB,EAAuC;AACrCzH,gBAAQyH,cAAR,CAAuB3L,OAAvB;AACD;AACF,KAzBmB;AA0BpBwI,cA1BoB,sBA0BRxI,OA1BQ,EA0BC;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBgF,MAAxB,EAAgCD,iBAAhC;AACA,UAAIpH,WAAWA,QAAQ0H,kBAAvB,EAA2C;AACzC1H,gBAAQ0H,kBAAR,CAA2B5L,OAA3B;AACD;AACF,KA/BmB;AAgCpB0I,oBAhCoB,8BAgCA;AAClB,aAAOvC,aAAP;AACD,KAlCmB;AAmCpBwC,oBAnCoB,4BAmCFC,MAnCE,EAmCM;AACxBzC,sBAAgByC,MAAhB;AACD;AArCmB,GAAtB;;AAyCA,SAAOC,aAAP;AACD,C;;AApDD;;;;;;;;;;;;;;;;;kBCGe,UAAU7I,OAAV,EAAmB+Y,MAAnB,EAAyC;AAAA,MAAdC,IAAc,uEAAP,KAAO;;AACtD,MAAMjY,WAAW,6BAAaf,OAAb,EAAsB,OAAtB,CAAjB;;AAEA,MAAI,CAACe,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED,MAAM+X,YAAYlY,SAASD,IAAT,CAAc,CAAd,CAAlB;;AAEA,MAAIoY,kBAAkBD,UAAUE,mBAAV,GAAgCJ,MAAtD;;AAEA,MAAIC,IAAJ,EAAU;AACR,QAAMI,WAAWH,UAAUI,QAAV,CAAmBnY,MAApC;;AAEAgY,uBAAmBE,QAAnB;AACD,GAJD,MAIO;AACLF,sBAAkB7T,KAAKqN,GAAL,CAASuG,UAAUI,QAAV,CAAmBnY,MAAnB,GAA4B,CAArC,EAAwCgY,eAAxC,CAAlB;AACAA,sBAAkB7T,KAAKC,GAAL,CAAS,CAAT,EAAY4T,eAAZ,CAAlB;AACD;;AAED,+BAAclZ,OAAd,EAAuBkZ,eAAvB;AACD,C;;AAxBD;;;;AACA;;;;;;;;;;;;;;;kBCDe,UAAUI,KAAV,EAAiBC,SAAjB,EAA4B;AACzC,MAAMC,aAAanU,KAAKoU,GAAL,CAAS,EAAT,EAAaF,SAAb,CAAnB;;AAGA,SAAQlU,KAAKqU,KAAL,CAAWJ,QAAQE,UAAnB,IAAiCA,UAAzC;AACD,C;;;;;;;;;;;;;kBCLc,UAAUG,OAAV,EAAmBC,QAAnB,EAA6B;AAC1C,MAAMC,UAAUF,QAAQlW,KAAR,GAAgB,CAAhC;AACA,MAAMqW,UAAUH,QAAQlU,MAAR,GAAiB,CAAjC;;AAEA,MAAIoU,WAAW,GAAX,IAAkBC,WAAW,GAAjC,EAAsC;AACpC,WAAO,KAAP;AACD;;AAED,MAAMC,SAAS;AACb/V,OAAG2V,QAAQhU,IAAR,GAAekU,OADL;AAEb5V,OAAG0V,QAAQ/T,GAAR,GAAckU;AAFJ,GAAf;;AAKE;;;;;AAKF,MAAME,aAAa;AACjBhW,OAAG4V,SAAS5V,CAAT,GAAa+V,OAAO/V,CADN;AAEjBC,OAAG2V,SAAS3V,CAAT,GAAa8V,OAAO9V;AAFN,GAAnB;;AAKA,MAAMgW,YAAcD,WAAWhW,CAAX,GAAegW,WAAWhW,CAA3B,IAAiC6V,UAAUA,OAA3C,CAAD,GAA0DG,WAAW/V,CAAX,GAAe+V,WAAW/V,CAA3B,IAAiC6V,UAAUA,OAA3C,CAAzD,IAAiH,GAAnI;;AAGA,SAAOG,SAAP;AACD,C;;;;;;;;;;;;;kBCrBc,UAAU7S,CAAV,EAAa;AAC1B,MAAIA,EAAE8S,eAAN,EAAuB;AACrB9S,MAAE8S,eAAF;AACD;;AAED,MAAI9S,EAAEgD,cAAN,EAAsB;AACpBhD,MAAEgD,cAAF;AACD;;AAEDhD,IAAE+S,YAAF,GAAiB,IAAjB;AACA/S,IAAEgT,WAAF,GAAgB,KAAhB;;AAEA,SAAO,KAAP;AACD,C;;;;;;;;;;;;;kBCjBc,UAAUpa,OAAV,EAAmBgE,CAAnB,EAAsBC,CAAtB,EAAyBR,KAAzB,EAAgCgC,MAAhC,EAAwC;AACrD,MAAI,CAACzF,OAAL,EAAc;AACZ,UAAM,IAAIyX,KAAJ,CAAU,uDAAV,CAAN;AACD;;AAEDzT,MAAIqB,KAAKqU,KAAL,CAAW1V,CAAX,CAAJ;AACAC,MAAIoB,KAAKqU,KAAL,CAAWzV,CAAX,CAAJ;AACA,MAAMoW,iBAAiB,0BAAS9a,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAAvB;AACA,MAAMsa,kBAAkB,EAAxB;AACA,MAAIvU,QAAQ,CAAZ;AACA,MAAMwU,YAAYF,eAAexO,KAAf,CAAqB2O,YAArB,EAAlB;AACA,MAAIC,gBAAJ;AAAA,MACEC,YADF;AAAA,MAEEC,eAFF;;AAIA,MAAIN,eAAexO,KAAf,CAAqBhJ,KAAzB,EAAgC;AAC9B,SAAK6X,MAAM,CAAX,EAAcA,MAAMjV,MAApB,EAA4BiV,KAA5B,EAAmC;AACjC,WAAKC,SAAS,CAAd,EAAiBA,SAASlX,KAA1B,EAAiCkX,QAAjC,EAA2C;AACzCF,kBAAU,CAAE,CAACC,MAAMzW,CAAP,IAAYoW,eAAexO,KAAf,CAAqB4I,OAAlC,IAA8CkG,SAAS3W,CAAvD,CAAD,IAA8D,CAAxE;AACA,YAAM4W,MAAML,UAAUE,OAAV,CAAZ;AACA,YAAMI,QAAQN,UAAUE,UAAU,CAApB,CAAd;AACA,YAAMK,OAAOP,UAAUE,UAAU,CAApB,CAAb;AACA,YAAMM,QAAQR,UAAUE,UAAU,CAApB,CAAd;;AAEAH,wBAAgBvU,OAAhB,IAA2B6U,GAA3B;AACAN,wBAAgBvU,OAAhB,IAA2B8U,KAA3B;AACAP,wBAAgBvU,OAAhB,IAA2B+U,IAA3B;AACAR,wBAAgBvU,OAAhB,IAA2BgV,KAA3B;AACD;AACF;AACF;;AAED,SAAOT,eAAP;AACD,C;;AAnCD;;;;;;;;;;;;;;;;;kBCEe,UAAUU,MAAV,EAAkB;AAC/B,MAAM3H,OAAO,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+BgP,IAA/B,CAAoCD,OAAO3H,IAA3C,CAAb;AACA,MAAMxH,QAAQ,0BAASpM,eAAT,CAAyBwM,KAAzB,CAA+BgP,IAA/B,CAAoCD,OAAOnP,KAA3C,CAAd;AACA,MAAMqP,SAAS,0BAASzb,eAAT,CAAyBwM,KAAzB,CAA+BgP,IAA/B,CAAoCD,OAAOE,MAA3C,CAAf;AACA,MAAMzT,SAAS,0BAAShI,eAAT,CAAyBwM,KAAzB,CAA+BgP,IAA/B,CAAoCD,OAAOvT,MAA3C,CAAf;;AAEA,SAAO;AACL4L,cADK;AAELxH,gBAFK;AAGLqP,kBAHK;AAILzT;AAJK,GAAP;AAMD,C;;AAdD;;;;;;;;;;;;;;;;ACAA,IAAI0T,mBAAJ;;AAEA,SAAS9T,SAAT,CAAoB3G,SAApB,EAA+B;AAC7Bya,eAAaza,UAAU8G,aAAV,CAAwBC,MAArC;AACD;;AAED,SAAS2T,SAAT,GAAsB;AACpB,SAAOD,UAAP;AACD;;AAED,IAAME,kBAAkB;AACtBhU,sBADsB;AAEtB+T;AAFsB,CAAxB;;kBAKeC,e;;;;;;;;;;;;;kBCGA,UAAUrb,OAAV,EAAmB+G,OAAnB,EAA4BuU,WAA5B,EAAyCxL,iBAAzC,EAA4D;AACzE,MAAI,CAACA,iBAAL,EAAwB;AACtBA,wBAAoB,CAApB;AACD;;AAED,MAAMyL,eAAeC,gBAAgBzU,OAAhB,CAArB;AACA,MAAMgJ,eAAe,uCAAwB/P,OAAxB,EAAiC+G,OAAjC,EAA0CuU,WAA1C,EAAuDxL,iBAAvD,CAArB;;AAEA,MAAIyL,iBAAiBxL,YAArB,EAAmC;AACjC,QAAIA,iBAAiB3P,SAArB,EAAgC;AAC9B2P,mBAAa3M,MAAb,GAAsB,IAAtB;AACD;;AAED,QAAImY,iBAAiBnb,SAArB,EAAgC;AAC9Bmb,mBAAanY,MAAb,GAAsB,KAAtB;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,C;;AAvCD;;;;;;AAEA,SAASoY,eAAT,CAA0BzU,OAA1B,EAAmC;AACjC,MAAIwU,qBAAJ;;AAEApX,SAAO2C,IAAP,CAAYC,OAAZ,EAAqB7B,OAArB,CAA6B,UAAU6D,IAAV,EAAgB;AAC3C,QAAMhB,SAAShB,QAAQgC,IAAR,CAAf;;AAEA,QAAIhB,OAAO3E,MAAP,KAAkB,IAAtB,EAA4B;AAC1BmY,qBAAexT,MAAf;;AAEA;AACD;AACF,GARD;;AAUA,SAAOwT,YAAP;AACD,C;;;;;;;;;;;;;kBCXc,UAAUlV,cAAV,EAA0BvF,IAA1B,EAAgCC,QAAhC,EAA0CT,QAA1C,EAAoD4D,OAApD,EAA6DmG,kBAA7D,EAAiF;AAC9F,MAAM9K,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUqG,eAAerG,OAA/B;;AAEA,WAASwS,iBAAT,CAA4BpL,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxCI,SAAKsC,MAAL,GAAc,IAAd;;AAEAe,WAAO2C,IAAP,CAAYhG,KAAKiG,OAAjB,EAA0B7B,OAA1B,CAAkC,UAAU6D,IAAV,EAAgB;AAChD,UAAMhB,SAASjH,KAAKiG,OAAL,CAAagC,IAAb,CAAf;;AAEA,UAAIhB,OAAO0T,kBAAP,KAA8B,IAAlC,EAAwC;AACtC;AACD;;AAED1T,aAAO/D,CAAP,IAAYtD,UAAUgb,WAAV,CAAsB7P,KAAtB,CAA4B7H,CAAxC;AACA+D,aAAO9D,CAAP,IAAYvD,UAAUgb,WAAV,CAAsB7P,KAAtB,CAA4B5H,CAAxC;;AAEA,UAAIC,QAAQ8C,yBAAR,KAAsC,IAA1C,EAAgD;AAC9Ce,eAAO/D,CAAP,GAAWqB,KAAKC,GAAL,CAASyC,OAAO/D,CAAhB,EAAmB,CAAnB,CAAX;AACA+D,eAAO/D,CAAP,GAAWqB,KAAKqN,GAAL,CAAS3K,OAAO/D,CAAhB,EAAmBtD,UAAUmL,KAAV,CAAgBpI,KAAnC,CAAX;;AAEAsE,eAAO9D,CAAP,GAAWoB,KAAKC,GAAL,CAASyC,OAAO9D,CAAhB,EAAmB,CAAnB,CAAX;AACA8D,eAAO9D,CAAP,GAAWoB,KAAKqN,GAAL,CAAS3K,OAAO9D,CAAhB,EAAmBvD,UAAUmL,KAAV,CAAgBpG,MAAnC,CAAX;AACD;AACF,KAjBD;;AAmBAlG,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMS,YAAY,qCAAlB;AACA,QAAMkS,oBAAoB;AACxBrS,wBADwB;AAExBN,sBAFwB;AAGxBO,uBAAiBO;AAHO,KAA1B;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCkS,iBAAjC;;AAEA,WAAO,KAAP,CAjCwC,CAiC1B;AACf;;AAED,4BAASjT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDqL,iBAApD;;AAEA,WAASI,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtCI,SAAKoG,WAAL,GAAmB,IAAnB;;AAEA,8BAASxH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiM,iBAArD;AACA,8BAAS9S,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,8BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDqM,eAAtD;;AAEA;AACA,QAAI1O,QAAQ+D,0BAAR,KAAuC,IAAvC,IACI,sCAAuBvH,SAAvB,EAAkCI,KAAKiG,OAAvC,CADR,EACyD;AACvD,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD;;AAEDvB,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI,OAAOqK,kBAAP,KAA8B,UAAlC,EAA8C;AAC5CA;AACD;AACF;;AAED,4BAAS3K,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkDyL,eAAlD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDyL,eAArD;;AAEA,SAAO,IAAP;AACD,C;;AAvED;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCCe,UAAU5S,OAAV,EAAmB2b,UAAnB,EAA+BC,IAA/B,EAAqC;AAClD,MAAM7a,WAAW,6BAAaf,OAAb,EAAsB,YAAtB,CAAjB;;AAEA,MAAI,CAACe,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED,MAAM3B,cAAc,0BAASA,WAA7B;AACA,MAAMsc,iBAAiB9a,SAASD,IAAT,CAAc,CAAd,CAAvB;AACA,MAAMgb,eAAeD,eAAeE,MAAf,CAAsBF,eAAeG,iBAArC,CAArB;AACA,MAAM7C,sBAAsB2C,aAAa3C,mBAAzC;AACA,MAAI8C,gBAAgBJ,eAAeG,iBAAf,GAAmCL,UAAvD;;AAEA;AACA,MAAIC,IAAJ,EAAU;AACR,QAAIK,iBAAiBJ,eAAeE,MAAf,CAAsB7a,MAA3C,EAAmD;AACjD+a,sBAAgB,CAAhB;AACD;;AAED,QAAIA,gBAAgB,CAApB,EAAuB;AACrBA,sBAAgBJ,eAAeE,MAAf,CAAsB7a,MAAtB,GAA+B,CAA/C;AACD;AACF,GARD,MAQO;AACL+a,oBAAgB5W,KAAKqN,GAAL,CAASmJ,eAAeE,MAAf,CAAsB7a,MAAtB,GAA+B,CAAxC,EAA2C+a,aAA3C,CAAhB;AACAA,oBAAgB5W,KAAKC,GAAL,CAAS,CAAT,EAAY2W,aAAZ,CAAhB;AACD;;AAED,MAAIA,kBAAkBJ,eAAeG,iBAArC,EAAwD;AACtD,QAAME,WAAW3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAAjB;AACA,QAAMoc,WAAWP,eAAeE,MAAf,CAAsBE,aAAtB,CAAjB;;AAEA,QAAMI,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,QAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,QAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,QAAIiR,mBAAJ,EAAyB;AACvBA,0BAAoBrc,OAApB;AACD;;AAED,QAAIuY,eAAJ;;AAEA,QAAI6D,SAAS9E,YAAT,KAA0B,IAA9B,EAAoC;AAClCiB,eAAShZ,YAAYiZ,SAAZ,CAAsB4D,SAAS/C,QAAT,CAAkBF,mBAAlB,CAAtB,CAAT;AACD,KAFD,MAEO;AACLZ,eAAShZ,YAAYkZ,iBAAZ,CAA8B2D,SAAS/C,QAAT,CAAkBF,mBAAlB,CAA9B,CAAT;AACD;;AAEDZ,WAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,UAAIgQ,eAAe1C,mBAAf,KAAuCA,mBAA3C,EAAgE;AAC9DiD,iBAASjD,mBAAT,GAA+BA,mBAA/B;AACA0C,uBAAeG,iBAAf,GAAmCC,aAAnC;AACA1c,oBAAYid,YAAZ,CAAyBxc,OAAzB,EAAkC6L,KAAlC,EAAyCqQ,QAAzC;AACA,YAAII,iBAAJ,EAAuB;AACrBA,4BAAkBtc,OAAlB,EAA2B6L,KAA3B;AACD;AACF;AACF,KATD,EASG,UAAUkM,KAAV,EAAiB;AAClB,UAAM/K,UAAUoP,SAAS/C,QAAT,CAAkBF,mBAAlB,CAAhB;;AAEA,UAAIoD,mBAAJ,EAAyB;AACvBA,4BAAoBvc,OAApB,EAA6BgN,OAA7B,EAAsC+K,KAAtC;AACD;AACF,KAfD;AAgBD;AACF,C;;AApED;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCGe,UAAUvC,gBAAV,EAA4BC,mBAA5B,EAAiD;AAC9D,MAAMuF,SAAS,4CAAuBxF,gBAAvB,EAAyCC,mBAAzC,CAAf;;AAEA,MAAI,CAACuF,MAAL,EAAa;AACX;AACD;;AAED,SAAO;AACLpE,WAAO,qDAAgCoE,OAAOpE,KAAvC,EAA8CpB,gBAA9C,CADF;AAELvO,SAAK,qDAAgC+T,OAAO/T,GAAvC,EAA4CuO,gBAA5C;AAFA,GAAP;AAID,C;;AAhBD,8C;;;;;;;;;;;;;kBCOe,UAAU1R,OAAV,EAAmBpD,SAAnB,EAA8B+b,aAA9B,EAA6CC,gBAA7C,EAA+D;AAC5E,MAAMnd,cAAc,0BAASA,WAA7B;AACA,MAAMod,cAAcpd,YAAYW,iBAAZ,CAA8Buc,aAA9B,EAA6C5Q,KAAjE;AACA,MAAM+Q,iBAAiBrd,YAAYW,iBAAZ,CAA8Bwc,gBAA9B,EAAgD7Q,KAAvE;;AAEA;AACA,MAAI,CAAC8Q,WAAD,IAAgB,CAACC,cAArB,EAAqC;AACnC;AACD;;AAED,MAAMpH,mBAAmBjW,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6C+b,YAAY3P,OAAzD,CAAzB;AACA,MAAMyI,sBAAsBlW,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6Cgc,eAAe5P,OAA5D,CAA5B;;AAEA;AACA,MAAI,CAACwI,gBAAD,IACE,CAACC,mBADH,IAEE,CAACD,iBAAiB5B,UAFpB,IAGE,CAAC4B,iBAAiB3B,aAHpB,IAIE,CAAC2B,iBAAiB1B,oBAJpB,IAKE,CAAC2B,oBAAoB7B,UALvB,IAME,CAAC6B,oBAAoB5B,aANvB,IAOE,CAAC4B,oBAAoB3B,oBAP3B,EAOiD;AAC/C;AACD;;AAED;AACA,MAAI0B,iBAAiBqH,mBAAjB,KAAyCpH,oBAAoBoH,mBAAjE,EAAsF;AACpF;AACD;;AAEDrH,mBAAiB5B,UAAjB,GAA8B,+BAAiB4B,iBAAiB5B,UAAlC,CAA9B;AACA4B,mBAAiB3B,aAAjB,GAAiC,+BAAiB2B,iBAAiB3B,aAAlC,CAAjC;AACA2B,mBAAiB1B,oBAAjB,GAAwC,+BAAiB0B,iBAAiB1B,oBAAlC,CAAxC;AACA2B,sBAAoB7B,UAApB,GAAiC,+BAAiB6B,oBAAoB7B,UAArC,CAAjC;AACA6B,sBAAoB5B,aAApB,GAAoC,+BAAiB4B,oBAAoB5B,aAArC,CAApC;AACA4B,sBAAoB3B,oBAApB,GAA2C,+BAAiB2B,oBAAoB3B,oBAArC,CAA3C;;AAEA;AACA,MAAMkC,eAAeR,iBAAiB5B,UAAjB,CAA4BG,KAA5B,GAAoCkC,KAApC,CAA0CT,iBAAiB3B,aAA3D,CAArB;AACA,MAAMwC,kBAAkBZ,oBAAoB7B,UAApB,CAA+BG,KAA/B,GAAuCkC,KAAvC,CAA6CR,oBAAoB5B,aAAjE,CAAxB;AACA,MAAIiJ,iBAAiB9G,aAAa+G,OAAb,CAAqB1G,eAArB,CAArB;;AAEAyG,mBAAiBzX,KAAK2X,GAAL,CAASF,cAAT,CAAjB;AACA,MAAIA,iBAAiB,GAArB,EAA0B;AAAE;AAC1B;AACD;;AAED,MAAMG,gBAAgB,sCAAuBzH,gBAAvB,EAAyCC,mBAAzC,CAAtB;;AAEA,MAAI,CAACwH,aAAL,EAAoB;AAClB;AACD;;AAED,MAAMC,qBAAqB3d,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cid,cAAcrG,KAA3D,CAA3B;AACA,MAAMuG,mBAAmB5d,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cid,cAAchW,GAA3D,CAAzB;;AAEA,MAAMpE,QAAQ,qBAAWK,cAAX,EAAd;AACA,MAAMiG,YAAY,oBAAUzF,YAAV,EAAlB;;AAEA;AACAI,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEAtZ,UAAQgB,IAAR;AACAhB,UAAQoF,SAAR;AACApF,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQqF,SAAR,GAAoBA,SAApB;AACArF,UAAQuZ,MAAR,CAAeH,mBAAmBlZ,CAAlC,EAAqCkZ,mBAAmBjZ,CAAxD;AACAH,UAAQwZ,MAAR,CAAeH,iBAAiBnZ,CAAhC,EAAmCmZ,iBAAiBlZ,CAApD;AACAH,UAAQ4F,MAAR;AACA5F,UAAQmC,OAAR;AACD,C;;AA7ED;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;;;;;;ACJA;;;;AACA;;;;;;AAEA,IAAMsX,cAAc;AAClBC,sDADkB;AAElBC;AAFkB,CAApB;;kBAKeF,W;;;;;;;;;;;;;kBCKA,UAAUlD,cAAV,EAA0BvW,OAA1B,EAAmCY,QAAnC,EAA6C;AAC1D,MAAMgZ,YAAY,GAAlB;;AAEA,4BAASne,WAAT,CAAqBoe,0BAArB,CAAgDtD,cAAhD,EAAgEvW,OAAhE,EAAyE4Z,SAAzE;AACA;AACA,MAAME,iBAAiBlZ,WAAW2V,eAAe6B,QAAf,CAAwB2B,KAAnC,GAA2CH,SAAlE;AACA;AACA,MAAMI,aAAapZ,WAAW2V,eAAe6B,QAAf,CAAwB2B,KAAnC,GAA2CH,SAA9D;;AAGA,SAAO;AACLhZ,cAAUkZ,cADL;AAELE,0BAFK;AAGLJ;AAHK,GAAP;AAKD,C;;AA5BD;;;;;;;;;;;;;;;;;kBCOe,UAAU1d,OAAV,EAAmBkZ,eAAnB,EAAoC;AACjD,MAAMnY,WAAW,6BAAaf,OAAb,EAAsB,OAAtB,CAAjB;;AAEA,MAAI,CAACe,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED,MAAM3B,cAAc,0BAASA,WAA7B;AACA;AACA,MAAIwe,sBAAJ;;AAEA,MAAIhd,SAASD,IAAT,CAAcI,MAAd,GAAuB,CAA3B,EAA8B;AAC5B,QAAM8c,oBAAoB,6BAAahe,OAAb,EAAsB,eAAtB,CAA1B;;AAEA,QAAIge,qBAAqBA,kBAAkBld,IAAvC,IAA+Ckd,kBAAkBld,IAAlB,CAAuBI,MAA1E,EAAkF;AAChF6c,sBAAgBC,kBAAkBld,IAAlB,CAAuB,CAAvB,CAAhB;AACD;AACF;;AAED,MAAMmY,YAAYlY,SAASD,IAAT,CAAc,CAAd,CAAlB;;AAEA;AACA,MAAIoY,kBAAkB,CAAtB,EAAyB;AACvBA,uBAAmBD,UAAUI,QAAV,CAAmBnY,MAAtC;AACD;;AAED,MAAMmb,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,MAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,MAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,WAASmM,YAAT,CAAuB1L,KAAvB,EAA8B;AAC5B,QAAIoN,UAAUE,mBAAV,KAAkCD,eAAtC,EAAuD;AACrD;AACD;;AAED;AACA;AACA,QAAI;AACF;AACA3Z,kBAAYW,iBAAZ,CAA8BF,OAA9B;AACD,KAHD,CAGE,OAAM+X,KAAN,EAAa;AACb;AACD;;AAED,QAAIgG,aAAJ,EAAmB;AACjBA,oBAAc5E,mBAAd,GAAoCD,eAApC;AACA6E,oBAAcE,MAAd,CAAqBje,OAArB,EAA8Be,SAASD,IAAvC;AACD,KAHD,MAGO;AACLvB,kBAAYid,YAAZ,CAAyBxc,OAAzB,EAAkC6L,KAAlC;AACD;;AAED,QAAIyQ,iBAAJ,EAAuB;AACrBA,wBAAkBtc,OAAlB,EAA2B6L,KAA3B;AACD;AACF;;AAED,WAAS2L,YAAT,CAAuBO,KAAvB,EAA8B;AAC5B,QAAM/K,UAAUiM,UAAUI,QAAV,CAAmBH,eAAnB,CAAhB;;AAEA,QAAIqD,mBAAJ,EAAyB;AACvBA,0BAAoBvc,OAApB,EAA6BgN,OAA7B,EAAsC+K,KAAtC;AACD;AACF;;AAED,MAAImB,oBAAoBD,UAAUE,mBAAlC,EAAuD;AACrD;AACD;;AAED,MAAIkD,mBAAJ,EAAyB;AACvBA,wBAAoBrc,OAApB;AACD;;AAED,MAAMU,YAAY;AAChBwY,oCADgB;AAEhBxC,eAAWwC,kBAAkBD,UAAUE;AAFvB,GAAlB;;AAKAF,YAAUE,mBAAV,GAAgCD,eAAhC;AACA,MAAMgF,aAAajF,UAAUI,QAAV,CAAmBH,eAAnB,CAAnB;;AAEA;AACA;AACA,MAAMtQ,SAAS,yBAAYF,gBAAZ,EAAf;;AAEA,MAAIE,UAAUA,OAAOuV,iBAAP,KAA6B,IAA3C,EAAiD;AAC/C,QAAMC,kBAAkB7e,YAAYqY,UAAZ,CAAuBC,eAAvB,CAAuCqG,UAAvC,CAAxB;;AAEA,QAAIE,mBAAmBA,gBAAgBC,KAAhB,OAA4B,UAAnD,EAA+D;AAC7D9e,kBAAYqY,UAAZ,CAAuB0G,kBAAvB,CAA0CJ,UAA1C;AACD;AACF;;AAED;AACA,MAAM5G,eAAeiH,QAAQtF,UAAU3B,YAAlB,CAArB;;AAEA,MAAIK,qBAAJ;;AAEA,MAAIL,YAAJ,EAAkB;AAChBK,mBAAepY,YAAYiZ,SAAZ,CAAsB0F,UAAtB,CAAf;AACD,GAFD,MAEO;AACLvG,mBAAepY,YAAYkZ,iBAAZ,CAA8ByF,UAA9B,CAAf;AACD;;AAEDvG,eAAaG,IAAb,CAAkBP,YAAlB,EAAgCC,YAAhC;AACA;AACA,+BAAmBW,aAAnB;;AAEA,8BAAanY,OAAb,EAAsB,wBAAtB,EAAgDU,SAAhD;AACD,C;;AAnHD;;;;AACA;;AACA;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;;;;;;;ACLA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,SAASkS,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,4BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,QAAMkd,qBAAqB;AACzBC,cAAQ;AADiB,KAA3B;;AAIA,8BAAShf,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DsX,kBAA9D,EAAkFD,YAAlF;AACA,8BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;AACAxL,MAAEY,wBAAF;;AAEA,WAAO,KAAP;AACD;AACF;;AAED,SAASsK,kBAAT,CAA6BlL,CAA7B,EAAgC1G,SAAhC,EAA2C;AACzC,MAAMqY,SAAS,CAACrY,UAAUgW,SAA1B;;AAEA,MAAM9N,SAAS+V,YAAYjW,gBAAZ,EAAf;;AAEA,MAAIsQ,OAAO,KAAX;;AAEA,MAAIpQ,UAAUA,OAAOoQ,IAArB,EAA2B;AACzBA,WAAOpQ,OAAOoQ,IAAd;AACD;;AAED,wBAAOtY,UAAUV,OAAjB,EAA0B+Y,MAA1B,EAAkCC,IAAlC;AACD;;AAED,SAASwF,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,MAAMe,WAAW,6BAAaf,OAAb,EAAsB,OAAtB,CAAjB;;AAEA,MAAI,CAACe,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED,MAAM+X,YAAYlY,SAASD,IAAT,CAAc,CAAd,CAAlB;;AAEA,MAAM8H,SAAS+V,YAAYjW,gBAAZ,EAAf;;AAEA;AACA,MAAIkW,iBAAiBvZ,KAAKC,GAAL,CAAS,CAAT,EAAY,0BAAS5F,CAAT,CAAWM,OAAX,EAAoByF,MAApB,KAA+BJ,KAAKC,GAAL,CAAS2T,UAAUI,QAAV,CAAmBnY,MAA5B,EAAoC,CAApC,CAA3C,CAArB;;AAEA,MAAI0H,UAAUA,OAAOiW,gBAArB,EAAuC;AACrCD,qBAAiBhW,OAAOiW,gBAAxB;AACD;;AAEDzX,IAAEtG,IAAF,CAAO4d,MAAP,GAAgBtX,EAAEtG,IAAF,CAAO4d,MAAP,IAAiB,CAAjC;AACAtX,IAAEtG,IAAF,CAAO4d,MAAP,IAAiBhe,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA5C;AACA,MAAIoB,KAAK2X,GAAL,CAAS5V,EAAEtG,IAAF,CAAO4d,MAAhB,KAA2BE,cAA/B,EAA+C;AAC7C,QAAME,aAAa1X,EAAEtG,IAAF,CAAO4d,MAAP,GAAgBE,cAAnC;AACA,QAAMG,qBAAqB1Z,KAAKqU,KAAL,CAAWoF,UAAX,CAA3B;AACA,QAAME,gBAAgB5X,EAAEtG,IAAF,CAAO4d,MAAP,GAAgBE,cAAtC;;AAEAxX,MAAEtG,IAAF,CAAO4d,MAAP,GAAgBM,aAAhB;AACA,0BAAOhf,OAAP,EAAgB+e,kBAAhB;AACD;;AAED,SAAO,KAAP,CA/BmC,CA+BrB;AACf;;AAED;AACA,IAAMJ,cAAc,qCAAsBlY,iBAAtB,CAApB;AACA,IAAMwY,mBAAmB,8BAAe3M,kBAAf,CAAzB;;AAEA,IAAMpO,UAAU;AACdxD,aAAW;AACTge,YAAQ;AADC;AADG,CAAhB;AAKA,IAAMQ,uBAAuB,6BAAcV,YAAd,EAA4Bta,OAA5B,CAA7B;;AAEA,SAASib,sBAAT,CAAiC/X,CAAjC,EAAoC1G,SAApC,EAA+C;AAC7C,MAAMkI,SAASwW,sBAAsB1W,gBAAtB,EAAf;;AAEA,MAAIE,UAAUA,OAAOyW,YAAP,CAAoB3e,SAApB,CAAd,EAA8C;AAC5C8d,iBAAapX,CAAb,EAAgB1G,SAAhB;AACD;AACF;;AAED,IAAMyF,gBAAgB;AACpBkZ,cADoB,wBACN3e,SADM,EACK;AACvB,WAAQA,UAAU4e,WAAV,IAAyB,CAAjC;AACD;AAHmB,CAAtB;;AAMA,IAAMF,wBAAwB,kCAAmBD,sBAAnB,EAA2Cjb,OAA3C,CAA9B;;AAEAkb,sBAAsBzW,gBAAtB,CAAuCxC,aAAvC;;QAGEwY,W,GAAAA,W;QACAM,gB,GAAAA,gB;QACAC,oB,GAAAA,oB;QACAE,qB,GAAAA,qB;;;;;;;;;;;;;kBC7Ga,UAAUpf,OAAV,EAAmBgE,CAAnB,EAAsBC,CAAtB,EAAyBR,KAAzB,EAAgCgC,MAAhC,EAAwC;AACrD,MAAI,CAACzF,OAAL,EAAc;AACZ,UAAM,IAAIyX,KAAJ,CAAU,uDAAV,CAAN;AACD;;AAEDzT,MAAIqB,KAAKqU,KAAL,CAAW1V,CAAX,CAAJ;AACAC,MAAIoB,KAAKqU,KAAL,CAAWzV,CAAX,CAAJ;AACA,MAAMoW,iBAAiB,0BAAS9a,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAAvB;AACA,MAAM6L,QAAQwO,eAAexO,KAA7B;AACA,MAAM0T,YAAY,EAAlB;AACA,MAAIxZ,QAAQ,CAAZ;AACA,MAAMwU,YAAY1O,MAAM2O,YAAN,EAAlB;AACA,MAAIC,gBAAJ;AAAA,MACEC,YADF;AAAA,MAEEC,eAFF;;AAIA,MAAI9O,MAAMhJ,KAAV,EAAiB;AACf,SAAK6X,MAAM,CAAX,EAAcA,MAAMjV,MAApB,EAA4BiV,KAA5B,EAAmC;AACjC,WAAKC,SAAS,CAAd,EAAiBA,SAASlX,KAA1B,EAAiCkX,QAAjC,EAA2C;AACzCF,kBAAU,CAAE,CAACC,MAAMzW,CAAP,IAAY4H,MAAM4I,OAAnB,IAA+BkG,SAAS3W,CAAxC,CAAD,IAA+C,CAAzD;AACA,YAAM4W,MAAML,UAAUE,OAAV,CAAZ;AACA,YAAMI,QAAQN,UAAUE,UAAU,CAApB,CAAd;AACA,YAAMK,OAAOP,UAAUE,UAAU,CAApB,CAAb;;AAEA8E,kBAAUxZ,OAAV,IAAqB,SAAS6U,GAAT,GAAe,SAASC,KAAxB,GAAgC,SAASC,IAA9D;AACD;AACF;AACF,GAXD,MAWO;AACL,SAAKJ,MAAM,CAAX,EAAcA,MAAMjV,MAApB,EAA4BiV,KAA5B,EAAmC;AACjC,WAAKC,SAAS,CAAd,EAAiBA,SAASlX,KAA1B,EAAiCkX,QAAjC,EAA2C;AACzCF,kBAAW,CAACC,MAAMzW,CAAP,IAAY4H,MAAM4I,OAAnB,IAA+BkG,SAAS3W,CAAxC,CAAV;AACAub,kBAAUxZ,OAAV,IAAqBwU,UAAUE,OAAV,IAAqB5O,MAAMsC,KAA3B,GAAmCtC,MAAMuC,SAA9D;AACD;AACF;AACF;;AAED,SAAOmR,SAAP;AACD,C;;AAvCD;;;;;;;;;;;;;;;;;kBCCe,UAAUzb,OAAV,EAAmBE,CAAnB,EAAsBC,CAAtB,EAAyBub,CAAzB,EAA4BC,CAA5B,EAA+B;AAC5C,MAAMC,QAAQ,SAAd;AAAA,MACEC,KAAMH,IAAI,CAAL,GAAUE,KADjB;AAAA,MACwB;AACtBE,OAAMH,IAAI,CAAL,GAAUC,KAFjB;AAAA,MAEwB;AACtBG,OAAK7b,IAAIwb,CAHX;AAAA,MAGc;AACZM,OAAK7b,IAAIwb,CAJX;AAAA,MAIc;AACZM,OAAK/b,IAAIwb,IAAI,CALf;AAAA,MAKkB;AAChBQ,OAAK/b,IAAIwb,IAAI,CANf,CAD4C,CAO1B;;AAElB3b,UAAQoF,SAAR;AACApF,UAAQuZ,MAAR,CAAerZ,CAAf,EAAkBgc,EAAlB;AACAlc,UAAQmc,aAAR,CAAsBjc,CAAtB,EAAyBgc,KAAKJ,EAA9B,EAAkCG,KAAKJ,EAAvC,EAA2C1b,CAA3C,EAA8C8b,EAA9C,EAAkD9b,CAAlD;AACAH,UAAQmc,aAAR,CAAsBF,KAAKJ,EAA3B,EAA+B1b,CAA/B,EAAkC4b,EAAlC,EAAsCG,KAAKJ,EAA3C,EAA+CC,EAA/C,EAAmDG,EAAnD;AACAlc,UAAQmc,aAAR,CAAsBJ,EAAtB,EAA0BG,KAAKJ,EAA/B,EAAmCG,KAAKJ,EAAxC,EAA4CG,EAA5C,EAAgDC,EAAhD,EAAoDD,EAApD;AACAhc,UAAQmc,aAAR,CAAsBF,KAAKJ,EAA3B,EAA+BG,EAA/B,EAAmC9b,CAAnC,EAAsCgc,KAAKJ,EAA3C,EAA+C5b,CAA/C,EAAkDgc,EAAlD;AACAlc,UAAQoc,SAAR;AACApc,UAAQ4F,MAAR;AACD,C;;;;;;;;;;;;;kBClBc,UAAU5F,OAAV,EAAmB8S,KAAnB,EAA0B/T,KAA1B,EAAiCsG,SAAjC,EAA4C;AACzD,MAAMI,eAAe,CAArB;;AAEAzF,UAAQoF,SAAR;AACApF,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQqF,SAAR,GAAoBA,SAApB;AACArF,UAAQwF,GAAR,CAAYsN,MAAM5S,CAAlB,EAAqB4S,MAAM3S,CAA3B,EAA8BsF,YAA9B,EAA4C,CAA5C,EAA+C,IAAIlE,KAAKmE,EAAxD;AACA1F,UAAQ4F,MAAR;AACD,C;;;;;;;;;;;;;kBCRc,UAAU5F,OAAV,EAAmB8S,KAAnB,EAA0B3P,GAA1B,EAA+BpE,KAA/B,EAAsCsG,SAAtC,EAAiD;AAC9D;AACA,MAAMgX,aAAa,EAAnB;;AAEA,MAAMC,QAAQ/a,KAAKgb,KAAL,CAAWpZ,IAAIhD,CAAJ,GAAQ2S,MAAM3S,CAAzB,EAA4BgD,IAAIjD,CAAJ,GAAQ4S,MAAM5S,CAA1C,CAAd;;AAEA;AACAF,UAAQoF,SAAR;AACApF,UAAQuZ,MAAR,CAAezG,MAAM5S,CAArB,EAAwB4S,MAAM3S,CAA9B;AACAH,UAAQwZ,MAAR,CAAerW,IAAIjD,CAAnB,EAAsBiD,IAAIhD,CAA1B;AACAH,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQqF,SAAR,GAAoBA,SAApB;AACArF,UAAQ4F,MAAR;;AAEA;AACA5F,UAAQoF,SAAR;AACApF,UAAQuZ,MAAR,CAAepW,IAAIjD,CAAnB,EAAsBiD,IAAIhD,CAA1B;AACAH,UAAQwZ,MAAR,CAAerW,IAAIjD,CAAJ,GAAQmc,aAAa9a,KAAKib,GAAL,CAASF,QAAQ/a,KAAKmE,EAAL,GAAU,CAA3B,CAApC,EAAmEvC,IAAIhD,CAAJ,GAAQkc,aAAa9a,KAAKkb,GAAL,CAASH,QAAQ/a,KAAKmE,EAAL,GAAU,CAA3B,CAAxF;;AAEA;AACA1F,UAAQwZ,MAAR,CAAerW,IAAIjD,CAAJ,GAAQmc,aAAa9a,KAAKib,GAAL,CAASF,QAAQ/a,KAAKmE,EAAL,GAAU,CAA3B,CAApC,EAAmEvC,IAAIhD,CAAJ,GAAQkc,aAAa9a,KAAKkb,GAAL,CAASH,QAAQ/a,KAAKmE,EAAL,GAAU,CAA3B,CAAxF;;AAEA;AACA1F,UAAQwZ,MAAR,CAAerW,IAAIjD,CAAnB,EAAsBiD,IAAIhD,CAA1B;AACAH,UAAQwZ,MAAR,CAAerW,IAAIjD,CAAJ,GAAQmc,aAAa9a,KAAKib,GAAL,CAASF,QAAQ/a,KAAKmE,EAAL,GAAU,CAA3B,CAApC,EAAmEvC,IAAIhD,CAAJ,GAAQkc,aAAa9a,KAAKkb,GAAL,CAASH,QAAQ/a,KAAKmE,EAAL,GAAU,CAA3B,CAAxF;;AAEA;AACA1F,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQqF,SAAR,GAAoBA,SAApB;AACArF,UAAQ4F,MAAR;AACA5F,UAAQyB,SAAR,GAAoB1C,KAApB;AACAiB,UAAQ2F,IAAR;AACD,C;;;;;;;;;;;;;kBC9Bc,UAAU+W,EAAV,EAAc7G,OAAd,EAAuB;AACpC;;AAEA,MAAI8G,MAAM,CAAV;AACA,MAAIC,aAAa,CAAjB;AACA,MAAIC,QAAQ,CAAZ;AACA,MAAI5a,QAAQ,CAAZ;;AAEA,OAAK,IAAI9B,IAAI0V,QAAQ/T,GAArB,EAA0B3B,IAAI0V,QAAQ/T,GAAR,GAAc+T,QAAQlU,MAApD,EAA4DxB,GAA5D,EAAiE;AAC/D,SAAK,IAAID,IAAI2V,QAAQhU,IAArB,EAA2B3B,IAAI2V,QAAQhU,IAAR,GAAegU,QAAQlW,KAAtD,EAA6DO,GAA7D,EAAkE;AAChE,UAAMiI,QAAQ;AACZjI,YADY;AAEZC;AAFY,OAAd;;AAKA,UAAI,8BAAe0V,OAAf,EAAwB1N,KAAxB,CAAJ,EAAoC;AAClCwU,eAAOD,GAAGza,KAAH,CAAP;AACA2a,sBAAcF,GAAGza,KAAH,IAAYya,GAAGza,KAAH,CAA1B;AACA4a;AACD;;AAED5a;AACD;AACF;;AAED,MAAI4a,UAAU,CAAd,EAAiB;AACf,WAAO;AACLA,kBADK;AAELC,YAAM,GAFD;AAGLC,gBAAU,GAHL;AAILC,cAAQ;AAJH,KAAP;AAMD;;AAED,MAAMF,OAAOH,MAAME,KAAnB;AACA,MAAME,WAAWH,aAAaC,KAAb,GAAqBC,OAAOA,IAA7C;;AAEA,SAAO;AACLD,gBADK;AAELC,cAFK;AAGLC,sBAHK;AAILC,YAAQzb,KAAK0b,IAAL,CAAUF,QAAV;AAJH,GAAP;AAMD,C;;AA7CD;;;;;;;;;;;;;;;;;kBCEe,UAAUG,eAAV,EAA2B;AACxC,MAAI7a,gBAAgB,EAApB;;AAEA,MAAM0C,gBAAgB;AACpBN,YADoB,oBACVvI,OADU,EACD;AACjB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDya,eAAnD;AACA,gCAASthB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkD6Z,eAAlD;AACD,KAJmB;AAKpB9Y,WALoB,mBAKXlI,OALW,EAKF;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDya,eAAnD;AACD,KAPmB;AAQpB3Y,UARoB,kBAQZrI,OARY,EAQH;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDya,eAAnD;AACD,KAVmB;AAWpBxY,cAXoB,sBAWRxI,OAXQ,EAWC;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDya,eAAnD;AACD,KAbmB;AAcpBtY,oBAdoB,8BAcA;AAClB,aAAOvC,aAAP;AACD,KAhBmB;AAiBpBwC,oBAjBoB,4BAiBFC,MAjBE,EAiBM;AACxBzC,sBAAgByC,MAAhB;AACD;AAnBmB,GAAtB;;AAuBA,SAAOC,aAAP;AACD,C;;AA7BD;;;;;;;;;;;;;;;;;kBCKe,UAAUkB,cAAV,EAA0BjJ,IAA1B,EAAgCC,QAAhC,EAA0CT,QAA1C,EAAoD2H,0BAApD,EAAgFoC,kBAAhF,EAAoG;AACjH,MAAMrK,UAAU+J,eAAe/J,OAA/B;AACA,MAAMT,cAAc,0BAASA,WAA7B;;AAEA,WAAS+L,iBAAT,CAA4BlE,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxCI,SAAKsC,MAAL,GAAc,IAAd;;AAEAe,WAAO2C,IAAP,CAAYhG,KAAKiG,OAAjB,EAA0B7B,OAA1B,CAAkC,UAAU6D,IAAV,EAAgB;AAChD,UAAMhB,SAASjH,KAAKiG,OAAL,CAAagC,IAAb,CAAf;;AAEA,UAAIhB,OAAO0T,kBAAP,KAA8B,IAAlC,EAAwC;AACtC;AACD;;AAED1T,aAAO/D,CAAP,IAAYtD,UAAUgb,WAAV,CAAsB7P,KAAtB,CAA4B7H,CAAxC;AACA+D,aAAO9D,CAAP,IAAYvD,UAAUgb,WAAV,CAAsB7P,KAAtB,CAA4B5H,CAAxC;AACD,KATD;AAUA1E,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMS,YAAY,qCAAlB;AACA,QAAMkS,oBAAoB;AACxBrS,wBADwB;AAExBN,sBAFwB;AAGxBO,uBAAiBO;AAHO,KAA1B;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCkS,iBAAjC;;AAEA,WAAO,KAAP,CAxBwC,CAwB1B;AACf;;AAED,4BAASjT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDmE,iBAApD;;AAEA,WAAS2V,gBAAT,CAA2B7Z,CAA3B,EAA8B1G,SAA9B,EAAyC;AACvC;AACAI,SAAKsC,MAAL,GAAc,KAAd;AACAtC,SAAKoG,WAAL,GAAmB,KAAnB;;AAEA,8BAASxH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqD+E,iBAArD;AACA,8BAAS5L,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD0a,gBAAtD;AACA,8BAASvhB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD0a,gBAAtD;AACA,8BAASvhB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,0BAAxB,EAAoD0a,gBAApD;AACA,8BAASvhB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmD0a,gBAAnD;AACA,8BAASvhB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+C0a,gBAA/C;;AAEA;AACA,QAAIhZ,+BAA+B,IAA/B,IACI,sCAAuBvH,SAAvB,EAAkCI,KAAKiG,OAAvC,CADR,EACyD;AACvD,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD;;AAEDvB,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI,OAAOqK,kBAAP,KAA8B,UAAlC,EAA8C;AAC5CA,yBAAmBjD,CAAnB,EAAsB1G,SAAtB;AACD;AACF;;AAED,4BAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD8Z,gBAArD;AACA,4BAASvhB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD8Z,gBAArD;AACA,4BAASvhB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,0BAAvB,EAAmD8Z,gBAAnD;AACA,4BAASvhB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkD8Z,gBAAlD;AACA,4BAASvhB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C8Z,gBAA9C;;AAEA,SAAO,IAAP;AACD,C;;AAtED;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCqDe,UAAUlX,cAAV,EAA0BzJ,QAA1B,EAAoCQ,IAApC,EAA0CiH,MAA1C,EAAkDsC,kBAAlD,EAAsE;AACnF;AACA6W,eAAa5H,KAAb,GAAqB,IAArB;;AAEA,MAAM/Z,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAU+J,eAAe/J,OAA/B;AACA,MAAMqa,iBAAiB9a,YAAYW,iBAAZ,CAA8BF,OAA9B,CAAvB;;AAEA,MAAMmhB,OAAQ,IAAIC,IAAJ,EAAD,CAAaC,OAAb,EAAb;;AAEA;AACA;AACA,MAAMC,iBAAiB,CAAC,EAAxB;;AAEA,MAAMC,cAAc;AAClBvd,OAAG+F,eAAevC,aAAf,CAA6B6L,IAA7B,CAAkCrP,CADnB;AAElBC,OAAG8F,eAAevC,aAAf,CAA6B6L,IAA7B,CAAkCpP,CAAlC,GAAsCqd;AAFvB,GAApB;;AAKA,MAAIE,iBAAiBjiB,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCuhB,YAAYvd,CAA7C,EAAgDud,YAAYtd,CAA5D,CAArB;;AAEA,WAASqH,iBAAT,CAA4BlE,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC;AACAwgB,iBAAa5H,KAAb,GAAqB,KAArB;;AAEA,QAAIvR,OAAO0K,QAAP,KAAoB,KAAxB,EAA+B;AAC7B1K,aAAO0K,QAAP,GAAkB,IAAlB;AACD;;AAED1K,WAAO3E,MAAP,GAAgB,IAAhB;;AAEA,QAAMoE,gBAAgB9G,UAAU8G,aAAhC;AACA,QAAM+Z,cAAc;AAClBvd,SAAGwD,cAAc6L,IAAd,CAAmBrP,CADJ;AAElBC,SAAGuD,cAAc6L,IAAd,CAAmBpP,CAAnB,GAAuBqd;AAFR,KAApB;;AAKAE,qBAAiBjiB,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCuhB,YAAYvd,CAA7C,EAAgDud,YAAYtd,CAA5D,CAAjB;AACA8D,WAAO/D,CAAP,GAAWwd,eAAexd,CAA1B;AACA+D,WAAO9D,CAAP,GAAWud,eAAevd,CAA1B;;AAEA1E,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMS,YAAY,qCAAlB;AACA,QAAMkS,oBAAoB;AACxBrS,wBADwB;AAExBN,sBAFwB;AAGxBO,uBAAiBO;AAHO,KAA1B;;AAMA,gCAAad,OAAb,EAAsBS,SAAtB,EAAiCkS,iBAAjC;AACD;;AAED,4BAASjT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDmE,iBAApD;;AAEA,WAAS2V,gBAAT,CAA2B7Z,CAA3B,EAA8B1G,SAA9B,EAAyC;AACvC;AACAwgB,iBAAa5H,KAAb,GAAqB,KAArB;;AAEAvR,WAAO3E,MAAP,GAAgB,KAAhB;AACA,8BAAS1D,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqD+E,iBAArD;AACA,8BAAS5L,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwBkb,cAAxB,EAAwCR,gBAAxC;;AAEA1hB,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAIoH,EAAEzF,IAAF,KAAW,4BAAf,EAA6C;AAC3CjB,gBAAUghB,aAAV,GAA0B5gB,IAA1B;;AAEAiH,aAAO/D,CAAP,GAAW+F,eAAevC,aAAf,CAA6BqE,KAA7B,CAAmC7H,CAA9C;AACA+D,aAAO9D,CAAP,GAAW8F,eAAevC,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAA9C;AACD;;AAED,QAAI,OAAOoG,kBAAP,KAA8B,UAAlC,EAA8C;AAC5CA,yBAAmBjD,CAAnB,EAAsB1G,SAAtB;AACD;AACF;;AAED,4BAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBsa,cAAvB,EAAuCR,gBAAvC;;AAEAU,UAAQR,IAAR,EAAcpZ,MAAd,EAAsBmZ,YAAtB,EAAoC7G,cAApC,EAAoDmH,cAApD;AACD,C;;AAxID;;;;AACA;;;;;;AAEA;;;;AAIA,IAAMN,eAAe;AACnB5H,SAAO;AADY,CAArB;;AAIA,IAAMmI,iBAAiB,CAAC,0BAAD,EACrB,yBADqB,EAErB,4BAFqB,EAGrB,4BAHqB,EAIrB,qBAJqB,EAKrBpQ,IALqB,CAKhB,GALgB,CAAvB;;AAOA,SAASsQ,OAAT,CAAkBC,QAAlB,EAA4B7Z,MAA5B,EAAoCmZ,YAApC,EAAkD7G,cAAlD,EAAkEmH,cAAlE,EAAkF;AAChF;AACA,MAAI,CAACN,aAAa5H,KAAlB,EAAyB;AACvB;AACD;;AAED,MAAM/Z,cAAc,0BAASA,WAA7B;AACA;AACA,MAAM4hB,OAAQ,IAAIC,IAAJ,EAAD,CAAaC,OAAb,EAAb;AACA;;AAEA;AACA,MAAMQ,oBAAoBxc,KAAK2X,GAAL,CAASjV,OAAO9D,CAAP,GAAWud,eAAevd,CAAnC,CAA1B;AACA,MAAM6d,sBAAsBD,oBAAoB,EAAhD;;AAEAE,UAAQrS,GAAR,yBAAkCmS,iBAAlC;AACA,MAAIA,oBAAoB,CAAxB,EAA2B;AACzB9Z,WAAO9D,CAAP,GAAWud,eAAevd,CAA1B;AACAid,iBAAa5H,KAAb,GAAqB,KAArB;;AAEA;AACD;;AAED,MAAIvR,OAAO9D,CAAP,GAAWud,eAAevd,CAA9B,EAAiC;AAC/B8D,WAAO9D,CAAP,IAAY6d,mBAAZ;AACD,GAFD,MAEO,IAAI/Z,OAAO9D,CAAP,GAAWud,eAAevd,CAA9B,EAAiC;AACtC8D,WAAO9D,CAAP,IAAY6d,mBAAZ;AACD;;AAED;AACAviB,cAAYqH,WAAZ,CAAwByT,eAAera,OAAvC;;AAEA;AACAT,cAAYyiB,qBAAZ,CAAkC,YAAY;AAC5CL,YAAQR,IAAR,EAAcpZ,MAAd,EAAsBmZ,YAAtB,EAAoC7G,cAApC,EAAoDmH,cAApD;AACD,GAFD;AAGD,C;;;;;;;;;;;;;ACtDD;;;;;;AAEA;AACA;AACA;;AAEA,IAAMS,iBAAiB,IAAvB;AAAA,IACEC,cAAc;AACZC,SAAO,CADK;AAEZC,SAAO;AAFK,CADhB;;AAMA,IAAIC,4BAAJ;AAAA,IACEC,4BADF;;AAGA,SAASC,SAAT,CAAoB5gB,IAApB,EAA0ByF,CAA1B,EAA6B;AAC3B,MAAMob,MAAMpB,KAAKoB,GAAL,EAAZ;;AAEA,MAAI7gB,SAAS0gB,mBAAb,EAAkC;AAChC,QAAIG,MAAMF,mBAAN,IAA6BL,cAAjC,EAAiD;AAC/C7a,QAAEgD,cAAF;AACAhD,QAAE8S,eAAF;AACA9S,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;;AAEDqa,0BAAsB1gB,IAAtB;AACD;;AAED2gB,wBAAsBE,GAAtB;AACD;;AAED;AACA;AACA;AACA,IAAMC,iBAAiBF,UAAUG,IAAV,CAAe,IAAf,EAAqBR,YAAYC,KAAjC,CAAvB;AACA,IAAMQ,iBAAiBJ,UAAUG,IAAV,CAAe,IAAf,EAAqBR,YAAYE,KAAjC,CAAvB;;AAEA,SAASQ,YAAT,CAAuB5iB,OAAvB,EAAgC6iB,SAAhC,EAA2CC,eAA3C,EAA4D;AAC1D,MAAMC,aAAaD,kBAAkBL,cAAlB,GAAmCE,cAAtD;;AAEAE,YAAU3d,OAAV,CAAkB,UAAU8d,SAAV,EAAqB;AACrC,8BAAStjB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB6b,SAAvB,EAAkCD,UAAlC;AACD,GAFD;AAGD;;AAED,SAASE,YAAT,CAAuBjjB,OAAvB,EAAgC6iB,SAAhC,EAA2CC,eAA3C,EAA4D;AAC1D,MAAMC,aAAaD,kBAAkBL,cAAlB,GAAmCE,cAAtD;;AAEAE,YAAU3d,OAAV,CAAkB,UAAU8d,SAAV,EAAqB;AACrC,8BAAStjB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwByc,SAAxB,EAAmCD,UAAnC;AACD,GAFD;AAGD;;AAED,IAAMG,cAAc,CAAC,WAAD,EAAc,SAAd,CAApB;AACA,IAAMC,cAAc,CAAC,YAAD,EAAe,UAAf,CAApB;;AAEA,SAASjb,OAAT,CAAkBlI,OAAlB,EAA2B;AACzBijB,eAAajjB,OAAb,EAAsBkjB,WAAtB,EAAmChB,YAAYC,KAA/C;AACAc,eAAajjB,OAAb,EAAsBmjB,WAAtB,EAAmCjB,YAAYE,KAA/C;AACD;;AAED,SAAS/Z,MAAT,CAAiBrI,OAAjB,EAA0B;AACxBkI,UAAQlI,OAAR;AACA4iB,eAAa5iB,OAAb,EAAsBkjB,WAAtB,EAAmChB,YAAYC,KAA/C;AACAS,eAAa5iB,OAAb,EAAsBmjB,WAAtB,EAAmCjB,YAAYE,KAA/C;AACD;;AAED,IAAMgB,oBAAoB;AACxB/a,gBADwB;AAExBH;AAFwB,CAA1B;;kBAKekb,iB;;;;;;;;;;;;;kBCxEA,UAAU1Y,iBAAV,EAA6B;AAC1C,SAAO;AACLnC,YADK,oBACKvI,OADL,EACc;AACjB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmE,iBAArD;AACA,UAAMhK,YAAY,EAAlB;;AAEA,gCAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DgK,iBAA/D;AACD,KANI;AAOLxC,WAPK,mBAOIlI,OAPJ,EAOa;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmE,iBAArD;AACD,KATI;AAULrC,UAVK,kBAUGrI,OAVH,EAUY;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmE,iBAArD;AACD,KAZI;AAaLlC,cAbK,sBAaOxI,OAbP,EAagB;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmE,iBAArD;AACD;AAfI,GAAP;AAiBD,C;;AApBD;;;;;;;;;;;;;;;;;kBCUe,UAAUxE,kBAAV,EAA8Bc,yBAA9B,EAAyD;AACtE;AACA,WAASZ,iBAAT,CAA4BC,cAA5B,EAA4C;AAC1C,QAAM9F,kBAAkB2F,mBAAmBI,oBAAnB,CAAwCD,cAAxC,CAAxB;;AAEA;AACA,QAAI,CAAC9F,eAAL,EAAsB;AACpB;AACD;;AAED;AACA,iCAAa8F,eAAerG,OAA5B,EAAqCkG,mBAAmB5F,QAAxD,EAAkEC,eAAlE;;AAEA;AACA;AACA,8BAASb,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCuG,GAAnC,CAAuC,2BAAvC,EAAoEC,iBAApE;AACA,8BAAWH,cAAX,EAA2BH,mBAAmB5F,QAA9C,EAAwDC,eAAxD,EAAyEA,gBAAgBwG,OAAhB,CAAwBE,GAAjG,EAAsG,YAAY;AAChH1G,sBAAgB6C,MAAhB,GAAyB,KAAzB;AACA,UAAI,sCAAuBiD,cAAvB,EAAuC9F,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,wCAAgBV,eAAerG,OAA/B,EAAwCkG,mBAAmB5F,QAA3D,EAAqEC,eAArE;AACD;;AAED,gCAASb,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCmH,EAAnC,CAAsC,2BAAtC,EAAmEX,iBAAnE;AACD,KARD,EAQGQ,yBARH;AASD;;AAED,WAASN,yBAAT,CAAoCU,CAApC,EAAuC1G,SAAvC,EAAkD;AAChD,QAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE6E,wBAAkB1F,SAAlB;;AAEA,aAAO,KAAP,CAHiE,CAGnD;AACf;AACF;AACD;;AAEA;;AAEA,WAAS8F,iBAAT,CAA4BY,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,8BAAgB2G,SAAhB,CAA0B3G,SAA1B;AACA;AACA,QAAIA,UAAUY,KAAV,KAAoB,CAAxB,EAA2B;AACzB;AACD;;AAED;AACA,QAAMP,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCkG,mBAAmB5F,QAAnD,CAAjB;;AAEA,QAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED;AACA;AACA,QAAIkH,mBAAmB,KAAvB;AACA,QAAMC,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;;AAEA,SAAK,IAAIxG,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C;AACA,UAAMH,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,UAAI,+BAAgBP,UAAUV,OAA1B,EAAmCc,KAAKiG,OAAxC,EAAiDQ,MAAjD,MAA6D,IAAjE,EAAuE;AACrED,2BAAmB,IAAnB;AACD;;AAED,UAAKpB,mBAAmBmd,eAAnB,CAAmC3iB,UAAUV,OAA7C,EAAsDc,IAAtD,EAA4DyG,MAA5D,KAAuE,CAACzG,KAAKsC,MAA9E,IAA0F,CAAC8C,mBAAmBmd,eAAnB,CAAmC3iB,UAAUV,OAA7C,EAAsDc,IAAtD,EAA4DyG,MAA5D,CAAD,IAAwEzG,KAAKsC,MAA3K,EAAoL;AAClLtC,aAAKsC,MAAL,GAAc,CAACtC,KAAKsC,MAApB;AACAkE,2BAAmB,IAAnB;AACD;AACF;;AAED;AACA,QAAIA,qBAAqB,IAAzB,EAA+B;AAC7B,gCAAS/H,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;AACF;;AAED,WAASyG,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,QAAMnB,cAAc,0BAASA,WAA7B;AACA,QAAIuB,aAAJ;;AAEA,aAAS6G,cAAT,GAA2B;AACzB7G,WAAKsC,MAAL,GAAc,KAAd;AACA,UAAI,sCAAuB1C,SAAvB,EAAkCI,KAAKiG,OAAvC,CAAJ,EAAqD;AACnD;AACA,wCAAgBrG,UAAUV,OAA1B,EAAmCkG,mBAAmB5F,QAAtD,EAAgEQ,IAAhE;AACD;;AAEDvB,kBAAYqH,WAAZ,CAAwBlG,UAAUV,OAAlC;AACA,gCAASN,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DX,iBAA9D;AACD;;AAED,QAAI,oCAAqB9F,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,UAAMgG,SAAS7G,UAAUkH,WAAV,CAAsBH,MAArC;AACA,UAAM1G,WAAW,6BAAaqG,EAAES,aAAf,EAA8B3B,mBAAmB5F,QAAjD,CAAjB;;AAEA,UAAIW,UAAJ;;AAEA;AACA,UAAMqJ,aAAa,EAAnB;;AAEA,UAAIvJ,aAAaX,SAAjB,EAA4B;AAC1B,aAAKa,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,iBAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,cAAM8G,SAAS,uCAAwBrH,UAAUV,OAAlC,EAA2Cc,KAAKiG,OAAhD,EAAyDQ,MAAzD,EAAiE+C,UAAjE,CAAf;;AAEA,cAAIvC,WAAW3H,SAAf,EAA0B;AACxB,sCAASV,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DC,iBAA/D;AACA1F,iBAAKsC,MAAL,GAAc,IAAd;AACA,sCAAW1C,SAAX,EAAsBwF,mBAAmB5F,QAAzC,EAAmDQ,IAAnD,EAAyDiH,MAAzD,EAAiEJ,cAAjE,EAAiFX,yBAAjF;AACAI,cAAEY,wBAAF;;AAEA,mBAAO,KAAP;AACD;AACF;AACF;;AAED;AACA;AACA,UAAM9D,UAAU;AACd+D,oCAA4B,IADd;AAEdjB;AAFc,OAAhB;;AAKA,UAAIjG,aAAaX,SAAb,IAA0B8F,mBAAmBmd,eAAnB,KAAuCjjB,SAArE,EAAgF;AAC9E,aAAKa,IAAI,CAAT,EAAYA,IAAIF,SAASD,IAAT,CAAcI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCH,iBAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,cAAIiF,mBAAmBmd,eAAnB,CAAmC3iB,UAAUV,OAA7C,EAAsDc,IAAtD,EAA4DyG,MAA5D,CAAJ,EAAyE;AACvE,sCAAS7H,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DC,iBAA/D;AACA,0CAAeY,CAAf,EAAkBtG,IAAlB,EAAwBC,QAAxB,EAAkCmF,mBAAmB5F,QAArD,EAA+D4D,OAA/D,EAAwEyD,cAAxE;AACA,sCAASjI,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DX,iBAA9D;AACAY,cAAEY,wBAAF;;AAEA,mBAAO,KAAP;AACD;AACF;AACF;AACF;AACF;AACD;;AAEA;AACA;AACA;AACA,WAASI,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3BlB,uBAAmBkC,eAAnB,CAAmChB,CAAnC,EAAsCA,EAAExF,MAAxC;AACD;;AAED;AACA,WAASsG,OAAT,CAAkBlI,OAAlB,EAA2B;AACzBA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DG,yBAA7D;;AAEA,8BAASnH,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASqI,MAAT,CAAiBrI,OAAjB,EAA0B;AACxBA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DG,yBAA7D;;AAEA1G,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;;AAEA,8BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASuI,QAAT,CAAmBvI,OAAnB,EAA4BuB,eAA5B,EAA6C;AAC3C,QAAMb,YAAY;AAChBa;AADgB,KAAlB;;AAIAvB,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DG,yBAA7D;;AAEA1G,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D8F,iBAA/D;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D+F,iBAA/D;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuEgG,yBAAvE;;AAEA,8BAASnH,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,WAASwI,UAAT,CAAqBxI,OAArB,EAA8BuB,eAA9B,EAA+C;AAC7C,QAAMb,YAAY;AAChBa;AADgB,KAAlB;;AAIAvB,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DG,yBAA7D;;AAEA1G,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D8F,iBAA/D;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D+F,iBAA/D;;AAEA,8BAASlH,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,MAAM6I,gBAAgB;AACpBR,kBADoB;AAEpBH,oBAFoB;AAGpBK,sBAHoB;AAIpBC;AAJoB,GAAtB;;AAOA,SAAOK,aAAP;AACD,C;;AAjOD;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;;;;kBCNe,UAAUya,kBAAV,EAA8B;AAC3C,MAAMza,gBAAgB;AACpBN,YADoB,oBACVvI,OADU,EACD;AACjB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+c,kBAAtD;AACA,UAAM5iB,YAAY,EAAlB;;AAGA,gCAAShB,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDzG,SAArD,EAAgE4iB,kBAAhE;AACD,KAPmB;AAQpBpb,WARoB,mBAQXlI,OARW,EAQF;AAChB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+c,kBAAtD;AACD,KAVmB;AAWpBjb,UAXoB,kBAWZrI,OAXY,EAWH;AACf,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+c,kBAAtD;AACD,KAbmB;AAcpB9a,cAdoB,sBAcRxI,OAdQ,EAcC;AACnB,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD+c,kBAAtD;AACD;AAhBmB,GAAtB;;AAoBA,SAAOza,aAAP;AACD,C;;AAxBD;;;;;;;;;;;;;;;;;kBCQe,UAAU0a,kBAAV,EAA8B;AAC3C,WAAS/c,iBAAT,CAA4BY,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC6iB,uBAAmBC,WAAnB,CAA+Bpc,CAA/B,EAAkC1G,SAAlC;AACD;;AAED,WAASkS,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC6iB,uBAAmBE,SAAnB,CAA6Brc,CAA7B,EAAgC1G,SAAhC;;AAEA,8BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DC,iBAA/D;AACA,8BAAS9G,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,8BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,WAAS4L,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC6iB,uBAAmBG,MAAnB,CAA0Btc,CAA1B,EAA6B1G,SAA7B;;AAEA,WAAO,KAAP;AACD;;AAED,WAASgG,yBAAT,CAAoCU,CAApC,EAAuC1G,SAAvC,EAAkD;AAChD,QAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,gCAAS7B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqX,YAA9D;AACA,gCAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,gCAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;AACA2Q,yBAAmBI,WAAnB,CAA+Bvc,CAA/B,EAAkC1G,SAAlC;;AAEA,aAAO,KAAP;AACD;;AAED,8BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DX,iBAA9D;AACA,8BAAS9G,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACD;;AAED,WAASxK,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3B,QAAM1G,YAAY0G,EAAExF,MAApB;AACA,QAAM5B,UAAUU,UAAUV,OAA1B;AACA,QAAMe,WAAW,6BAAaf,OAAb,EAAsB4jB,oBAAtB,CAAjB;AACA,QAAIrJ,kBAAJ;;AAEA,QAAIxZ,QAAJ,EAAc;AACZwZ,kBAAYxZ,SAASD,IAAT,CAAc,CAAd,EAAiByZ,SAA7B;AACD,KAFD,MAEO;AACLA,kBAAY,IAAIsJ,iBAAJ,CAAsBnjB,UAAUmL,KAAV,CAAgBpI,KAAhB,GAAwB/C,UAAUmL,KAAV,CAAgBpG,MAA9D,CAAZ;AACA,mCAAazF,OAAb,EAAsB4jB,oBAAtB,EAA4C,EAAErJ,oBAAF,EAA5C;AACD;;AAED,QAAMuJ,QAAQ,0BAASvkB,WAAT,CAAqBwkB,QAArB,CAA8BrjB,UAAUV,OAAxC,EAAiDgkB,YAAjD,CAAd;;AAEAF,UAAMjY,KAAN,CAAYoY,YAAZ,CAAyB1J,SAAzB;AACAuJ,UAAMI,OAAN,GAAgB,IAAhB;;AAEA,8BAAS3kB,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;;AAEA;AACA;AACAujB,uBAAmBnb,eAAnB,CAAmChB,CAAnC,EAAsC1G,SAAtC;AACD;;AAED,WAAS6H,QAAT,CAAmBvI,OAAnB,EAA4BuB,eAA5B,EAA6C;AAC3CvB,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACApI,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;;AAEA,QAAM1H,YAAY;AAChBa;AADgB,KAAlB;;AAIA,8BAAS7B,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DG,yBAA7D;AACA,8BAAShH,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuEgG,yBAAvE;;AAEA,8BAAShH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDX,iBAApD;;AAEA,QAAM6T,iBAAiB,0BAAS9a,WAAT,CAAqBW,iBAArB,CAAuCF,OAAvC,CAAvB;AAd2C,gCAejBqa,eAAexO,KAfE;AAAA,QAenCpI,KAfmC,yBAenCA,KAfmC;AAAA,QAe5BgC,MAf4B,yBAe5BA,MAf4B;;AAgB3C,QAAI8U,YAAY,IAAIsJ,iBAAJ,CAAsBpgB,QAAQgC,MAA9B,CAAhB;;AAEA,QAAMU,gBAAgBge,UAAUzb,gBAAV,EAAtB;AACA,QAAI0b,aAAaje,cAAcie,UAA/B;;AAEA,QAAI,CAACA,UAAL,EAAiB;AACfA,mBAAa,eAAb;;AAEA,UAAMC,WAAW,0BAAS9kB,WAAT,CAAqB+kB,MAArB,CAA4BC,WAA5B,CAAwCH,UAAxC,CAAjB;;AAEAC,eAASG,iBAAT,CAA2B,CAA3B;AACAH,eAASI,QAAT,CAAkB,CAAlB,EAAqB,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAArB;AACAJ,eAASI,QAAT,CAAkB,CAAlB,EAAqB,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAArB;AACD;;AAED,QAAMC,gBAAgB;AACpBC,qBAAe,CADK;AAEpBC,qBAAe,CAFK;AAGpBzW,aAAO,GAHa;AAIpBC,iBAAW,CAJS;AAKpBoM,oBAAc;AAAA,eAAMD,SAAN;AAAA,OALM;AAMpB5F,YAAM0F,eAAexO,KAAf,CAAqBpG,MANP;AAOpBgP,eAAS4F,eAAexO,KAAf,CAAqBpI,KAPV;AAQpBgC,oBARoB;AASpBhC,kBAToB;AAUpB8W,0BAVoB;AAWpB0J,oBAAc,sBAACnjB,IAAD,EAAU;AACtByZ,oBAAYzZ,IAAZ;AACD,OAbmB;AAcpBujB,gBAAUD,UAdU;AAepBvhB,aAAO,KAfa;AAgBpBgiB,YAAM,KAhBc;AAiBpBC,gBAAU,IAjBU;AAkBpBC,cAAQ,KAlBY;AAmBpB7Q,0BAAoB,GAnBA;AAoBpBC,uBAAiB,GApBG;AAqBpB6Q,mBAAa3K,eAAexO,KAAf,CAAqBpI,KAArB,GAA6B4W,eAAexO,KAAf,CAAqBpG;AArB3C,KAAtB;;AAwBA,QAAIqe,cAAJ;AACA,QAAM5f,UAAU;AACdgY,gBAAU;AACR+I,0BAAkB;AADV;AADI,KAAhB;;AAMA,QAAIjB,YAAJ,EAAkB;AAChBF,cAAQ,0BAASvkB,WAAT,CAAqBwkB,QAArB,CAA8B/jB,OAA9B,EAAuCgkB,YAAvC,CAAR;AACD;;AAED,QAAI,CAACF,KAAL,EAAY;AACVE,qBAAe,0BAASzkB,WAAT,CAAqB2lB,QAArB,CAA8BllB,OAA9B,EAAuC0kB,aAAvC,EAAsDxgB,OAAtD,CAAf;AACD;;AAED,iCAAalE,OAAb,EAAsB4jB,oBAAtB,EAA4C,EAAErJ,oBAAF,EAA5C;;AAEApU,kBAAc6d,YAAd,GAA6BA,YAA7B;AACAG,cAAUxb,gBAAV,CAA2BxC,aAA3B;;AAEA,8BAAS5G,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,WAASwI,UAAT,CAAqBxI,OAArB,EAA8B;AAC5BA,YAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,8BAAS1I,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DG,yBAA7D;AACA,8BAAShH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACD;;AAED,MAAM2d,YAAY,+BAAgB;AAChC3d,wCADgC;AAEhCE,wDAFgC;AAGhC0B,oCAHgC;AAIhCI;AAJgC,GAAhB,CAAlB;;AAOA2b,YAAU5b,QAAV,GAAqBA,QAArB;;AAEA,SAAO4b,SAAP;AACD,C;;AAjKD;;;;AACA;;AACA;;;;AACA;;;;;;AAEA,IAAMP,uBAAuB,OAA7B;AACA,IAAII,qBAAJ,C;;;;;;;;;;;;kBCNwBmB,S;AAAT,SAASA,SAAT,CAAoBC,MAApB,EAA4BzQ,IAA5B,EAAkCF,OAAlC,EAAmE;AAAA,MAAxB4Q,MAAwB,uEAAf,CAAe;AAAA,MAAZC,MAAY,uEAAH,CAAG;;AAChF,MAAMC,KAAKlgB,KAAKqU,KAAL,CAAW2L,MAAX,CAAX;AACA,MAAMG,KAAKngB,KAAKqU,KAAL,CAAW4L,MAAX,CAAX;;AAEA,MAAIF,WAAW,CAAf,EAAkB;AAChB,WAAO,CAAC,CAACG,EAAD,EAAKC,EAAL,CAAD,CAAP;AACD;;AAED,MAAMC,cAAc,EAApB;AACA,MAAI1f,QAAQ,CAAZ;;AAEA,OAAI,IAAI9B,IAAI,CAACmhB,MAAb,EAAqBnhB,KAAKmhB,MAA1B,EAAkCnhB,GAAlC,EAAuC;AACrC,QAAMqhB,UAASE,KAAKvhB,CAApB;;AAEA,QAAIqhB,UAAS3Q,IAAT,IAAiB2Q,UAAS,CAA9B,EAAiC;AAC/B;AACD;;AAED,SAAI,IAAIthB,IAAI,CAACohB,MAAb,EAAqBphB,KAAKohB,MAA1B,EAAkCphB,GAAlC,EAAuC;AACrC,UAAMqhB,UAASE,KAAKvhB,CAApB;;AAEA,UAAIqhB,UAAS5Q,OAAT,IAAoB4Q,UAAS,CAAjC,EAAoC;AAClC;AACD;;AAED,UAAIrhB,IAAIA,CAAJ,GAAQC,IAAIA,CAAZ,GAAgBmhB,SAASA,MAA7B,EAAqC;AACnCK,oBAAY1f,OAAZ,IAAuB,CAACwf,KAAKvhB,CAAN,EAASwhB,KAAKvhB,CAAd,CAAvB;AACD;AACF;AACF;;AAED,SAAOwhB,WAAP;AACD,C;;;;;;;;;;;;;;AChCD;;;;;;AAEA,SAASC,eAAT,CAA0BC,YAA1B,EAAwCC,YAAxC,EAAsDC,eAAtD,EAAuEpR,OAAvE,EAAgF;AAC9E,MAAMqR,gBAAgB,SAAhBA,aAAgB,CAAC9hB,CAAD,EAAIC,CAAJ;AAAA,WAAWA,IAAIwQ,OAAL,GAAgBzQ,CAA1B;AAAA,GAAtB;;AAEA2hB,eAAazgB,OAAb,CAAqB,UAAC+G,KAAD,EAAW;AAC9B,QAAMwO,UAAUqL,cAAc7Z,MAAM,CAAN,CAAd,EAAwBA,MAAM,CAAN,CAAxB,CAAhB;;AAEA2Z,iBAAanL,OAAb,IAAwBoL,eAAxB;AACD,GAJD;AAKD;;AAED,SAASE,iBAAT,CAA4BJ,YAA5B,EAA0CK,aAA1C,EAAyDnjB,KAAzD,EAAgE7C,OAAhE,EAAyE;AACvE,MAAMimB,aAAa,0BAAS1mB,WAAT,CAAqB8J,aAArB,CAAmCrJ,OAAnC,EAA4C,EAAEgE,GAAG,CAAL;AAC7DC,OAAG,CAD0D,EAA5C,CAAnB;AAEA,MAAMiiB,aAAa,0BAAS3mB,WAAT,CAAqB8J,aAArB,CAAmCrJ,OAAnC,EAA4C,EAAEgE,GAAG,CAAL;AAC7DC,OAAG,CAD0D,EAA5C,CAAnB;AAEA,MAAMkiB,QAAQD,WAAWliB,CAAX,GAAeiiB,WAAWjiB,CAAxC;AACA,MAAMoiB,QAAQF,WAAWjiB,CAAX,GAAegiB,WAAWhiB,CAAxC;;AAEA+hB,gBAAclhB,IAAd;AACAkhB,gBAAczgB,SAAd,GAA0B1C,KAA1B;;AAEA8iB,eAAazgB,OAAb,CAAqB,UAAC+G,KAAD,EAAW;AAC9B,QAAMoa,WAAW,0BAAS9mB,WAAT,CAAqB8J,aAArB,CAAmCrJ,OAAnC,EAA4C;AAC3DgE,SAAGiI,MAAM,CAAN,CADwD;AAE3DhI,SAAGgI,MAAM,CAAN;AAFwD,KAA5C,CAAjB;;AAKA+Z,kBAAclgB,QAAd,CAAuBugB,SAASriB,CAAhC,EAAmCqiB,SAASpiB,CAA5C,EAA+CkiB,KAA/C,EAAsDC,KAAtD;AACD,GAPD;;AASAJ,gBAAc/f,OAAd;AACD;;QAEQyf,e,GAAAA,e;QAAiBK,iB,GAAAA,iB;;;;;;;;;;;;;;;;;;oDCnCjB1V,O;;;;;;;;;0CAEAA,O;;;;;;;;;2CACAA,O;;;;;;;;;uDAEAA,O;;;;;;;;;gEAEAA,O;;;;;;;;;kDACAA,O;;;;;;;;;2CACAA,O;;;;;;;;;mDACAA,O;;;;;;;;;2BACAkD,+B;;;;;;2BACPC,wB;;;;;;2BACAC,sB;;;;;;;;;2DAEOpD,O;;;;;;;;;mDACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;yDACAA,O;;;;;;;;;iDACAA,O;;;;;;;;;uCACAuB,8B;;;;;;uCACPD,0B;;;;;;uCACAhB,c;;;;;;uCACAwB,c;;;;;;;;;iDAEO9B,O;;;;;;;;;gDACAA,O;;;;;;;;;gDACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;8CACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;iDACAA,O;;;;;;;;;+DACAA,O;;;;;;;;;gDAEAA,O;;;;;;;;;uDACAA,O;;;;;;;;;qDACAA,O;;;;;;;;;6BACAiW,gB;;;;;;6BACPC,qB;;;;;;6BACAC,yB;;;;;;;;;qDAEOnW,O;;;;;;;;;4DACAA,O;;;;;;;;;iDACAA,O;;;;;;;;;4DACAA,O;;;;;;;;;mEACAA,O;;;;;;;;;yEACAA,O;;;;;;;;;gEACAA,O;;;;;;;;;wDACAA,O;;;;;;;;;8CAEAA,O;;;;;;;;;sBACAhQ,Y;;;;;;sBACPM,Y;;;;;;sBACAE,e;;;;;;sBACAO,c;;;;;;sBACAC,0B;;;;;;sBACAtB,0B;;;;;;;;;oDACOsQ,O;;;;;;;;;+CACAA,O;;;;;;;;;2CACAoW,yB;;;;;;2CACPC,qC;;;;;;;;;8CACOrW,O;;;;;;;;;sCAEAsW,yB;;;;;;sCACPC,gC;;;;;;sCACAC,oB;;;;;;;;;uDAEOxW,O;;;;;;;;;wCAEAxD,kC;;;;;;wCACPe,qC;;;;;;;;;yCAEOkZ,2C;;;;;;yCACPC,8C;;;;;;;;;6CAEO1W,O;;;;;;;;;wDAEAA,O;;;;;;;;;wBAEAsO,W;;;;;;wBACPM,gB;;;;;;wBACAC,oB;;;;;;wBACAE,qB;;;;;;;;;kDAEO/O,O;;;;;;;;;oDACAA,O;;;;;;;;;mDACAA,O;;;;;;;;;qBACA2W,Q;;;;;;qBAAUC,Q;;;;;;;;;2DAEV5W,O;;;;;;;;;gDACAA,O;;;;;;;;;4DACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;mDACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;kDACAA,O;;;;;;;;;uDACAA,O;;;;;;;;;wDACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;kDAEAA,O;;;;;;;;;+CACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;sDACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;sBAGA+P,K;;;;;;sBAAO8G,U;;;;;;;;;0BACPC,a;;;;;;0BAAeC,kB;;;;;;;;;uBACfC,U;;;;;;uBAAYC,e;;;;;;;;;gDACZjX,O;;;;;;;;;kDACAA,O;;;;;;;;;kDACAA,O;;;;;;;;;sBACAkX,S;;;;;;sBAAWC,c;;;;;;;;;0BAEXC,a;;;;;;0BAAeC,kB;;;;;;;;;qBACfC,Q;;;;;;;;;sBAEA3d,S;;;;;;sBAAW4d,c;;;;;;;;;+CACXvX,O;;;;;;;;;iDACAA,O;;;;;;;;;mBACAnP,M;;;;;;mBAAQ2mB,W;;;;;;;;;oBACRC,O;;;;;;oBAASC,gB;;;;;;;;;6DACT1X,O;;;;;;;;;oDACAA,O;;;;;;;;;mDACAA,O;;;;;;;;;uDACAA,O;;;;;;;;;uDACAA,O;;;;;;;;;gBAEA2X,G;;;;;;gBAAKC,Y;;;;;;;;;kDACL5X,O;;;;;;;;;kBACA6X,K;;;;;;kBAAOC,U;;;;;;;;;yBACPC,Y;;;;;;yBAAcC,iB;;;;;;;;;mBACdC,M;;;;;;mBAAQC,e;;;;;;;;;gDACRlY,O;;;;;;;;;2CACAA,O;;;;;;;;;yBACAmY,Y;;;;;;yBAAcC,iB;;;;;;;;;wBACdC,W;;;;;;wBAAaC,gB;;;;;;;;;0DACbtY,O;;;;;;;;;uBACAuY,U;;;;;;uBAAYC,e;;;;;;;;;kDAEZxY,O;;;;;;;;;mDACAA,O;;;;;;;;;8CACAA,O;;;;;;;;;iBACAyY,I;;;;;;iBAAMC,a;;;;;;;;;uBACNC,U;;;;;;uBAAYC,e;;;;;;;;;iBACZC,I;;;;;;iBACPC,S;;;;;;iBACAC,c;;;;;;iBACAC,a;;;;;;;;;kBACOC,K;;;;;;;;;0BACAC,a;;;;;;;;;4CACAlZ,O;;;;;;;;;;;;;;;;;ACxJT;;;;AACA;;;;AACA;;;;;;AAEA,IAAMmZ,iBAAiB;AACrBC,0DADqB;AAErBC,oCAFqB;AAGrBC;AAHqB,CAAvB;;kBAMeH,c;;;;;;;;;;;;;ACVf;;;;AACA;;AACA;;;;;;AAEA,IAAMlpB,WAAW,gBAAjB;;AAEA,SAAS8H,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3B,MAAM1G,YAAY0G,EAAExF,MAApB;;AAEA;AACA,MAAMb,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED;AACA,MAAMwpB,cAAc7oB,SAASD,IAAT,CAAc,CAAd,EAAiB+oB,sBAArC;AACA,MAAMC,kBAAkBF,YAAYG,iBAAZ,EAAxB;;AAEA,MAAMC,WAAWjpB,SAASD,IAAT,CAAc,CAAd,EAAiBkpB,QAAlC;;AAEA;AACA,MAAMlmB,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEA,4BAAS1qB,WAAT,CAAqBoe,0BAArB,CAAgDjd,UAAU2Z,cAA1D,EAA0EvW,OAA1E;;AAEA;AACAgmB,kBAAgB5kB,OAAhB,CAAwB,UAACglB,uBAAD,EAA6B;;AAEnD;AACA,QAAIA,4BAA4B9iB,EAAES,aAAlC,EAAiD;AAC/C;AACD;;AAED;AACAmiB,aAASlmB,OAAT,EAAkBpD,SAAlB,EAA6B0G,EAAES,aAA/B,EAA8CqiB,uBAA9C;AACD,GATD;AAUD;;AAED;AACA;AACA,SAAS7hB,MAAT,CAAiBrI,OAAjB,EAA0B6pB,sBAA1B,EAAkDG,QAAlD,EAA4D;AAC1DA,aAAWA,+CAAX;;AAEA,+BAAahqB,OAAb,EAAsBM,QAAtB,EAAgC;AAC9BupB,kDAD8B;AAE9BG;AAF8B,GAAhC;;AAKAhqB,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACApI,UAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,4BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,SAASkI,OAAT,CAAkBlI,OAAlB,EAA2B;AACzBA,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,4BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,IAAM0pB,OAAO;AACXrhB,gBADW;AAEXH;AAFW,CAAb;;kBAKewhB,I;;;;;;;;;;;;;kBChEA,UAAUS,MAAV,EAAkB;AAC/B,MAAMC,OAAO,+BAAiBD,MAAjB,CAAb;;AAEA;AACA;;AAEA,MAAI5M,cAAc,EAAlB;AACA,MAAM8M,eAAeD,KAAKpmB,CAAL,GAAS,CAAT,GAAa,GAAb,GAAmB,GAAxC;AACA,MAAMsmB,eAAeF,KAAKnmB,CAAL,GAAS,CAAT,GAAa,GAAb,GAAmB,GAAxC;AACA,MAAMsmB,eAAeH,KAAKI,CAAL,GAAS,CAAT,GAAa,GAAb,GAAmB,GAAxC;;AAEA;AACA,MAAMxN,MAAM,IAAI,0BAASvd,eAAT,CAAyBmN,OAA7B,CAAqCvH,KAAK2X,GAAL,CAASoN,KAAKpmB,CAAd,CAArC,EAAuDqB,KAAK2X,GAAL,CAASoN,KAAKnmB,CAAd,CAAvD,EAAyEoB,KAAK2X,GAAL,CAASoN,KAAKI,CAAd,CAAzE,CAAZ;;AAEA,OAAK,IAAIvpB,IAAI,CAAb,EAAgBA,IAAI,CAApB,EAAuBA,GAAvB,EAA4B;AAC1B,QAAI+b,IAAIhZ,CAAJ,GAAQ,MAAR,IAAkBgZ,IAAIhZ,CAAJ,GAAQgZ,IAAI/Y,CAA9B,IAAmC+Y,IAAIhZ,CAAJ,GAAQgZ,IAAIwN,CAAnD,EAAsD;AACpDjN,qBAAe8M,YAAf;AACArN,UAAIhZ,CAAJ,GAAQ,CAAR;AACD,KAHD,MAGO,IAAIgZ,IAAI/Y,CAAJ,GAAQ,MAAR,IAAkB+Y,IAAI/Y,CAAJ,GAAQ+Y,IAAIhZ,CAA9B,IAAmCgZ,IAAI/Y,CAAJ,GAAQ+Y,IAAIwN,CAAnD,EAAsD;AAC3DjN,qBAAe+M,YAAf;AACAtN,UAAI/Y,CAAJ,GAAQ,CAAR;AACD,KAHM,MAGA,IAAI+Y,IAAIwN,CAAJ,GAAQ,MAAR,IAAkBxN,IAAIwN,CAAJ,GAAQxN,IAAIhZ,CAA9B,IAAmCgZ,IAAIwN,CAAJ,GAAQxN,IAAI/Y,CAAnD,EAAsD;AAC3DsZ,qBAAegN,YAAf;AACAvN,UAAIwN,CAAJ,GAAQ,CAAR;AACD,KAHM,MAGA;AACL;AACD;AACF;;AAED,SAAOjN,WAAP;AACD,C;;AAjCD;;;;AACA;;;;;;;;;;;;;;;;;kBCDe,UAAUkN,MAAV,EAAkB;AAC/B,MAAIC,WAAWD,OAAOnZ,OAAP,CAAe,GAAf,EAAoB,GAApB,CAAf;;AAEAoZ,aAAWA,SAASpZ,OAAT,CAAiB,GAAjB,EAAsB,GAAtB,CAAX;AACAoZ,aAAWA,SAASpZ,OAAT,CAAiB,GAAjB,EAAsB,GAAtB,CAAX;AACAoZ,aAAWA,SAASpZ,OAAT,CAAiB,GAAjB,EAAsB,GAAtB,CAAX;AACAoZ,aAAWA,SAASpZ,OAAT,CAAiB,GAAjB,EAAsB,GAAtB,CAAX;AACAoZ,aAAWA,SAASpZ,OAAT,CAAiB,GAAjB,EAAsB,GAAtB,CAAX;AACAoZ,aAAWA,SAASC,WAAT,EAAX;;AAEA,SAAOD,QAAP;AACD,C;;;;;;;;;;;;;ACXD;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;AACA;;;;;;AAEA,IAAMpqB,WAAW,SAAjB;;AAEA,SAASsqB,gBAAT,CAA2BrqB,eAA3B,EAA4C;AAC1C,MAAMhB,cAAc,0BAASA,WAA7B;AACA,MAAMsrB,UAAU,EAAhB;;AAEAtqB,kBAAgBuqB,UAAhB,CAA2B/O,MAA3B,CAAkC7W,OAAlC,CAA0C,UAAU6lB,KAAV,EAAiB;AACzD,QAAIxS,eAAJ;;AAEA,QAAIwS,MAAMzT,YAAN,KAAuB,IAA3B,EAAiC;AAC/BiB,eAAShZ,YAAYiZ,SAAZ,CAAsBuS,MAAM1R,QAAN,CAAe9Y,gBAAgByqB,YAA/B,CAAtB,CAAT;AACD,KAFD,MAEO;AACLzS,eAAShZ,YAAYkZ,iBAAZ,CAA8BsS,MAAM1R,QAAN,CAAe9Y,gBAAgByqB,YAA/B,CAA9B,CAAT;AACD;;AAEDzS,WAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,UAAMof,SAAS5lB,KAAKqU,KAAL,CAAWnZ,gBAAgBwG,OAAhB,CAAwBE,GAAxB,CAA4BjD,CAAvC,IAA4CqB,KAAKqU,KAAL,CAAWnZ,gBAAgBwG,OAAhB,CAAwBE,GAAxB,CAA4BhD,CAAvC,IAA4C4H,MAAMpI,KAA7G;AACA,UAAMynB,SAASrf,MAAM2O,YAAN,GAAqByQ,MAArB,CAAf;;AAEAJ,cAAQrd,IAAR,CAAa0d,MAAb;AACD,KALD;AAMD,GAfD;AAgBA3qB,kBAAgB4qB,UAAhB,CAA2BC,GAA3B,CAA+BP,OAA/B;AACD;;AAED;AACA,SAASvkB,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C,MAAMglB,qBAAqB,6BAAahlB,eAAerG,OAA5B,EAAqC,YAArC,CAA3B;;AAEA,MAAIqrB,uBAAuBjrB,SAAvB,IAAoCirB,mBAAmBvqB,IAAnB,KAA4BV,SAAhE,IAA6EirB,mBAAmBvqB,IAAnB,CAAwBI,MAAxB,KAAmC,CAApH,EAAuH;AACrH;AACD;;AAED,MAAM4pB,aAAaO,mBAAmBvqB,IAAnB,CAAwB,CAAxB,CAAnB;;AAEA;AACA,MAAMP,kBAAkB;AACtBuqB,0BADsB;AAEtBK,gBAAY,qCAFU;AAGtBH,kBAAcF,WAAW/O,MAAX,CAAkB+O,WAAW9O,iBAA7B,EAAgD7C,mBAHxC;AAItBmS,aAAS,IAJa;AAKtBvkB,aAAS;AACPE,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL;AADE;AALa,GAAxB;;AAeAwnB,mBAAiBrqB,eAAjB;AACA,+BAAmBC,GAAnB,CAAuBD,eAAvB;;AAEA,SAAOA,eAAP;AACD;AACD;;AAEA;;AAEA,SAAS6H,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED;AACA,MAAM+C,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEA,4BAAS1qB,WAAT,CAAqBoe,0BAArB,CAAgDjd,UAAU2Z,cAA1D,EAA0EvW,OAA1E;AACA,MAAMjB,QAAQ,OAAd;;AAEA,OAAK,IAAI5B,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;AACA,QAAMhE,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA;AACA6C,YAAQoF,SAAR;AACA,+BAAYpF,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;AACAiB,YAAQ4F,MAAR;;AAEA;AACA,QAAM6hB,iBAAiB,2CAA4B7qB,UAAU2Z,cAAtC,EAAsD3Z,UAAUslB,aAAhE,EAA+E,EAA/E,CAAvB;;AAEAliB,YAAQU,IAAR,GAAkB+mB,eAAe7mB,QAAjC;;AAEA;AACA,QAAMV,IAAIqB,KAAKqU,KAAL,CAAW5Y,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAA5B,CAAV;AACA,QAAMC,IAAIoB,KAAKqU,KAAL,CAAW5Y,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA5B,CAAV;AACA,QAAMunB,QAAQ1qB,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAjB,GAAqB,CAAnC;AACA,QAAMynB,QAAQ3qB,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAjB,GAAqB,CAAnC;;AAEAH,YAAQyB,SAAR,GAAoB1C,KAApB;;AAEAiB,YAAQkC,QAAR,CAAoBhC,CAApB,SAAyBC,CAAzB,EAA8BunB,KAA9B,EAAqCC,KAArC;;AAEA3nB,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,IAAMylB,cAAc,+BAAgB;AAClCplB,4CADkC;AAElC8B,kCAFkC;AAGlC9H;AAHkC,CAAhB,CAApB;;kBAMeorB,W;;;;;;;;;;;;;ACtHf;;;;;;AAEA;AACA,SAASC,kBAAT,GAA+B;AAC7B,MAAMC,OAAO,IAAb;;AAEAA,OAAKC,YAAL,GAAoB,EAApB;;AAEA;AACA,OAAKrrB,GAAL,GAAW,UAAUsrB,WAAV,EAAuB;AAChC,QAAM/lB,QAAQ6lB,KAAKC,YAAL,CAAkBre,IAAlB,CAAuBse,WAAvB,CAAd;AACA;AACA,QAAMC,cAAc;AAClBhmB,kBADkB;AAElB+lB;AAFkB,KAApB;;AAKA,gCAAaF,IAAb,EAAmB,6BAAnB,EAAkDG,WAAlD;AACD,GATD;;AAWA,OAAKC,MAAL,GAAc,UAAUjmB,KAAV,EAAiB;AAC7B,QAAM+lB,cAAcF,KAAKC,YAAL,CAAkB9lB,KAAlB,CAApB;;AAEA6lB,SAAKC,YAAL,CAAkB1qB,MAAlB,CAAyB4E,KAAzB,EAAgC,CAAhC;AACA;AACA,QAAMgmB,cAAc;AAClBhmB,kBADkB;AAElB+lB;AAFkB,KAApB;;AAKA,gCAAaF,IAAb,EAAmB,+BAAnB,EAAoDG,WAApD;AACD,GAXD;AAaD;;AAED;AACA,IAAME,UAAU,IAAIN,kBAAJ,EAAhB;;kBAEeM,O;;;;;;;;;;;;;kBCnCA,YAAY;;AAEzB,MAAML,OAAO,IAAb;;AAEAA,OAAKf,OAAL,GAAe,EAAf;;AAEA;AACA,OAAKO,GAAL,GAAW,UAAUP,OAAV,EAAmB;AAC5Be,SAAKf,OAAL,GAAeA,OAAf;AACA;AACA,gCAAae,IAAb,EAAmB,8BAAnB;AACD,GAJD;AAKD,C;;AAfD;;;;;;;;;;;;;;;;;ACAA;;AACA;;;;;;AAEA,IAAMtrB,WAAW,kBAAjB;;AAEA;;;;;;;;AAQA,SAAS0mB,QAAT,CAAmBhnB,OAAnB,EAA4BksB,eAA5B,EAA6C;AAC3C,MAAIlsB,YAAYI,SAAhB,EAA2B;AACzB,UAAM,IAAIqX,KAAJ,CAAU,yCAAV,CAAN;AACD;;AAED,MAAIyU,oBAAoB9rB,SAAxB,EAAmC;AACjC8rB,sBAAkB,EAAlB;AACD;;AAED,MAAMC,qBAAqB,6BAAansB,OAAb,EAAsB,YAAtB,CAA3B;;AAEA,MAAImsB,uBAAuB/rB,SAAvB,IAAoC+rB,mBAAmBrrB,IAAnB,KAA4BV,SAAhE,IAA6E+rB,mBAAmBrrB,IAAnB,CAAwBI,MAAxB,KAAmC,CAApH,EAAuH;AACrH;AACD;;AAED,MAAMkrB,mBAAmB,6BAAapsB,OAAb,EAAsBM,QAAtB,CAAzB;AACA,MAAI+rB,qBAAJ;;AAEA,MAAID,qBAAqBhsB,SAArB,IAAkCgsB,iBAAiBtrB,IAAjB,CAAsBI,MAAtB,KAAiC,CAAvE,EAA0E;AACxEmrB,mBAAe;AACbC,kBAAYlsB,SADC;AAEb8rB,sCAFa;AAGbK,0BAAoBnsB,SAHP;AAIbosB,iBAAW;AAJE,KAAf;AAMA,iCAAaxsB,OAAb,EAAsBM,QAAtB,EAAgC+rB,YAAhC;AACD,GARD,MAQO;AACLA,mBAAeD,iBAAiBtrB,IAAjB,CAAsB,CAAtB,CAAf;AACAurB,iBAAaH,eAAb,GAA+BA,eAA/B;AACD;;AAED;AACA,MAAIG,aAAaC,UAAb,KAA4BlsB,SAAhC,EAA2C;AACzC;AACD;;AAEDisB,eAAaC,UAAb,GAA0BG,YAAY,YAAY;AAChD,QAAIJ,aAAaH,eAAb,GAA+B,CAAnC,EAAsC;AACpC,wCAAmBlsB,OAAnB,EAA4B,CAA5B,EAA+B,IAA/B;AACD,KAFD,MAEO;AACL,wCAAmBA,OAAnB,EAA4B,CAAC,CAA7B,EAAgC,IAAhC;AACD;AACF,GANyB,EAMvB,OAAOqF,KAAK2X,GAAL,CAASqP,aAAaH,eAAtB,CANgB,CAA1B;AAOD;;AAED;;;;AAIA,SAASjF,QAAT,CAAmBjnB,OAAnB,EAA4B;AAC1B,MAAMosB,mBAAmB,6BAAapsB,OAAb,EAAsBM,QAAtB,CAAzB;;AAEA,MAAI,CAAC8rB,gBAAD,IAAqB,CAACA,iBAAiBtrB,IAAvC,IAA+C,CAACsrB,iBAAiBtrB,IAAjB,CAAsBI,MAA1E,EAAkF;AAChF;AACD;AACD,MAAMmrB,eAAeD,iBAAiBtrB,IAAjB,CAAsB,CAAtB,CAArB;;AAGA4rB,gBAAcL,aAAaC,UAA3B;AACAD,eAAaC,UAAb,GAA0BlsB,SAA1B;AACD;;AAED;AACA,IAAMusB,mBAAmB;AACvB/V,SAAOoQ,QADgB;AAEvB4F,QAAM3F;AAFiB,CAAzB;;kBAKe0F,gB;;;;;;;;;;;;;;ACjFf;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,SAAS/Z,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiM,iBAA/D;AACA,4BAAS9S,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,4BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;;AAEjE,QAAMkd,qBAAqB;AACzBC,cAAQ,CADiB;AAEzBxa,eAASkD,EAAEtG,IAAF,CAAOoD;AAFS,KAA3B;;AAKA,8BAASxE,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DsX,kBAA9D,EAAkFjM,iBAAlF;AACA,8BAAS9S,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;AACAxL,MAAEY,wBAAF;;AAEA,WAAO,KAAP;AACD;AACF;;AAED,SAASwK,iBAAT,CAA4BpL,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC0G,IAAEtG,IAAF,CAAO4d,MAAP,IAAiBhe,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA5C;;AAEA,MAAMlD,WAAW,6BAAaL,UAAUV,OAAvB,EAAgC,YAAhC,CAAjB;;AAEA,MAAIe,aAAaX,SAAb,IAA0BW,SAASD,IAAT,KAAkBV,SAA5C,IAAyDW,SAASD,IAAT,CAAcI,MAAd,KAAyB,CAAtF,EAAyF;AACvF;AACD;;AAED,MAAM2a,iBAAiB9a,SAASD,IAAT,CAAc,CAAd,CAAvB;;AAEA,MAAI+rB,sBAAsB,0BAASntB,CAAT,CAAWgB,UAAUV,OAArB,EAA8ByF,MAA9B,KAAyCoW,eAAeE,MAAf,CAAsB7a,MAAzF;;AAEA,MAAIkG,EAAEtG,IAAF,CAAOoD,OAAP,KAAmB9D,SAAnB,IAAgCgH,EAAEtG,IAAF,CAAOoD,OAAP,CAAe4oB,qBAAf,KAAyC1sB,SAA7E,EAAwF;AACtFysB,0BAAsBzlB,EAAEtG,IAAF,CAAOoD,OAAP,CAAe4oB,qBAArC;AACD;;AAED,MAAI1lB,EAAEtG,IAAF,CAAO4d,MAAP,IAAiBmO,mBAAjB,IAAwCzlB,EAAEtG,IAAF,CAAO4d,MAAP,IAAiB,CAACmO,mBAA9D,EAAmF;AACjF,QAAME,kBAAkB1nB,KAAKqU,KAAL,CAAWtS,EAAEtG,IAAF,CAAO4d,MAAP,GAAgBmO,mBAA3B,CAAxB;AACA,QAAMG,qBAAqB5lB,EAAEtG,IAAF,CAAO4d,MAAP,GAAgBmO,mBAA3C;;AAEA,sCAAmBnsB,UAAUV,OAA7B,EAAsC+sB,eAAtC;AACA3lB,MAAEtG,IAAF,CAAO4d,MAAP,GAAgBsO,kBAAhB;AACD;;AAED,SAAO,KAAP,CAzBwC,CAyB1B;AACf;;AAED,SAAS1a,kBAAT,CAA6BlL,CAA7B,EAAgC1G,SAAhC,EAA2C;AACzC,MAAMqY,SAAS,CAACrY,UAAUgW,SAA1B;;AAEA,oCAAmBhW,UAAUV,OAA7B,EAAsC+Y,MAAtC;AACD;;AAED,SAAS2K,MAAT,CAAiBtc,CAAjB,EAAoB;AAClB,MAAM6lB,gBAAgB7lB,EAAE8lB,aAAF,CAAgBtrB,MAAtC;AACA,MAAMlB,YAAY;AAChBge,YAAQ;AADQ,GAAlB;;AAIAhe,YAAUge,MAAV,IAAoBuO,cAAcvR,WAAd,CAA0BrI,IAA1B,CAA+BpP,CAAnD;;AAEA,MAAMlD,WAAW,6BAAaksB,cAAcjtB,OAA3B,EAAoC,OAApC,CAAjB;;AAEA,MAAIe,aAAaX,SAAb,IAA0BW,SAASD,IAAT,KAAkBV,SAA5C,IAAyDW,SAASD,IAAT,CAAcI,MAAd,KAAyB,CAAtF,EAAyF;AACvF;AACD;;AAED,MAAIR,UAAUge,MAAV,IAAoB,CAApB,IAAyBhe,UAAUge,MAAV,IAAoB,CAAC,CAAlD,EAAqD;AACnD,QAAMqO,kBAAkBrsB,UAAUge,MAAV,GAAmB,CAA3C;AACA,QAAMsO,qBAAqBtsB,UAAUge,MAAV,GAAmB,CAA9C;;AAEA,sCAAmBhe,UAAUV,OAA7B,EAAsC+sB,eAAtC;AACArsB,cAAUge,MAAV,GAAmBsO,kBAAnB;AACD;;AAED,SAAO,KAAP,CAtBkB,CAsBJ;AACf;;AAED;AACA,IAAM1G,mBAAmB,qCAAsB7f,iBAAtB,CAAzB;AACA,IAAM8f,wBAAwB,8BAAejU,kBAAf,CAA9B;AACA,IAAMkU,4BAA4B,6BAAc9C,MAAd,CAAlC;;QAGE4C,gB,GAAAA,gB;QACAC,qB,GAAAA,qB;QACAC,yB,GAAAA,yB;;;;;;;;;;;;;kBC/Fa,UAAU2G,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD;;AAEnE;AACA,MAAIA,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,MAAM7tB,cAAc,0BAASA,WAA7B;AACA;AACA,MAAM8tB,iBAAiB9tB,YAAY4c,WAAZ,CAAwBiR,aAAxB,CAAvB;AACA,MAAME,iBAAiB/tB,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAvB;;AAEA;AACA,MAAI6Q,eAAeC,GAAf,CAAmBC,WAAnB,KAAmCH,eAAeE,GAAf,CAAmBC,WAAtD,IAAqEF,eAAeC,GAAf,CAAmBE,YAAnB,KAAoCJ,eAAeE,GAAf,CAAmBE,YAA5H,IAA4IH,eAAevI,MAAf,KAA0BsI,eAAetI,MAAzL,EAAiM;AAC/L;AACD;;AAED;AACAuI,iBAAeC,GAAf,CAAmBC,WAAnB,GAAiCH,eAAeE,GAAf,CAAmBC,WAApD;AACAF,iBAAeC,GAAf,CAAmBE,YAAnB,GAAkCJ,eAAeE,GAAf,CAAmBE,YAArD;AACAH,iBAAevI,MAAf,GAAwBsI,eAAetI,MAAvC;AACAoI,eAAaO,WAAb,CAAyBjR,aAAzB,EAAwC6Q,cAAxC;AACD,C;;AAzBD;;;;;;;;;;;;;;;;;kBCGe,UAAUH,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD;;AAEnE;AACA,MAAIA,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,4BAAS7tB,WAAT,CAAqBqH,WAArB,CAAiC6V,aAAjC;AACD,C;;AAXD;;;;;;;;;;;;;;;;;ACAA;;;;AACA;;;;;;AAEA;AACA;AACA,SAASkR,YAAT,CAAuB9rB,KAAvB,EAA8BkJ,OAA9B,EAAuC;AACrC,MAAMxL,cAAc,0BAASA,WAA7B;AACA,MAAMqsB,OAAO,IAAb;AACA,MAAMgC,iBAAiB,EAAvB,CAHqC,CAGV;AAC3B,MAAMC,iBAAiB,EAAvB,CAJqC,CAIV;;AAE3B,MAAIC,oBAAoB,KAAxB;AACA,MAAMC,cAAc,EAApB;AACA,MAAIC,eAAejjB,OAAnB;;AAEA,OAAKkjB,UAAL,GAAkB,UAAUljB,OAAV,EAAmB;AACnCijB,mBAAejjB,OAAf;AACD,GAFD;;AAIA,OAAKmjB,UAAL,GAAkB,YAAY;AAC5B,WAAOF,YAAP;AACD,GAFD;;AAIA,OAAKG,YAAL,GAAoB,YAAY;AAC9B,QAAI,CAACP,eAAe1sB,MAAhB,IAA0B,CAAC2sB,eAAe3sB,MAA9C,EAAsD;AACpD;AACD;;AAED6sB,gBAAYK,SAAZ,GAAwB,EAAxB;AACAL,gBAAY1U,QAAZ,GAAuB;AACrBuU,sBAAgB,EADK;AAErBC,sBAAgB;AAFK,KAAvB;;AAKAD,mBAAe1oB,OAAf,CAAuB,UAAUkoB,aAAV,EAAyB;AAC9C,UAAMiB,uBAAuB9uB,YAAYW,iBAAZ,CAA8BktB,aAA9B,CAA7B;;AAEA,UAAI,CAACiB,oBAAD,IAAyB,CAACA,qBAAqBxiB,KAAnD,EAA0D;AACxD;AACD;;AAED,UAAMyiB,gBAAgBD,qBAAqBxiB,KAArB,CAA2BmB,OAAjD;AACA,UAAMuhB,mBAAmBhvB,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6C0tB,aAA7C,CAAzB;;AAEA,UAAI,CAACC,gBAAD,IAAqB,CAACA,iBAAiBza,oBAA3C,EAAiE;AAC/D;AACD;;AAED,UAAM0a,sBAAsB,+BAAiBD,iBAAiBza,oBAAlC,CAA5B;;AAEA,UAAIia,YAAYxgB,cAAZ,CAA2B8gB,oBAA3B,CAAJ,EAAsD;AACpD;AACD;AACDN,kBAAYK,SAAZ,CAAsBE,aAAtB,IAAuC,EAAvC;;AAGAP,kBAAY1U,QAAZ,CAAqBuU,cAArB,CAAoCpgB,IAApC,CAAyC8gB,aAAzC;;AAEAT,qBAAe3oB,OAAf,CAAuB,UAAUuX,aAAV,EAAyB;AAC9C,YAAMgS,uBAAuBlvB,YAAYW,iBAAZ,CAA8Buc,aAA9B,CAA7B;;AAEA,YAAI,CAACgS,oBAAD,IAAyB,CAACA,qBAAqB5iB,KAAnD,EAA0D;AACxD;AACD;;AAED,YAAM6iB,gBAAgBD,qBAAqB5iB,KAArB,CAA2BmB,OAAjD;;AAEA+gB,oBAAY1U,QAAZ,CAAqBwU,cAArB,CAAoCrgB,IAApC,CAAyCkhB,aAAzC;;AAEA,YAAItB,kBAAkB3Q,aAAtB,EAAqC;AACnC;AACD;;AAED,YAAI6R,kBAAkBI,aAAtB,EAAqC;AACnC;AACD;;AAED,YAAIX,YAAYK,SAAZ,CAAsBE,aAAtB,EAAqC/gB,cAArC,CAAoDmhB,aAApD,CAAJ,EAAwE;AACtE;AACD;;AAED,YAAMlZ,mBAAmBjW,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6C8tB,aAA7C,CAAzB;;AAEA,YAAI,CAAClZ,gBAAD,IAAqB,CAACA,iBAAiB1B,oBAA3C,EAAiE;AAC/D;AACD;;AAED,YAAM6a,sBAAsB,+BAAiBnZ,iBAAiB1B,oBAAlC,CAA5B;;AAEAia,oBAAYK,SAAZ,CAAsBE,aAAtB,EAAqCI,aAArC,IAAsDC,oBAAoB5a,KAApB,GAA4BC,GAA5B,CAAgCwa,mBAAhC,CAAtD;AACD,OAhCD;;AAkCA,UAAI,CAACrqB,OAAO2C,IAAP,CAAYinB,YAAYK,SAAZ,CAAsBE,aAAtB,CAAZ,EAAkDptB,MAAvD,EAA+D;AAC7D,eAAO6sB,YAAYK,SAAZ,CAAsBE,aAAtB,CAAP;AACD;AACF,KA7DD;AA8DD,GAzED;;AA2EA,WAASM,SAAT,CAAoBxB,aAApB,EAAmC1sB,SAAnC,EAA8C;AAC5C;AACA,QAAI,CAACktB,eAAe1sB,MAAhB,IAA0B,CAAC2sB,eAAe3sB,MAA9C,EAAsD;AACpD;AACD;;AAED4sB,wBAAoB,IAApB;AACAD,mBAAe3oB,OAAf,CAAuB,UAAUuX,aAAV,EAAyB;AAC9C,UAAMoS,cAAchB,eAAeiB,OAAf,CAAuBrS,aAAvB,CAApB;;AAEA,UAAIoS,gBAAgB,CAAC,CAArB,EAAwB;AACtB;AACD;;AAED,UAAMH,gBAAgBX,YAAY1U,QAAZ,CAAqBwU,cAArB,CAAoCgB,WAApC,CAAtB;AACA,UAAME,cAAcnB,eAAekB,OAAf,CAAuB1B,aAAvB,CAApB;;AAEA,UAAI2B,gBAAgB,CAAC,CAArB,EAAwB;AACtB;AACD;;AAED,UAAMT,gBAAgBP,YAAY1U,QAAZ,CAAqBuU,cAArB,CAAoCmB,WAApC,CAAtB;;AAEA,UAAIC,2BAAJ;;AAEA,UAAIV,kBAAkBI,aAAtB,EAAqC;AACnCM,6BAAqB,CAArB;AACD,OAFD,MAEO,IAAIjB,YAAYK,SAAZ,CAAsBE,aAAtB,MAAyCluB,SAA7C,EAAwD;AAC7D4uB,6BAAqBjB,YAAYK,SAAZ,CAAsBE,aAAtB,EAAqCI,aAArC,CAArB;AACD;;AAEDV,mBAAapC,IAAb,EAAmBwB,aAAnB,EAAkC3Q,aAAlC,EAAiD/b,SAAjD,EAA4DsuB,kBAA5D;AACD,KAzBD;AA0BAlB,wBAAoB,KAApB;AACD;;AAED,WAASmB,OAAT,CAAkB7nB,CAAlB,EAAqB1G,SAArB,EAAgC;AAC9B,QAAIotB,sBAAsB,IAA1B,EAAgC;AAC9B;AACD;;AAEDc,cAAUxnB,EAAES,aAAZ,EAA2BnH,SAA3B;AACD;;AAED;AACA,OAAKwuB,SAAL,GAAiB,UAAUlvB,OAAV,EAAmB;AAClC;AACA,QAAM+F,QAAQ6nB,eAAekB,OAAf,CAAuB9uB,OAAvB,CAAd;;AAEA,QAAI+F,UAAU,CAAC,CAAf,EAAkB;AAChB;AACD;;AAED;AACA6nB,mBAAepgB,IAAf,CAAoBxN,OAApB;;AAEA;AACA,8BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBtF,KAAvB,EAA8BotB,OAA9B;;AAEA;AACArD,SAAKuC,YAAL;;AAEAvC,SAAKuD,qBAAL;AACD,GAlBD;;AAoBA;AACA,OAAKC,SAAL,GAAiB,UAAUpvB,OAAV,EAAmB;AAClC;AACA,QAAM+F,QAAQ8nB,eAAeiB,OAAf,CAAuB9uB,OAAvB,CAAd;;AAEA,QAAI+F,UAAU,CAAC,CAAf,EAAkB;AAChB;AACD;;AAED;AACA8nB,mBAAergB,IAAf,CAAoBxN,OAApB;;AAEA;AACA4rB,SAAKuC,YAAL;;AAEA;AACAH,iBAAapC,IAAb,EAAmB5rB,OAAnB,EAA4BA,OAA5B,EAAqC,CAArC;;AAEA4rB,SAAKuD,qBAAL;AACD,GAlBD;;AAoBA;AACA,OAAK3uB,GAAL,GAAW,UAAUR,OAAV,EAAmB;AAC5B4rB,SAAKsD,SAAL,CAAelvB,OAAf;AACA4rB,SAAKwD,SAAL,CAAepvB,OAAf;AACD,GAHD;;AAKA;AACA,OAAKqvB,YAAL,GAAoB,UAAUrvB,OAAV,EAAmB;AACrC;AACA,QAAM+F,QAAQ6nB,eAAekB,OAAf,CAAuB9uB,OAAvB,CAAd;;AAEA,QAAI+F,UAAU,CAAC,CAAf,EAAkB;AAChB;AACD;;AAED;AACA6nB,mBAAezsB,MAAf,CAAsB4E,KAAtB,EAA6B,CAA7B;;AAEA;AACA,8BAASrG,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB1E,KAAxB,EAA+BotB,OAA/B;;AAEA;AACArD,SAAKuC,YAAL;;AAEA;AACAS,cAAU5uB,OAAV;AACA4rB,SAAKuD,qBAAL;AACD,GApBD;;AAsBA;AACA,OAAKG,YAAL,GAAoB,UAAUtvB,OAAV,EAAmB;AACrC;AACA,QAAM+F,QAAQ8nB,eAAeiB,OAAf,CAAuB9uB,OAAvB,CAAd;;AAEA,QAAI+F,UAAU,CAAC,CAAf,EAAkB;AAChB;AACD;;AAED;AACA8nB,mBAAe1sB,MAAf,CAAsB4E,KAAtB,EAA6B,CAA7B;;AAEA;AACA6lB,SAAKuC,YAAL;;AAEA;AACAH,iBAAapC,IAAb,EAAmB5rB,OAAnB,EAA4BA,OAA5B,EAAqC,CAArC;AACA4rB,SAAKuD,qBAAL;AACD,GAjBD;;AAmBA;AACA,OAAKnD,MAAL,GAAc,UAAUhsB,OAAV,EAAmB;AAC/B4rB,SAAK0D,YAAL,CAAkBtvB,OAAlB;AACA4rB,SAAKyD,YAAL,CAAkBrvB,OAAlB;AACD,GAHD;;AAKA;AACA,OAAK+pB,iBAAL,GAAyB,YAAY;AACnC,WAAO6D,cAAP;AACD,GAFD;;AAIA;AACA,OAAK2B,iBAAL,GAAyB,YAAY;AACnC,WAAO1B,cAAP;AACD,GAFD;;AAIA,OAAKrR,YAAL,GAAoB,UAAUxc,OAAV,EAAmB6L,KAAnB,EAA0BqQ,QAA1B,EAAoC;AACtD4R,wBAAoB,IAApB;AACAvuB,gBAAYid,YAAZ,CAAyBxc,OAAzB,EAAkC6L,KAAlC,EAAyCqQ,QAAzC;AACA4R,wBAAoB,KAApB;AACD,GAJD;;AAMA,OAAKJ,WAAL,GAAmB,UAAU1tB,OAAV,EAAmBkc,QAAnB,EAA6B;AAC9C4R,wBAAoB,IAApB;AACAvuB,gBAAYmuB,WAAZ,CAAwB1tB,OAAxB,EAAiCkc,QAAjC;AACA4R,wBAAoB,KAApB;AACD,GAJD;;AAMA,WAAS0B,cAAT,CAAyBpoB,CAAzB,EAA4B;AAC1B,QAAMpH,UAAUoH,EAAExF,MAAF,CAAS5B,OAAzB;;AAEA4rB,SAAKI,MAAL,CAAYhsB,OAAZ;AACD;;AAED,OAAKmvB,qBAAL,GAA6B,YAAY;AACvC,QAAMM,WAAW,0BAAS/vB,CAAT,CAAWgwB,MAAX,CAAkB9B,eAAe+B,MAAf,CAAsB9B,cAAtB,CAAlB,CAAjB;;AAEA4B,aAASvqB,OAAT,CAAiB,UAAUlF,OAAV,EAAmB;AAClCA,cAAQmI,mBAAR,CAA4B,4BAA5B,EAA0DqnB,cAA1D;AACAxvB,cAAQsI,gBAAR,CAAyB,4BAAzB,EAAuDknB,cAAvD;AACD,KAHD;AAID,GAPD;;AASA,OAAKI,OAAL,GAAe,YAAY;AACzB,QAAMH,WAAW,0BAAS/vB,CAAT,CAAWgwB,MAAX,CAAkB9B,eAAe+B,MAAf,CAAsB9B,cAAtB,CAAlB,CAAjB;;AAEA4B,aAASvqB,OAAT,CAAiB,UAAUlF,OAAV,EAAmB;AAClC4rB,WAAKI,MAAL,CAAYhsB,OAAZ;AACD,KAFD;AAGD,GAND;AAOD;;kBAEc2tB,Y;;;;;;;;;;;;;kBCvRA,UAAUR,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD/b,SAAtD,EAAiE;AAC9E;AACA,MAAI0sB,kBAAkB3Q,aAAtB,EAAqC;AACnC;AACD;;AAED;AACA,MAAI,CAAC/b,SAAD,IAAc,CAACA,UAAUgW,SAA7B,EAAwC;AACtC;AACD;;AAED,MAAMnX,cAAc,0BAASA,WAA7B;AACA;AACA,MAAMswB,sBAAsB,6BAAapT,aAAb,EAA4B,OAA5B,CAA5B;AACA,MAAMxD,YAAY4W,oBAAoB/uB,IAApB,CAAyB,CAAzB,CAAlB;;AAEA;AACA,MAAIoY,kBAAkBD,UAAUE,mBAAV,GAAgCzY,UAAUgW,SAAhE;;AAEA;AACAwC,oBAAkB7T,KAAKqN,GAAL,CAASrN,KAAKC,GAAL,CAAS4T,eAAT,EAA0B,CAA1B,CAAT,EAAuCD,UAAUI,QAAV,CAAmBnY,MAAnB,GAA4B,CAAnE,CAAlB;;AAEA;AACA,MAAI+X,UAAUE,mBAAV,KAAkCD,eAAtC,EAAuD;AACrD;AACD;;AAED,MAAMmD,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,MAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,MAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,MAAIiR,mBAAJ,EAAyB;AACvBA,wBAAoBI,aAApB;AACD;;AAED,MAAIlE,eAAJ;;AAEA,MAAIU,UAAU3B,YAAV,KAA2B,IAA/B,EAAqC;AACnCiB,aAAShZ,YAAYiZ,SAAZ,CAAsBS,UAAUI,QAAV,CAAmBH,eAAnB,CAAtB,CAAT;AACD,GAFD,MAEO;AACLX,aAAShZ,YAAYkZ,iBAAZ,CAA8BQ,UAAUI,QAAV,CAAmBH,eAAnB,CAA9B,CAAT;AACD;;AAEDX,SAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,QAAMqQ,WAAW3c,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAjB;;AAEAxD,cAAUE,mBAAV,GAAgCD,eAAhC;AACAiU,iBAAa3Q,YAAb,CAA0BC,aAA1B,EAAyC5Q,KAAzC,EAAgDqQ,QAAhD;AACA,QAAII,iBAAJ,EAAuB;AACrBA,wBAAkBG,aAAlB,EAAiC5Q,KAAjC;AACD;AACF,GARD,EAQG,UAAUkM,KAAV,EAAiB;AAClB,QAAM/K,UAAUiM,UAAUI,QAAV,CAAmBH,eAAnB,CAAhB;;AAEA,QAAIqD,mBAAJ,EAAyB;AACvBA,0BAAoBE,aAApB,EAAmCzP,OAAnC,EAA4C+K,KAA5C;AACD;AACF,GAdD;AAeD,C;;AAhED;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCKe,UAAUoV,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD;;AAEnE;AACA,MAAIA,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,MAAM7tB,cAAc,0BAASA,WAA7B;AACA,MAAMuwB,cAAcvwB,YAAYW,iBAAZ,CAA8BktB,aAA9B,EAA6CvhB,KAAjE;AACA,MAAM0iB,mBAAmBhvB,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CkvB,YAAY9iB,OAAzD,CAAzB;;AAEA,MAAIuhB,qBAAqBnuB,SAArB,IAAkCmuB,iBAAiBza,oBAAjB,KAA0C1T,SAAhF,EAA2F;AACzF;;AAEA;AACD;;AAED,MAAMouB,sBAAsB,+BAAiBD,iBAAiBza,oBAAlC,CAA5B;AACA,MAAM+b,sBAAsB,6BAAapT,aAAb,EAA4B,OAA5B,CAA5B;AACA,MAAMxD,YAAY4W,oBAAoB/uB,IAApB,CAAyB,CAAzB,CAAlB;;AAEA,MAAIivB,cAAcC,OAAOC,SAAzB;AACA,MAAI/W,kBAAkB,CAAC,CAAvB;;AAEAD,YAAUI,QAAV,CAAmBnU,OAAnB,CAA2B,UAAC8H,OAAD,EAAUjH,KAAV,EAAoB;AAC7C,QAAM4N,aAAapU,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CoM,OAA7C,CAAnB;;AAEA,QAAI2G,eAAevT,SAAf,IAA4BuT,WAAWG,oBAAX,KAAoC1T,SAApE,EAA+E;AAC7E;;AAEA;AACD;;AAED,QAAM8vB,gBAAgB,+BAAiBvc,WAAWG,oBAA5B,CAAtB;AACA,QAAMhM,WAAWooB,cAAcC,iBAAd,CAAgC3B,mBAAhC,CAAjB;AACA;;AAEA,QAAI1mB,WAAWioB,WAAf,EAA4B;AAC1BA,oBAAcjoB,QAAd;AACAoR,wBAAkBnT,KAAlB;AACD;AACF,GAjBD;;AAmBA,MAAImT,oBAAoBD,UAAUE,mBAAlC,EAAuD;AACrD;AACD;;AAED,MAAMkD,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,MAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,MAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,MAAIiR,mBAAJ,EAAyB;AACvBA,wBAAoBI,aAApB;AACD;;AAED,MAAIvD,oBAAoB,CAAC,CAAzB,EAA4B;AAC1B,QAAIX,eAAJ;;AAEA,QAAIU,UAAU3B,YAAV,KAA2B,IAA/B,EAAqC;AACnCiB,eAAShZ,YAAYiZ,SAAZ,CAAsBS,UAAUI,QAAV,CAAmBH,eAAnB,CAAtB,CAAT;AACD,KAFD,MAEO;AACLX,eAAShZ,YAAYkZ,iBAAZ,CAA8BQ,UAAUI,QAAV,CAAmBH,eAAnB,CAA9B,CAAT;AACD;;AAEDX,WAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,UAAMqQ,WAAW3c,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAjB;;AAEAxD,gBAAUE,mBAAV,GAAgCD,eAAhC;AACAiU,mBAAa3Q,YAAb,CAA0BC,aAA1B,EAAyC5Q,KAAzC,EAAgDqQ,QAAhD;AACA,UAAII,iBAAJ,EAAuB;AACrBA,0BAAkBG,aAAlB,EAAiC5Q,KAAjC;AACD;AACF,KARD,EAQG,UAAUkM,KAAV,EAAiB;AAClB,UAAM/K,UAAUiM,UAAUI,QAAV,CAAmBH,eAAnB,CAAhB;;AAEA,UAAIqD,mBAAJ,EAAyB;AACvBA,4BAAoBE,aAApB,EAAmCzP,OAAnC,EAA4C+K,KAA5C;AACD;AACF,KAdD;AAeD;AACF,C;;AAvFD;;;;AACA;;AACA;;;;AACA;;;;;;;;;;;;;;;;;kBCOe,UAAUoV,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD/b,SAAtD,EAAiEsuB,kBAAjE,EAAqF;;AAElG;AACA,MAAIvS,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,MAAM7tB,cAAc,0BAASA,WAA7B;AACA,MAAM8uB,uBAAuB9uB,YAAYW,iBAAZ,CAA8BktB,aAA9B,CAA7B;AACA,MAAMmB,mBAAmBhvB,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CytB,qBAAqBxiB,KAArB,CAA2BmB,OAAxE,CAAzB;AACA,MAAMwhB,sBAAsB,+BAAiBD,iBAAiBza,oBAAlC,CAA5B;;AAEA,MAAM+b,sBAAsB,6BAAapT,aAAb,EAA4B,OAA5B,CAA5B;AACA,MAAMxD,YAAY4W,oBAAoB/uB,IAApB,CAAyB,CAAzB,CAAlB;;AAEA,MAAIivB,cAAcC,OAAOC,SAAzB;AACA,MAAI/W,kBAAkB,CAAC,CAAvB;;AAEA,MAAI,CAAC8V,kBAAL,EAAyB;AACvB;AACD;;AAED,MAAMoB,gBAAgB5B,oBAAoBza,KAApB,GAA4BvT,GAA5B,CAAgCwuB,kBAAhC,CAAtB;;AAEA/V,YAAUI,QAAV,CAAmBnU,OAAnB,CAA2B,UAAU8H,OAAV,EAAmBjH,KAAnB,EAA0B;AACnD,QAAM4N,aAAapU,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CoM,OAA7C,CAAnB;AACA,QAAMkjB,gBAAgB,+BAAiBvc,WAAWG,oBAA5B,CAAtB;AACA,QAAMhM,WAAWsoB,cAAcD,iBAAd,CAAgCD,aAAhC,CAAjB;;AAEA,QAAIpoB,WAAWioB,WAAf,EAA4B;AAC1BA,oBAAcjoB,QAAd;AACAoR,wBAAkBnT,KAAlB;AACD;AACF,GATD;;AAWA,MAAImT,oBAAoBD,UAAUE,mBAA9B,IAAqDD,oBAAoB,CAAC,CAA9E,EAAiF;AAC/E;AACD;;AAED,MAAMmD,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,MAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,MAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,MAAIiR,mBAAJ,EAAyB;AACvBA,wBAAoBI,aAApB;AACD;;AAED,MAAIlE,eAAJ;;AAEA,MAAIU,UAAU3B,YAAV,KAA2B,IAA/B,EAAqC;AACnCiB,aAAShZ,YAAYiZ,SAAZ,CAAsBS,UAAUI,QAAV,CAAmBH,eAAnB,CAAtB,CAAT;AACD,GAFD,MAEO;AACLX,aAAShZ,YAAYkZ,iBAAZ,CAA8BQ,UAAUI,QAAV,CAAmBH,eAAnB,CAA9B,CAAT;AACD;;AAEDX,SAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,QAAMqQ,WAAW3c,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAjB;;AAEAxD,cAAUE,mBAAV,GAAgCD,eAAhC;AACAiU,iBAAa3Q,YAAb,CAA0BC,aAA1B,EAAyC5Q,KAAzC,EAAgDqQ,QAAhD;AACA,QAAII,iBAAJ,EAAuB;AACrBA,wBAAkBG,aAAlB,EAAiC5Q,KAAjC;AACD;AACF,GARD,EAQG,UAAUkM,KAAV,EAAiB;AAClB,QAAM/K,UAAUiM,UAAUI,QAAV,CAAmBH,eAAnB,CAAhB;;AAEA,QAAIqD,mBAAJ,EAAyB;AACvBA,0BAAoBE,aAApB,EAAmCzP,OAAnC,EAA4C+K,KAA5C;AACD;AACF,GAdD;AAeD,C;;AAhFD;;;;AACA;;AACA;;;;AACA;;;;;;;;;;;;;;;;;kBCGe,UAAUoV,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD;;AAEnE;AACA,MAAIA,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,MAAM7tB,cAAc,0BAASA,WAA7B;AACA,MAAM8wB,4BAA4B,6BAAajD,aAAb,EAA4B,OAA5B,CAAlC;AACA,MAAMkD,kBAAkBD,0BAA0BvvB,IAA1B,CAA+B,CAA/B,CAAxB;AACA,MAAMyvB,4BAA4B,6BAAa9T,aAAb,EAA4B,OAA5B,CAAlC;AACA,MAAM+T,kBAAkBD,0BAA0BzvB,IAA1B,CAA+B,CAA/B,CAAxB;;AAEA,MAAIoY,kBAAkBoX,gBAAgBnX,mBAAtC;;AAEA;AACAD,oBAAkB7T,KAAKqN,GAAL,CAASrN,KAAKC,GAAL,CAAS4T,eAAT,EAA0B,CAA1B,CAAT,EAAuCsX,gBAAgBnX,QAAhB,CAAyBnY,MAAzB,GAAkC,CAAzE,CAAlB;;AAEA;AACA,MAAIgY,oBAAoBsX,gBAAgBrX,mBAAxC,EAA6D;AAC3D;AACD;;AAED,MAAMkD,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,MAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,MAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,MAAIiR,mBAAJ,EAAyB;AACvBA,wBAAoBI,aAApB;AACD;;AAED,MAAIlE,eAAJ;;AAEA,MAAIiY,gBAAgBlZ,YAAhB,KAAiC,IAArC,EAA2C;AACzCiB,aAAShZ,YAAYiZ,SAAZ,CAAsBgY,gBAAgBnX,QAAhB,CAAyBH,eAAzB,CAAtB,CAAT;AACD,GAFD,MAEO;AACLX,aAAShZ,YAAYkZ,iBAAZ,CAA8B+X,gBAAgBnX,QAAhB,CAAyBH,eAAzB,CAA9B,CAAT;AACD;;AAEDX,SAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,QAAMqQ,WAAW3c,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAjB;;AAEA+T,oBAAgBrX,mBAAhB,GAAsCD,eAAtC;AACAiU,iBAAa3Q,YAAb,CAA0BC,aAA1B,EAAyC5Q,KAAzC,EAAgDqQ,QAAhD;AACA,QAAII,iBAAJ,EAAuB;AACrBA,wBAAkBG,aAAlB,EAAiC5Q,KAAjC;AACD;AACF,GARD,EAQG,UAAUkM,KAAV,EAAiB;AAClB,QAAM/K,UAAUwjB,gBAAgBnX,QAAhB,CAAyBH,eAAzB,CAAhB;;AAEA,QAAIqD,mBAAJ,EAAyB;AACvBA,0BAAoBE,aAApB,EAAmCzP,OAAnC,EAA4C+K,KAA5C;AACD;AACF,GAdD;AAeD,C;;AA5DD;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCCe,UAAUoV,YAAV,EAAwBC,aAAxB,EAAuC3Q,aAAvC,EAAsD;;AAEnE;AACA,MAAIA,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,MAAM7tB,cAAc,0BAASA,WAA7B;AACA;AACA,MAAM8tB,iBAAiB9tB,YAAY4c,WAAZ,CAAwBiR,aAAxB,CAAvB;AACA,MAAME,iBAAiB/tB,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAvB;;AAEA;AACA,MAAI6Q,eAAezP,KAAf,KAAyBwP,eAAexP,KAAxC,IAAiDyP,eAAemD,WAAf,CAA2BzsB,CAA3B,KAAiCqpB,eAAeoD,WAAf,CAA2BzsB,CAA7G,IAAkHspB,eAAemD,WAAf,CAA2BxsB,CAA3B,KAAiCopB,eAAeoD,WAAf,CAA2BxsB,CAAlL,EAAqL;AACnL;AACD;;AAED;AACAqpB,iBAAezP,KAAf,GAAuBwP,eAAexP,KAAtC;AACAyP,iBAAemD,WAAf,CAA2BzsB,CAA3B,GAA+BqpB,eAAeoD,WAAf,CAA2BzsB,CAA1D;AACAspB,iBAAemD,WAAf,CAA2BxsB,CAA3B,GAA+BopB,eAAeoD,WAAf,CAA2BxsB,CAA1D;AACAkpB,eAAaO,WAAb,CAAyBjR,aAAzB,EAAwC6Q,cAAxC;AACD,C;;AAzBD;;;;;;;;;;;;;;;;;;ACAA;;AACA;;AAEA;AACA;AACA,SAAS5G,qCAAT,CAAgDgK,SAAhD,EAA2DC,eAA3D,EAA4E;AAC1E,MAAM7jB,YAAY,EAAlB;;AAEA;AACA;AACA,WAAS8jB,yBAAT,CAAoC5wB,OAApC,EAA6CM,QAA7C,EAAuDQ,IAAvD,EAA6D;AAC3D;AACA,QAAI4vB,UAAU5B,OAAV,CAAkBxuB,QAAlB,KAA+B,CAAnC,EAAsC;;AAEpC;AACA,UAAIwM,UAAUS,cAAV,CAAyBjN,QAAzB,MAAuC,KAA3C,EAAkD;AAChDwM,kBAAUxM,QAAV,IAAsB;AACpBQ,gBAAM;AADc,SAAtB;AAGD;;AAED,UAAMC,WAAW+L,UAAUxM,QAAV,CAAjB;;AAEA;AACAS,eAASD,IAAT,CAAc0M,IAAd,CAAmB1M,IAAnB;AACD,KAbD,MAaO;AACL;AACA,aAAO6vB,gBAAgBnwB,GAAhB,CAAoBR,OAApB,EAA6BM,QAA7B,EAAuCQ,IAAvC,CAAP;AACD;AACF;;AAED;AACA;AACA,WAAS+vB,yBAAT,CAAoC7wB,OAApC,EAA6CM,QAA7C,EAAuD;AACrD;AACA,QAAIowB,UAAU5B,OAAV,CAAkBxuB,QAAlB,KAA+B,CAAnC,EAAsC;AACpC;AACA,UAAIwM,UAAUS,cAAV,CAAyBjN,QAAzB,MAAuC,KAA3C,EAAkD;AAChDwM,kBAAUxM,QAAV,IAAsB;AACpBQ,gBAAM;AADc,SAAtB;AAGD;;AAED,aAAOgM,UAAUxM,QAAV,CAAP;AACD;;AAED;AACA,WAAOqwB,gBAAgB/vB,GAAhB,CAAoBZ,OAApB,EAA6BM,QAA7B,CAAP;AACD;;AAED,MAAMwwB,0BAA0B;AAC9BlwB,SAAKiwB,yBADyB;AAE9BrwB,SAAKowB;AAFyB,GAAhC;;AAMA,SAAOE,uBAAP;AACD;;AAED,IAAMC,0BAA0B,EAAhC;;AAEA,SAAStK,yBAAT,CAAoCzmB,OAApC,EAA6CgxB,KAA7C,EAAoD;AAClDA,UAAQA,SAAS,CAAC,YAAD,CAAjB;AACA,MAAIL,kBAAkB,2CAA2B3wB,OAA3B,CAAtB;;AAEA,MAAI2wB,oBAAoBvwB,SAAxB,EAAmC;AACjCuwB;AACD;;AAED,MAAMM,iCAAiCvK,sCAAsCsK,KAAtC,EAA6CL,eAA7C,CAAvC;;AAEAI,0BAAwBvjB,IAAxB,CAA6ByjB,8BAA7B;AACA,6CAA2BjxB,OAA3B,EAAoCixB,8BAApC;AACD;;QAGCxK,yB,GAAAA,yB;QACAC,qC,GAAAA,qC;;;;;;;;;;;;;;AC7EF;;AACA;;AAEA;AACA;AACA,SAASE,gCAAT,CAA2C8J,SAA3C,EAAsDC,eAAtD,EAAuE;AACrE,MAAI7jB,YAAY,EAAhB;;AAEA,WAASK,aAAT,GAA0B;AACxB,WAAOL,SAAP;AACD;;AAED,WAASM,gBAAT,CAA2B8jB,cAA3B,EAA2C;AACzCpkB,gBAAYokB,cAAZ;AACD;;AAED;AACA;AACA,WAASN,yBAAT,CAAoC5wB,OAApC,EAA6CM,QAA7C,EAAuDQ,IAAvD,EAA6D;AAC3D;AACA,QAAI4vB,UAAU5B,OAAV,CAAkBxuB,QAAlB,KAA+B,CAAnC,EAAsC;;AAEpC;AACA,UAAIwM,UAAUS,cAAV,CAAyBjN,QAAzB,MAAuC,KAA3C,EAAkD;AAChDwM,kBAAUxM,QAAV,IAAsB;AACpBQ,gBAAM;AADc,SAAtB;AAGD;;AAED,UAAMC,WAAW+L,UAAUxM,QAAV,CAAjB;;AAEA;AACAS,eAASD,IAAT,CAAc0M,IAAd,CAAmB1M,IAAnB;AACD,KAbD,MAaO;AACL;AACA,aAAO6vB,gBAAgBnwB,GAAhB,CAAoBR,OAApB,EAA6BM,QAA7B,EAAuCQ,IAAvC,CAAP;AACD;AACF;;AAED;AACA;AACA,WAAS+vB,yBAAT,CAAoC7wB,OAApC,EAA6CM,QAA7C,EAAuD;AACrD;AACA,QAAIowB,UAAU5B,OAAV,CAAkBxuB,QAAlB,KAA+B,CAAnC,EAAsC;AACpC;AACA,UAAIwM,UAAUS,cAAV,CAAyBjN,QAAzB,MAAuC,KAA3C,EAAkD;AAChDwM,kBAAUxM,QAAV,IAAsB;AACpBQ,gBAAM;AADc,SAAtB;AAGD;;AAED,aAAOgM,UAAUxM,QAAV,CAAP;AACD;;AAED;AACA,WAAOqwB,gBAAgB/vB,GAAhB,CAAoBZ,OAApB,EAA6BM,QAA7B,CAAP;AAED;;AAED,MAAM6wB,gCAAgC;AACpCvwB,SAAKiwB,yBAD+B;AAEpCrwB,SAAKowB,yBAF+B;AAGpCzjB,gCAHoC;AAIpCC,sCAJoC;AAKpCN;AALoC,GAAtC;;AASA,SAAOqkB,6BAAP;AACD;;AAED,IAAMC,qBAAqB,EAA3B;;AAEA,SAASvK,oBAAT,CAA+B7mB,OAA/B,EAAwCqxB,UAAxC,EAAoD;AAClD,MAAIV,kBAAkB,2CAA2B3wB,OAA3B,CAAtB;;AAEA,MAAI,CAAC2wB,eAAL,EAAsB;AACpBA;AACD;;AAED,MAAIW,aAAa,CAAC,OAAD,EAAU,eAAV,EAA2B,UAA3B,EAAuC,QAAvC,EAAiD,MAAjD,EAAyD,gBAAzD,EAA2E,YAA3E,EAAyF,eAAzF,CAAjB;;AAEA,MAAID,UAAJ,EAAgB;AACdC,iBAAaA,WAAW3B,MAAX,CAAkB0B,UAAlB,CAAb;AACD;;AAED,MAAM1K,4BAA4BC,iCAAiC0K,UAAjC,EAA6CX,eAA7C,CAAlC;;AAEAS,qBAAmB5jB,IAAnB,CAAwBmZ,yBAAxB;AACA,6CAA2B3mB,OAA3B,EAAoC2mB,yBAApC;AACD;;AAED,IAAMA,4BAA4B;AAChCC,oEADgC;AAEhCC;AAFgC,CAAlC;;QAMEF,yB,GAAAA,yB;QACAC,gC,GAAAA,gC;QACAC,oB,GAAAA,oB;;;;;;;;;;;;ACpGF;AACA;AACA;;AAEA,SAASC,2CAAT,GAAwD;AACtD,MAAMha,YAAY,EAAlB;;AAEA;AACA;AACA,WAASykB,oCAAT,CAA+CC,gBAA/C,EAAiElxB,QAAjE,EAA2EQ,IAA3E,EAAiF;AAC/E;AACA,QAAIgM,UAAUS,cAAV,CAAyBikB,gBAAzB,MAA+C,KAAnD,EAA0D;AACxD1kB,gBAAU0kB,gBAAV,IAA8B,EAA9B;AACD;;AAED,QAAMC,4BAA4B3kB,UAAU0kB,gBAAV,CAAlC;;AAEA;AACA,QAAIC,0BAA0BlkB,cAA1B,CAAyCjN,QAAzC,MAAuD,KAA3D,EAAkE;AAChEmxB,gCAA0BnxB,QAA1B,IAAsC;AACpCQ,cAAM;AAD8B,OAAtC;AAGD;;AAED,QAAMC,WAAW0wB,0BAA0BnxB,QAA1B,CAAjB;;AAEA;AACAS,aAASD,IAAT,CAAc0M,IAAd,CAAmB1M,IAAnB;AACD;;AAED;AACA;AACA,WAAS4wB,oCAAT,CAA+CF,gBAA/C,EAAiElxB,QAAjE,EAA2E;AACzE;AACA,QAAIwM,UAAUS,cAAV,CAAyBikB,gBAAzB,MAA+C,KAAnD,EAA0D;AACxD;AACD;;AAED,QAAMC,4BAA4B3kB,UAAU0kB,gBAAV,CAAlC;;AAEA;AACA,QAAIC,0BAA0BlkB,cAA1B,CAAyCjN,QAAzC,MAAuD,KAA3D,EAAkE;AAChE;AACD;;AAED,QAAMS,WAAW0wB,0BAA0BnxB,QAA1B,CAAjB;;AAGA,WAAOS,QAAP;AACD;;AAED,WAAS4wB,uCAAT,CAAkDH,gBAAlD,EAAoElxB,QAApE,EAA8EQ,IAA9E,EAAoF;AAClF;AACA,QAAIgM,UAAUS,cAAV,CAAyBikB,gBAAzB,MAA+C,KAAnD,EAA0D;AACxD;AACD;;AAED,QAAMC,4BAA4B3kB,UAAU0kB,gBAAV,CAAlC;;AAEA;AACA,QAAIC,0BAA0BlkB,cAA1B,CAAyCjN,QAAzC,MAAuD,KAA3D,EAAkE;AAChE;AACD;;AAED,QAAMS,WAAW0wB,0BAA0BnxB,QAA1B,CAAjB;AACA;AACA,QAAIU,cAAc,CAAC,CAAnB;;AAEA,SAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C,UAAIF,SAASD,IAAT,CAAcG,CAAd,MAAqBH,IAAzB,EAA+B;AAC7BE,sBAAcC,CAAd;AACD;AACF;;AAED,QAAID,gBAAgB,CAAC,CAArB,EAAwB;AACtBD,eAASD,IAAT,CAAcK,MAAd,CAAqBH,WAArB,EAAkC,CAAlC;AACD;AACF;;AAED,SAAO;AACLJ,SAAK8wB,oCADA;AAELlxB,SAAK+wB,oCAFA;AAGLvF,YAAQ2F;AAHH,GAAP;AAKD;;AAED;AACA;AACA,IAAM5K,iDAAiDD,6CAAvD;;QAGEA,2C,GAAAA,2C;QACAC,8C,GAAAA,8C;;;;;;;;;;;;;AC5FF;;;;AACA;;AACA;;;;AAEA,SAAS6K,oBAAT,CAA+BnC,QAA/B,EAAyC;AACvC;AACA,MAAMoC,WAAW;AACf3kB,sBAAkB,mEAAsCC,aAAtC,EADH;AAEf2kB,sBAAkB,EAFH;AAGfC,qBAAiB;AAHF,GAAjB;;AAME;AACFtC,WAASvqB,OAAT,CAAiB,UAAUlF,OAAV,EAAmB;AAClC,QAAMG,mBAAmB,2CAA2BH,OAA3B,CAAzB;;AAEA,QAAIG,uFAAJ,EAAgE;AAC9D;AACD;;AAED0xB,aAASC,gBAAT,CAA0B9xB,QAAQgyB,EAAlC,IAAwC7xB,iBAAiBgN,aAAjB,EAAxC;;AAEA0kB,aAASE,eAAT,CAAyB/xB,QAAQgyB,EAAjC,IAAuC,0BAASzyB,WAAT,CAAqB4c,WAArB,CAAiCnc,OAAjC,CAAvC;AACD,GAVD;;AAYA,SAAO6xB,QAAP;AACD;;AAED,SAASI,uBAAT,CAAkCJ,QAAlC,EAA4C;AAC1C,MAAI,CAACA,SAAStkB,cAAT,CAAwB,kBAAxB,CAAD,IACE,CAACskB,SAAStkB,cAAT,CAAwB,kBAAxB,CADH,IAEE,CAACskB,SAAStkB,cAAT,CAAwB,iBAAxB,CAFP,EAEmD;AACjD;AACD;;AAED,MAAMhO,cAAc,0BAASA,WAA7B;;AAEA;AACA,qEAAsC6N,gBAAtC,CAAuDykB,SAAS3kB,gBAAhE;;AAEA/I,SAAO2C,IAAP,CAAY+qB,SAASE,eAArB,EAAsC7sB,OAAtC,CAA8C,UAAUgtB,SAAV,EAAqB;AACjE;AACA,QAAMlyB,UAAUiC,SAASkwB,cAAT,CAAwBD,SAAxB,CAAhB;;AAEA,QAAI,CAAClyB,OAAL,EAAc;AACZ;AACD;;AAED,QAAI,CAAC6xB,SAASC,gBAAT,CAA0BvkB,cAA1B,CAAyC2kB,SAAzC,CAAL,EAA0D;AACxD;AACD;;AAED,QAAM/xB,mBAAmB,2CAA2BH,OAA3B,CAAzB;;AAEA,QAAIG,uFAAJ,EAAgE;AAC9D;AACD;;AAEDA,qBAAiBiN,gBAAjB,CAAkCykB,SAASC,gBAAT,CAA0BI,SAA1B,CAAlC;;AAEA;AACA,QAAME,gBAAgBP,SAASE,eAAT,CAAyBG,SAAzB,CAAtB;;AAEA3yB,gBAAYmuB,WAAZ,CAAwB1tB,OAAxB,EAAiCoyB,aAAjC;;AAEA;AACA7yB,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,GA3BD;;AA6BA,SAAO6xB,QAAP;AACD;;AAED,IAAMA,WAAW;AACf/sB,QAAM8sB,oBADS;AAEf3rB,WAASgsB;AAFM,CAAjB;;kBAKeJ,Q;;;;;;;;;;;;;AC7Ef;;;;AACA;;;;;;AAEA,IAAM/qB,OAAO;AACXurB,MAAI,EADO;AAEXC,QAAM;AAFK,CAAb;;AAKA,SAAStR,eAAT,CAA0B5Z,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAM6xB,UAAU7xB,UAAU6xB,OAA1B;;AAEA,MAAIA,YAAYzrB,KAAKurB,EAAjB,IAAuBE,YAAYzrB,KAAKwrB,IAA5C,EAAkD;AAChD;AACD;;AAED,MAAIvZ,SAAS,CAAb;;AAEA,MAAIwZ,YAAYzrB,KAAKwrB,IAArB,EAA2B;AACzBvZ,aAAS,CAAC,CAAV;AACD;;AAED,wBAAOrY,UAAUV,OAAjB,EAA0B+Y,MAA1B;AACD;;AAED;AACA,IAAMyZ,sBAAsB,4BAAaxR,eAAb,CAA5B;;kBAEewR,mB;;;;;;;;;;;;;AC3Bf;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;AAEA,IAAMlyB,WAAW,eAAjB;AACA,IAAMmyB,cAAc,UAApB;;AAEA,IAAItsB,gBAAgB;AAClBusB,uBAAqBC;AADH,CAApB;;AAIA,IAAIC,6BAAJ;AACA,IAAMC,qBAAqB,EAA3B;;AAEA,SAASC,KAAT,CAAgBC,MAAhB,EAAwBC,OAAxB,EAAiC;AAC/B;AACA;AACAD,WAAS1tB,KAAKqU,KAAL,CAAWqZ,MAAX,KAAsB,CAA/B;AACAC,YAAU3tB,KAAKqU,KAAL,CAAWsZ,OAAX,KAAuB,CAAjC;;AAEA,MAAMC,MAAM,EAAZ;AACA,MAAIC,IAAIF,UAAUD,MAAV,GAAmB,CAA3B;;AAEA,MAAIG,KAAK,CAAT,EAAY;AACV,WAAOD,GAAP;AACD;;AAED,SAAOC,GAAP,EAAY;AACVD,QAAIC,CAAJ,IAASF,SAAT;AACD;;AAED,SAAOC,GAAP;AACD;;AAED,IAAM3tB,MAAM,SAANA,GAAM,CAAU2tB,GAAV,EAAe;AACzB,SAAO5tB,KAAKC,GAAL,CAAS6tB,KAAT,CAAe,IAAf,EAAqBF,GAArB,CAAP;AACD,CAFD;;AAIA,IAAMvgB,MAAM,SAANA,GAAM,CAAUugB,GAAV,EAAe;AACzB,SAAO5tB,KAAKqN,GAAL,CAASygB,KAAT,CAAe,IAAf,EAAqBF,GAArB,CAAP;AACD,CAFD;;AAIA,SAASG,YAAT,CAAuBH,GAAvB,EAA4BjvB,CAA5B,EAA+B;AAC7B;AACA;AACA,MAAMqvB,IAAI,EAAV;AACA,MAAM5T,IAAI,EAAV;;AAEAwT,MAAI/tB,OAAJ,CAAY,UAAUouB,CAAV,EAAa;AACvB,QAAIA,IAAItvB,CAAR,EAAW;AACTqvB,QAAE7lB,IAAF,CAAO8lB,CAAP;AACD,KAFD,MAEO,IAAIA,IAAItvB,CAAR,EAAW;AAChByb,QAAEjS,IAAF,CAAO8lB,CAAP;AACD;AACF,GAND;;AAQA,SAAO;AACLC,SAAKN,IAAInE,OAAJ,CAAYxpB,IAAI+tB,CAAJ,CAAZ,CADA;AAELG,UAAMP,IAAInE,OAAJ,CAAYpc,IAAI+M,CAAJ,CAAZ;AAFD,GAAP;AAID;;AAED,SAASzI,QAAT,CAAmBhX,OAAnB,EAA4B;AAC1B;AACA,MAAMiZ,YAAY,6BAAajZ,OAAb,EAAsB,OAAtB,CAAlB;;AAEA,MAAI,CAACiZ,SAAD,IAAc,CAACA,UAAUnY,IAAzB,IAAiC,CAACmY,UAAUnY,IAAV,CAAeI,MAArD,EAA6D;AAC3D;AACD;;AAED,MAAM6pB,QAAQ9R,UAAUnY,IAAV,CAAe,CAAf,CAAd;;AAEA;AACA,MAAM2yB,oBAAoB,6BAAazzB,OAAb,EAAsBM,QAAtB,CAA1B;;AAEA,MAAI,CAACmzB,iBAAL,EAAwB;AACtB;AACD;;AAED,MAAMC,gBAAgBD,kBAAkB3yB,IAAlB,CAAuB,CAAvB,KAA6B,EAAnD;;AAEA;AACA,MAAI,CAAC4yB,cAAcC,gBAAf,IAAmC,CAACD,cAAcC,gBAAd,CAA+BzyB,MAAvE,EAA+E;AAC7EwyB,kBAAcE,OAAd,GAAwB,KAAxB;AACD;;AAED;AACA,MAAIF,cAAcE,OAAd,KAA0B,KAA9B,EAAqC;AACnC;AACD;;AAED;AACA;AACA,WAASC,cAAT,CAAyB7I,YAAzB,EAAuC;AACrC,QAAMjlB,QAAQ2tB,cAAcC,gBAAd,CAA+B7E,OAA/B,CAAuC9D,YAAvC,CAAd;;AAEA,QAAIjlB,QAAQ,CAAC,CAAb,EAAgB;AAAE;AAChB2tB,oBAAcC,gBAAd,CAA+BxyB,MAA/B,CAAsC4E,KAAtC,EAA6C,CAA7C;AACD;AACF;;AAED;AACA;AACA0tB,oBAAkB3yB,IAAlB,CAAuB,CAAvB,EAA0B6yB,gBAA1B,CAA2CG,IAA3C,CAAgD,UAACC,CAAD,EAAIC,CAAJ;AAAA,WAAWD,IAAIC,CAAf;AAAA,GAAhD;AACA,MAAMC,uBAAuBP,cAAcC,gBAAd,CAA+BviB,KAA/B,EAA7B;;AAEA6iB,uBAAqB/uB,OAArB,CAA6B,UAAU8lB,YAAV,EAAwB;AACnD,QAAMhe,UAAU+d,MAAM1R,QAAN,CAAe2R,YAAf,CAAhB;;AAEA,QAAI,CAAChe,OAAL,EAAc;AACZ;AACD;;AAED,QAAM2K,eAAe,0BAASpY,WAAT,CAAqBqY,UAArB,CAAgCC,eAAhC,CAAgD7K,OAAhD,CAArB;;AAEA,QAAI2K,gBAAgBA,aAAa0G,KAAb,OAAyB,UAA7C,EAAyD;AACvDwV,qBAAe7I,YAAf;AACD;AACF,GAZD;;AAcA;AACA;AACA,MAAI,CAAC0I,cAAcC,gBAAd,CAA+BzyB,MAApC,EAA4C;AAC1C;AACD;;AAED;AACA,+BAAmB8W,iBAAnB,CAAqCya,WAArC;;AAEA;AACA,MAAMyB,UAAUd,aAAaM,cAAcC,gBAA3B,EAA6C5I,MAAM5R,mBAAnD,CAAhB;;AAEA,MAAInM,gBAAJ;AACA,MAAImnB,yBAAJ;AACA,MAAM7c,eAAe,KAArB;;AAEA,WAASC,YAAT,CAAuB1L,KAAvB,EAA8B;AAC5B;AACA,QAAMmf,eAAeD,MAAM1R,QAAN,CAAeyV,OAAf,CAAuBjjB,MAAMmB,OAA7B,CAArB;;AAEA6mB,mBAAe7I,YAAf;AACD;;AAED;AACA,MAAMzO,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,WAASoM,YAAT,CAAuBO,KAAvB,EAA8B;AAC5BgK,YAAQrS,GAAR,wBAAiCqI,KAAjC;AACA,QAAIwE,mBAAJ,EAAyB;AACvBA,0BAAoBvc,OAApB,EAA6BgN,OAA7B,EAAsC+K,KAAtC,EAA6C,eAA7C;AACD;AACF;;AAED;AACA,MAAIqc,aAAaF,QAAQX,GAAzB;AACA,MAAIc,cAAcH,QAAQV,IAA1B;;AAEA,SAAOY,cAAc,CAAd,IAAmBC,cAAcX,cAAcC,gBAAd,CAA+BzyB,MAAvE,EAA+E;AAC7E,QAAMozB,eAAevJ,MAAM5R,mBAA3B;AACA,QAAMob,kBAAkBD,eAAeZ,cAAcC,gBAAd,CAA+BS,UAA/B,CAAf,GAA4DjuB,cAAcusB,mBAAlG;AACA,QAAM8B,mBAAmBd,cAAcC,gBAAd,CAA+BU,WAA/B,IAA8CC,YAA9C,GAA6DnuB,cAAcusB,mBAApG;;AAEA,QAAM+B,kBAAkB,CAACF,eAAD,IAAoBH,cAAc,CAA1D;AACA,QAAMM,mBAAmB,CAACF,gBAAD,IAAqBH,cAAcX,cAAcC,gBAAd,CAA+BzyB,MAA3F;;AAEA,QAAI,CAACwzB,gBAAD,IAAqB,CAACD,eAA1B,EAA2C;AACzC;AACD;;AAED,QAAIA,eAAJ,EAAqB;AACnBN,yBAAmBT,cAAcC,gBAAd,CAA+BS,YAA/B,CAAnB;AACApnB,gBAAU+d,MAAM1R,QAAN,CAAe8a,gBAAf,CAAV;AACA,mCAAmB9c,UAAnB,CAA8BrX,OAA9B,EAAuCgN,OAAvC,EAAgDylB,WAAhD,EAA6Dnb,YAA7D,EAA2EC,YAA3E,EAAyFC,YAAzF;AACD;;AAED,QAAIkd,gBAAJ,EAAsB;AACpBP,yBAAmBT,cAAcC,gBAAd,CAA+BU,aAA/B,CAAnB;AACArnB,gBAAU+d,MAAM1R,QAAN,CAAe8a,gBAAf,CAAV;AACA,mCAAmB9c,UAAnB,CAA8BrX,OAA9B,EAAuCgN,OAAvC,EAAgDylB,WAAhD,EAA6Dnb,YAA7D,EAA2EC,YAA3E,EAAyFC,YAAzF;AACD;AAEF;;AAED;AACA;AACA,+BAAmBW,aAAnB;AACD;;AAED,SAASwc,wBAAT,CAAmC30B,OAAnC,EAA4C;AAC1C,SAAO,UAAUoH,CAAV,EAAa;AAClB,QAAM1G,YAAY0G,EAAExF,MAApB;;AAEA;AACA;AACA;AACA,QAAIqX,kBAAJ;;AAEA,QAAI;AACF;AACAA,kBAAY,6BAAajZ,OAAb,EAAsB,OAAtB,CAAZ;AACD,KAHD,CAGE,OAAM+X,KAAN,EAAa;AACb;AACD;;AAED,QAAI,CAACkB,SAAD,IAAc,CAACA,UAAUnY,IAAzB,IAAiC,CAACmY,UAAUnY,IAAV,CAAeI,MAArD,EAA6D;AAC3D;AACD;;AAED,QAAM6pB,QAAQ9R,UAAUnY,IAAV,CAAe,CAAf,CAAd;AACA,QAAMkqB,eAAeD,MAAM1R,QAAN,CAAeyV,OAAf,CAAuBpuB,UAAUsM,OAAjC,CAArB;;AAEA;AACA;AACA,QAAIge,eAAe,CAAnB,EAAsB;AACpB;AACD;;AAED,QAAMyI,oBAAoB,6BAAazzB,OAAb,EAAsBM,QAAtB,CAA1B;;AAEA,QAAI,CAACmzB,iBAAD,IAAsB,CAACA,kBAAkB3yB,IAAzC,IAAiD,CAAC2yB,kBAAkB3yB,IAAlB,CAAuBI,MAA7E,EAAqF;AACnF;AACD;;AAEDuyB,sBAAkB3yB,IAAlB,CAAuB,CAAvB,EAA0B6yB,gBAA1B,CAA2CnmB,IAA3C,CAAgDwd,YAAhD;AACD,GAnCD;AAoCD;;AAED,SAAS4J,cAAT,CAAyBxtB,CAAzB,EAA4B;AAC1B;AACA;AACAytB,eAAajC,oBAAb;AACAA,yBAAuB1a,WAAW,YAAY;AAC5C,QAAMlY,UAAUoH,EAAE0tB,MAAlB;;AAEA;AACA;AACA,QAAI;AACF9d,eAAShX,OAAT;AACD,KAFD,CAEE,OAAM+X,KAAN,EAAa;AACb;AACD;AAEF,GAXsB,EAWpB8a,kBAXoB,CAAvB;AAYD;;AAED,SAASxqB,MAAT,CAAiBrI,OAAjB,EAA0B;AACxB;AACA,MAAM+0B,yBAAyB,6BAAa/0B,OAAb,EAAsBM,QAAtB,CAA/B;;AAEAy0B,yBAAuBj0B,IAAvB,GAA8B,EAA9B;;AAEA;AACA,MAAMmY,YAAY,6BAAajZ,OAAb,EAAsB,OAAtB,CAAlB;;AAEA,MAAI,CAACiZ,SAAD,IAAc,CAACA,UAAUnY,IAAzB,IAAiC,CAACmY,UAAUnY,IAAV,CAAeI,MAArD,EAA6D;AAC3D;AACD;;AAED,MAAM6pB,QAAQ9R,UAAUnY,IAAV,CAAe,CAAf,CAAd;;AAEA;AACA,MAAIiqB,MAAMzT,YAAN,KAAuB,IAA3B,EAAiC;AAC/ByK,YAAQiT,IAAR,CAAa,+DAAb;;AAEA;AACD;;AAED;AACA,MAAMvB,oBAAoB;AACxBE,sBAAkBb,MAAM,CAAN,EAAS/H,MAAM1R,QAAN,CAAenY,MAAf,GAAwB,CAAjC,CADM;AAExB0yB,aAAS,IAFe;AAGxBld,eAAW;AAHa,GAA1B;;AAME;AACF,MAAMue,sBAAsBxB,kBAAkBE,gBAAlB,CAAmC7E,OAAnC,CAA2C/D,MAAM5R,mBAAjD,CAA5B;;AAEAsa,oBAAkBE,gBAAlB,CAAmCxyB,MAAnC,CAA0C8zB,mBAA1C,EAA+D,CAA/D;;AAEA,+BAAaj1B,OAAb,EAAsBM,QAAtB,EAAgCmzB,iBAAhC;;AAEAzc,WAAShX,OAAT;;AAEAA,UAAQmI,mBAAR,CAA4B,qBAA5B,EAAmDysB,cAAnD;AACA50B,UAAQsI,gBAAR,CAAyB,qBAAzB,EAAgDssB,cAAhD;;AAEA,MAAMM,wBAAwBP,yBAAyB30B,OAAzB,CAA9B;;AAEA,4BAAST,WAAT,CAAqBgM,MAArB,CAA4BpD,mBAA5B,CAAgD,qCAAhD,EAAuF+sB,qBAAvF;AACA,4BAAS31B,WAAT,CAAqBgM,MAArB,CAA4BjD,gBAA5B,CAA6C,qCAA7C,EAAoF4sB,qBAApF;AACD;;AAED,SAAShtB,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB60B,eAAajC,oBAAb;AACA5yB,UAAQmI,mBAAR,CAA4B,qBAA5B,EAAmDysB,cAAnD;;AAEA,MAAMM,wBAAwBP,yBAAyB30B,OAAzB,CAA9B;;AAEA,4BAAST,WAAT,CAAqBgM,MAArB,CAA4BpD,mBAA5B,CAAgD,qCAAhD,EAAuF+sB,qBAAvF;;AAEA,MAAMzB,oBAAoB,6BAAazzB,OAAb,EAAsBM,QAAtB,CAA1B;AACA;;AAEA,MAAImzB,qBAAqBA,kBAAkB3yB,IAAlB,CAAuBI,MAAhD,EAAwD;AACtDuyB,sBAAkB3yB,IAAlB,CAAuB,CAAvB,EAA0B8yB,OAA1B,GAAoC,KAApC;;AAEA;AACA,iCAAmB5b,iBAAnB,CAAqCya,WAArC;AACD;AACF;;AAED,SAAS/pB,gBAAT,GAA6B;AAC3B,SAAOvC,aAAP;AACD;;AAED,SAASwC,gBAAT,CAA2BC,MAA3B,EAAmC;AACjCzC,kBAAgByC,MAAhB;;AAEA,MAAIA,OAAOwH,uBAAX,EAAoC;AAClC,gEAA2BxH,OAAOwH,uBAAlC;AACD;AACF;;AAED;AACA,IAAMsjB,gBAAgB;AACpBrrB,gBADoB;AAEpBH,kBAFoB;AAGpBQ,oCAHoB;AAIpBC;AAJoB,CAAtB;;kBAOe+qB,a;;;;;;;;;;;;;AC7Uf;;;;AACA;;;;AAEA;;;AAGA,IAAMyB,kBAAkB,CAAxB;;AAEA,IAAMhvB,gBAAgB;AACpBvB,mBAAiB,kBADG;AAEpBjC,aAAW,OAFS;AAGpB4a,eAAa;AAHO,CAAtB;;AAMA,SAASnV,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAMV,UAAUU,UAAUV,OAA1B;AACA,MAAMyD,QAAQ/C,UAAU2Z,cAAV,CAAyB5S,MAAzB,CAAgChE,KAA9C;AACA,MAAMgC,SAAS/E,UAAU2Z,cAAV,CAAyB5S,MAAzB,CAAgChC,MAA/C;;AAEA,MAAI,CAAChC,KAAD,IAAU,CAACgC,MAAf,EAAuB;AACrB,WAAO,KAAP;AACD;;AAED,MAAM3B,UAAUpD,UAAU2Z,cAAV,CAAyB5S,MAAzB,CAAgCwiB,UAAhC,CAA2C,IAA3C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;AACAtZ,UAAQgB,IAAR;;AAEA,MAAM8D,SAASwsB,gBAAgB1sB,gBAAhB,EAAf;;AAEA;AACA5E,UAAQyB,SAAR,GAAoBqD,OAAOhE,eAA3B;AACA,MAAIgE,OAAO2U,WAAP,KAAuB,YAA3B,EAAyC;AACvCzZ,YAAQgC,QAAR,CAAiB,CAAjB,EAAoBL,SAAS0vB,eAA7B,EAA8C1xB,KAA9C,EAAqD0xB,eAArD;AACD,GAFD,MAEO;AACLrxB,YAAQgC,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBqvB,eAAvB,EAAwC1vB,MAAxC;AACD;;AAED;AACA,MAAMwT,YAAY,6BAAajZ,OAAb,EAAsB,OAAtB,CAAlB;;AAEA,MAAI,CAACiZ,SAAD,IAAc,CAACA,UAAUnY,IAAzB,IAAiC,CAACmY,UAAUnY,IAAV,CAAeI,MAArD,EAA6D;AAC3D;AACD;;AAED,MAAMmY,WAAWJ,UAAUnY,IAAV,CAAe,CAAf,EAAkBuY,QAAnC;AACA,MAAMF,sBAAsBF,UAAUnY,IAAV,CAAe,CAAf,EAAkBqY,mBAA9C;;AAEA;AACA,MAAMkc,cAAc5xB,QAAQ4V,SAASnY,MAArC;AACA,MAAMo0B,eAAe7vB,SAAS4T,SAASnY,MAAvC;AACA,MAAMq0B,YAAYF,cAAclc,mBAAhC;AACA,MAAMqc,YAAYF,eAAenc,mBAAjC;;AAEArV,UAAQyB,SAAR,GAAoBqD,OAAOjG,SAA3B;AACA,MAAIiG,OAAO2U,WAAP,KAAuB,YAA3B,EAAyC;AACvCzZ,YAAQgC,QAAR,CAAiByvB,SAAjB,EAA4B9vB,SAAS0vB,eAArC,EAAsDE,WAAtD,EAAmEF,eAAnE;AACD,GAFD,MAEO;AACLrxB,YAAQgC,QAAR,CAAiB,CAAjB,EAAoB0vB,SAApB,EAA+BL,eAA/B,EAAgDG,YAAhD;AACD;;AAEDxxB,UAAQmC,OAAR;AACD;;AAED,IAAMmvB,kBAAkB,2BAAYhtB,eAAZ,CAAxB;;AAEAgtB,gBAAgBzsB,gBAAhB,CAAiCxC,aAAjC;;kBAEeivB,e;;;;;;;;;;;;;ACpEf;;;;;;AAEA,IAAMK,iBAAiB,EAAvB;;AAEAA,eAAeC,cAAf;;kBAEeD,c;;;;;;;;;;;;;;;ACNf;;;;AACA;;;;;;IAEqBC,c;AACnB,4BAAe;AAAA;;AACb,SAAKvc,mBAAL,GAA2B,CAA3B;AACA,SAAKwc,QAAL,GAAgB,EAAhB;AACA,SAAKC,WAAL,GAAmBx1B,SAAnB;AACD;;;;2BAEOJ,O,EAAS61B,W,EAAa;AAAA;;AAC5B;AACA,UAAI,CAAC7F,OAAO8F,SAAP,CAAiB,KAAK3c,mBAAtB,CAAL,EAAiD;AAC/C,cAAM,IAAI1B,KAAJ,CAAU,2DAAV,CAAN;AACD;;AAED,UAAI,CAAC,KAAKme,WAAV,EAAuB;AACrB,cAAM,IAAIne,KAAJ,CAAU,wCAAV,CAAN;AACD;;AAED,UAAI,CAACoe,WAAL,EAAkB;AAChB,YAAM90B,WAAW,6BAAaf,OAAb,EAAsB,OAAtB,CAAjB;;AAEA61B,sBAAc90B,SAASD,IAAvB;AACD;AACD;;AAEA,UAAMvB,cAAc,0BAASA,WAA7B;;AAEA;AACA,UAAMw2B,kBAAkBF,YAAY,CAAZ,CAAxB;AACA,UAAMG,iBAAiBD,gBAAgB1c,QAAhB,CAAyB,KAAKF,mBAA9B,CAAvB;AACA,UAAM8c,qBAAqBJ,YAAYzkB,KAAZ,CAAkB,CAAlB,EAAqBykB,YAAY30B,MAAjC,CAA3B;;AAEA3B,kBAAYkZ,iBAAZ,CAA8Bud,cAA9B,EAA8Cle,IAA9C,CAAmD,UAACoe,SAAD,EAAe;AAChE,YAAIC,cAAc,MAAKR,QAAL,CAAc,CAAd,CAAlB;;AAEA;AACA,YAAIQ,WAAJ,EAAiB;AACf52B,sBAAY62B,aAAZ,CAA0Bp2B,OAA1B,EAAmCk2B,SAAnC,EAA8CC,WAA9C;AACD,SAFD,MAEO;AACL;AACAA,wBAAc52B,YAAY2lB,QAAZ,CAAqBllB,OAArB,EAA8Bk2B,SAA9B,EAAyCH,gBAAgB7xB,OAAzD,CAAd;AACA,gBAAKyxB,QAAL,CAAcnoB,IAAd,CAAmB2oB,WAAnB;AACD;;AAED;AACA52B,oBAAYid,YAAZ,CAAyBxc,OAAzB,EAAkCk2B,SAAlC;;AAEA;AACAD,2BAAmB/wB,OAAnB,CAA2B,UAACmxB,MAAD,EAASC,iBAAT,EAA+B;AACxD,cAAMtpB,UAAU,MAAK4oB,WAAL,CAAiBS,OAAOhd,QAAxB,EAAkC2c,cAAlC,CAAhB;AACA,cAAMO,aAAaD,oBAAoB,CAAvC;AACA,cAAIE,iBAAiB,MAAKb,QAAL,CAAcY,UAAd,CAArB;;AAEA;AACA;AACA;AACA,cAAI,CAACC,cAAL,EAAqB;AACnBA,6BAAiBj3B,YAAY2lB,QAAZ,CAAqBllB,OAArB,EAA8BI,SAA9B,EAAyCi2B,OAAOnyB,OAAhD,CAAjB;AACA,kBAAKyxB,QAAL,CAAcnoB,IAAd,CAAmBgpB,cAAnB;AACD;;AAED,cAAIxpB,OAAJ,EAAa;AACX;AACA;AACA;AACAzN,wBAAYkZ,iBAAZ,CAA8BzL,OAA9B,EAAuC8K,IAAvC,CAA4C,UAACjM,KAAD,EAAW;AACrDtM,0BAAY62B,aAAZ,CAA0Bp2B,OAA1B,EAAmC6L,KAAnC,EAA0C2qB,cAA1C;AACAj3B,0BAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,aAHD;AAID,WARD,MAQO;AACL;AACA;AACAT,wBAAY62B,aAAZ,CAA0Bp2B,OAA1B,EAAmCI,SAAnC,EAA8Co2B,cAA9C;AACAj3B,wBAAYk3B,cAAZ,CAA2Bz2B,OAA3B,EAAoCm2B,WAApC;AACA52B,wBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;AACF,SA5BD;AA6BD,OA7CD;AA8CD;;;;;;kBA7EkB01B,c;;;;;;;;;;;;;;ACFrB;;;;AACA;;;;AACA;;AACA;;;;;;AAJA;AAMA,IAAMp1B,WAAW,UAAjB;;AAEA;;;;;;;AAOA,SAASo2B,mBAAT,CAA8BvM,MAA9B,EAAsCwM,KAAtC,EAA6C;;AAE3C,MAAI11B,UAAJ;AACA,MAAIiqB,eAAJ;AACA,MAAI0L,cAAJ;AACA,MAAInW,MAAM,CAAV;AACA,MAAMoW,QAAQ1M,OAAOjpB,MAArB;AACA,MAAM41B,WAAW,EAAjB;;AAEA;AACAA,WAASC,aAAT,GAAyB,KAAzB;;AAEA,MAAI,OAAOJ,KAAP,KAAiB,QAAjB,IAA6BA,SAAS,CAA1C,EAA6C;AAC3CA,YAAQ,CAAR;AACD;;AAED;AACA,OAAK11B,IAAI,CAAT,EAAYA,IAAI41B,KAAhB,EAAuB51B,GAAvB,EAA4B;AAC1B21B,YAAS5G,OAAO7F,OAAOlpB,CAAP,CAAP,IAAoB01B,KAArB,GAA8B,CAAtC,CAD0B,CACe;AACzCG,aAAStpB,IAAT,CAAcopB,KAAd;AACA,QAAI31B,MAAM,CAAV,EAAa;AAAE;AACbiqB,eAAS0L,KAAT;AACD,KAFD,MAEO,IAAIA,UAAU1L,MAAd,EAAsB;AAC3B4L,eAASC,aAAT,GAAyB,IAAzB;AACD;;AAEDtW,WAAOmW,KAAP;AACD;;AAED,MAAIE,SAAS51B,MAAT,GAAkB,CAAtB,EAAyB;AACvB,QAAI41B,SAASC,aAAb,EAA4B;AAC1B;AACAH,cAASnW,MAAMqW,SAAS51B,MAAhB,GAA0B,CAAlC;AACD,KAHD,MAGO;AACL01B,cAAQE,SAAS,CAAT,CAAR;AACD;;AAEDA,aAAStpB,IAAT,CAAcopB,KAAd;AACD;;AAED,SAAOE,QAAP;AAED;;AAED;;;;;AAKA,SAASE,gBAAT,CAA2B3K,YAA3B,EAAyC;AACvC,MAAM2F,KAAK3F,aAAaC,UAAxB;;AAEA,MAAI,OAAO0F,EAAP,KAAc,WAAlB,EAA+B;AAC7B3F,iBAAaC,UAAb,GAA0BlsB,SAA1B;AACA,QAAIisB,aAAa4K,oBAAjB,EAAuC;AACrCpC,mBAAa7C,EAAb;AACD,KAFD,MAEO;AACLtF,oBAAcsF,EAAd;AACD;AACF;AACF;;AAED;;;;;AAKA,SAASkF,gBAAT,CAA2Bl3B,OAA3B,EAAoC;AAClC,MAAM+rB,cAAc;AAClB/rB;AADkB,GAApB;;AAIA,8BAAaA,OAAb,EAAsB,6BAAtB,EAAqD+rB,WAArD;AACD;;AAED;;;;;;;AAOA,SAAS/E,QAAT,CAAmBhnB,OAAnB,EAA4BksB,eAA5B,EAA6C;AAC3C,MAAIG,qBAAJ;AACA,MAAI8K,yBAAJ;;AAEA,MAAIn3B,YAAYI,SAAhB,EAA2B;AACzB,UAAM,IAAIqX,KAAJ,CAAU,yCAAV,CAAN;AACD;;AAED,MAAM2f,gBAAgB,6BAAap3B,OAAb,EAAsB,OAAtB,CAAtB;;AAEA,MAAI,CAACo3B,aAAD,IAAkB,CAACA,cAAct2B,IAAjC,IAAyC,CAACs2B,cAAct2B,IAAd,CAAmBI,MAAjE,EAAyE;AACvE;AACD;;AAED,MAAM3B,cAAc,0BAASA,WAA7B;AACA;AACA,MAAIwe,sBAAJ;;AAEA,MAAIqZ,cAAct2B,IAAd,CAAmBI,MAAnB,GAA4B,CAAhC,EAAmC;AACjC,QAAM8c,oBAAoB,6BAAahe,OAAb,EAAsB,eAAtB,CAA1B;;AAEA,QAAIge,qBAAqBA,kBAAkBld,IAAvC,IAA+Ckd,kBAAkBld,IAAlB,CAAuBI,MAA1E,EAAkF;AAChF6c,sBAAgBC,kBAAkBld,IAAlB,CAAuB,CAAvB,CAAhB;AACD;AACF;;AAED,MAAMmY,YAAYme,cAAct2B,IAAd,CAAmB,CAAnB,CAAlB;;AAEA,MAAMsrB,mBAAmB,6BAAapsB,OAAb,EAAsBM,QAAtB,CAAzB;;AAEA,MAAI,CAAC8rB,gBAAD,IAAqB,CAACA,iBAAiBtrB,IAAvC,IAA+C,CAACsrB,iBAAiBtrB,IAAjB,CAAsBI,MAA1E,EAAkF;AAChFmrB,mBAAe;AACbC,kBAAYlsB,SADC;AAEb8rB,uBAAiB,EAFJ;AAGbK,0BAAoBnsB,SAHP;AAIbosB,iBAAW,CAJE;AAKb6K,uBAAiBj3B,SALJ;AAMbk3B,6BAAuB,KANV;AAObL,4BAAsB,KAPT;AAQbN,aAAO,CARM;AASbY,eAAS,KATI;AAUbve,YAAM;AAVO,KAAf;AAYA,iCAAahZ,OAAb,EAAsBM,QAAtB,EAAgC+rB,YAAhC;AACD,GAdD,MAcO;AACLA,mBAAeD,iBAAiBtrB,IAAjB,CAAsB,CAAtB,CAAf;AACA;AACAk2B,qBAAiB3K,YAAjB;AACD;;AAED;AACA,MAAIH,kBAAkB,CAAlB,IAAuBA,kBAAkB,CAA7C,EAAgD;AAC9CG,iBAAaH,eAAb,GAA+B8D,OAAO9D,eAAP,CAA/B;AACAG,iBAAakL,OAAb,GAAuBlL,aAAaH,eAAb,GAA+B,CAAtD;AACA;AACAG,iBAAaiL,qBAAb,GAAqC,IAArC;AACD;;AAED;AACA,MACEjL,aAAaiL,qBAAb,KAAuC,IAAvC,IACIjL,aAAagL,eADjB,IAEIhL,aAAagL,eAAb,CAA6Bn2B,MAA7B,KAAwC+X,UAAUI,QAAV,CAAmBnY,MAHjE,EAIE;AACAi2B,uBAAmBT,oBAAoBrK,aAAagL,eAAjC,EAAkDhL,aAAasK,KAA/D,CAAnB;AACD;;AAED;AACA,MAAMa,iBAAiB,SAAjBA,cAAiB,GAAM;;AAE3B;AACA,QAAIjf,eAAJ;AAAA,QACE8D,4BADF;AAAA,QAEEC,0BAFF;AAAA,QAGEC,4BAHF;AAAA,QAIErD,kBAAkBD,UAAUE,mBAJ9B;;AAMA,QAAMse,aAAaxe,UAAUI,QAAV,CAAmBnY,MAAtC;;AAEA,QAAImrB,aAAakL,OAAjB,EAA0B;AACxBre;AACD,KAFD,MAEO;AACLA;AACD;;AAED,QAAI,CAACmT,aAAarT,IAAd,KAAuBE,kBAAkB,CAAlB,IAAuBA,mBAAmBue,UAAjE,CAAJ,EAAkF;AAChFT,uBAAiB3K,YAAjB;AACA6K,uBAAiBl3B,OAAjB;;AAEA;AACD;;AAED;AACA,QAAIkZ,mBAAmBue,UAAvB,EAAmC;AACjCve,wBAAkB,CAAlB;AACD;;AAED,QAAIA,kBAAkB,CAAtB,EAAyB;AACvBA,wBAAkBue,aAAa,CAA/B;AACD;;AAED,QAAIve,oBAAoBD,UAAUE,mBAAlC,EAAuD;;AAErDkD,4BAAsB,6BAAmBrR,mBAAnB,EAAtB;AACAsR,0BAAoB,6BAAmBpR,iBAAnB,EAApB;AACAqR,4BAAsB,6BAAmBnR,sBAAnB,EAAtB;;AAEA,UAAIiR,mBAAJ,EAAyB;AACvBA,4BAAoBrc,OAApB;AACD;;AAED,UAAIiZ,UAAU3B,YAAV,KAA2B,IAA/B,EAAqC;AACnCiB,iBAAShZ,YAAYiZ,SAAZ,CAAsBS,UAAUI,QAAV,CAAmBH,eAAnB,CAAtB,CAAT;AACD,OAFD,MAEO;AACLX,iBAAShZ,YAAYkZ,iBAAZ,CAA8BQ,UAAUI,QAAV,CAAmBH,eAAnB,CAA9B,CAAT;AACD;;AAEDX,aAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,YAAI;AACFoN,oBAAUE,mBAAV,GAAgCD,eAAhC;AACA,cAAI6E,aAAJ,EAAmB;AACjBA,0BAAc5E,mBAAd,GAAoCD,eAApC;AACA6E,0BAAcE,MAAd,CAAqBje,OAArB,EAA8Bo3B,cAAct2B,IAA5C;AACD,WAHD,MAGO;AACLvB,wBAAYid,YAAZ,CAAyBxc,OAAzB,EAAkC6L,KAAlC;AACD;AACD,cAAIyQ,iBAAJ,EAAuB;AACrBA,8BAAkBtc,OAAlB,EAA2B6L,KAA3B;AACD;AACF,SAXD,CAWE,OAAOkM,KAAP,EAAc;AACd;AACD;AACF,OAfD,EAeG,UAAUA,KAAV,EAAiB;AAClB,YAAM/K,UAAUiM,UAAUI,QAAV,CAAmBH,eAAnB,CAAhB;;AAEA,YAAIqD,mBAAJ,EAAyB;AACvBA,8BAAoBvc,OAApB,EAA6BgN,OAA7B,EAAsC+K,KAAtC;AACD;AACF,OArBD;AAuBD;AAEF,GA1ED;;AA4EE;AACA;AACF,MAAIof,oBAAoBA,iBAAiBj2B,MAAjB,GAA0B,CAA9C,IAAmDi2B,iBAAiBJ,aAAxE,EAAuF;AACrF1K,iBAAa4K,oBAAb,GAAoC,IAApC;AACA5K,iBAAaC,UAAb,GAA0BpU,WAAW,SAASwf,sBAAT,GAAmC;AACtErL,mBAAaC,UAAb,GAA0BpU,WAAWwf,sBAAX,EAAmCP,iBAAiBle,UAAUE,mBAA3B,CAAnC,CAA1B;AACAqe;AACD,KAHyB,EAGvB,CAHuB,CAA1B;AAID,GAND,MAMO;AACL;AACAnL,iBAAa4K,oBAAb,GAAoC,KAApC;AACA5K,iBAAaC,UAAb,GAA0BG,YAAY+K,cAAZ,EAA4B,OAAOnyB,KAAK2X,GAAL,CAASqP,aAAaH,eAAtB,CAAnC,CAA1B;AACD;AAEF;;AAED;;;;AAIA,SAASjF,QAAT,CAAmBjnB,OAAnB,EAA4B;;AAE1B,MAAMosB,mBAAmB,6BAAapsB,OAAb,EAAsBM,QAAtB,CAAzB;;AAEA,MAAI,CAAC8rB,gBAAD,IAAqB,CAACA,iBAAiBtrB,IAAvC,IAA+C,CAACsrB,iBAAiBtrB,IAAjB,CAAsBI,MAA1E,EAAkF;AAChF;AACD;;AAED81B,mBAAiB5K,iBAAiBtrB,IAAjB,CAAsB,CAAtB,CAAjB;AAED;;QAGCkmB,Q,GAAAA,Q;QACAC,Q,GAAAA,Q;;;;;;;;;;;;;ACnRF;;;;AACA;;;;;;AAEA,IAAI0Q,eAAJ;AACA,IAAIC,eAAJ;;AAEA,SAASC,QAAT,CAAmBzwB,CAAnB,EAAsB;AACpB,MAAM7H,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUoH,EAAES,aAAlB;;AAEA,MAAMiwB,eAAe;AACnBj2B,WAAOrC,OAAOqC,KAAP,IAAgBuF,CADJ,EACO;AAC1BpH,oBAFmB;AAGnBkc,cAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAHS;AAInB6L,WAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAJ3B;AAKnBrE,mBAAe;AACb6L,YAAM;AACJrP,WAAG2zB,MADC;AAEJ1zB,WAAG2zB;AAFC,OADO;AAKb/rB,aAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiC23B,MAAjC,EAAyCC,MAAzC;AALM,KALI;AAYnBrF,aAASnrB,EAAEmrB,OAZQ;AAanBjxB,WAAO8F,EAAE9F;AAbU,GAArB;;AAgBAw2B,eAAatwB,aAAb,CAA2BC,MAA3B,GAAoClI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC83B,aAAatwB,aAAb,CAA2BqE,KAA9D,CAApC;;AAEA,MAAMksB,iBAAiB;AACrBC,aAAS,yBADY;AAErBC,cAAU,0BAFW;AAGrBC,WAAO;;AAHc,GAAvB;;AAOA,8BAAal4B,OAAb,EAAsB+3B,eAAe3wB,EAAEzF,IAAjB,CAAtB,EAA8Cm2B,YAA9C;AACD;;AAED,SAASK,SAAT,CAAoB/wB,CAApB,EAAuB;AACrBuwB,WAASvwB,EAAEgxB,KAAF,IAAWhxB,EAAE8lB,aAAF,CAAgBkL,KAApC;AACAR,WAASxwB,EAAEixB,KAAF,IAAWjxB,EAAE8lB,aAAF,CAAgBmL,KAApC;AACD;;AAED,IAAMC,gBAAgB,wBAAtB;;AAEA,SAASjwB,MAAT,CAAiBrI,OAAjB,EAA0B;AACxB;AACAkI,UAAQlI,OAAR;;AAEA,4BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBmxB,aAAvB,EAAsCT,QAAtC;AACA,4BAASn4B,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,WAAvB,EAAoCgxB,SAApC;AACD;;AAED,SAASjwB,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB+xB,aAAxB,EAAuCT,QAAvC;AACA,4BAASn4B,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,WAAxB,EAAqC4xB,SAArC;AACD;;AAED;AACA,IAAMI,gBAAgB;AACpBlwB,gBADoB;AAEpBH;AAFoB,CAAtB;;kBAKeqwB,a;;;;;;;;;;;;;AChEf;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,IAAIC,eAAe,IAAnB;AACA,IAAIC,4BAAJ;AACA,IAAMC,aAAa,GAAnB;;AAEA,SAASC,aAAT,CAAwB92B,KAAxB,EAA+B;AAC7B,MAAI,OAAOA,MAAM+2B,OAAb,KAAyB,QAA7B,EAAuC;AACrC,WAAO/2B,MAAMP,KAAb;AACD;;AAED,MAAIO,MAAM+2B,OAAN,KAAkB,CAAtB,EAAyB;AACvB,WAAO,CAAP;AACD,GAFD,MAEO,IAAI/2B,MAAM+2B,OAAN,GAAgB,CAAhB,KAAsB,CAA1B,EAA6B;AAClC,WAAO,CAAP;AACD,GAFM,MAEA,IAAI/2B,MAAM+2B,OAAN,GAAgB,CAAhB,KAAsB,CAA1B,EAA6B;AAClC,WAAO,CAAP;AACD,GAFM,MAEA,IAAI/2B,MAAM+2B,OAAN,GAAgB,CAAhB,KAAsB,CAA1B,EAA6B;AAClC,WAAO,CAAP;AACD;;AAED,SAAO,CAAP;AACD;;AAED,SAASC,mBAAT,GAAgC;AAC9BL,iBAAe,KAAf;AACD;;AAED,SAASM,gBAAT,CAA2B1xB,CAA3B,EAA8B;AAC5B,MAAM7H,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUoH,EAAES,aAAlB;AACA,MAAMpH,YAAY,kCAAlB;;AAEA,MAAMmH,cAAc;AAClByL,UAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,CAA3C,CADY;AAElByE,WAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEgxB,KAAnC,EAA0ChxB,EAAEixB,KAA5C,CAFW;AAGlBnd,YAAQ;AACNlX,SAAGoD,EAAE4xB,OADC;AAEN/0B,SAAGmD,EAAE6xB;AAFC;AAHU,GAApB;;AASArxB,cAAYH,MAAZ,GAAqBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAArB;;AAEA,MAAMqtB,aAAa,0BAAWtxB,WAAX,CAAnB;AACA,MAAMlH,YAAY;AAChBmB,WAAOuF,CADS;AAEhB9F,WAAOq3B,cAAcvxB,CAAd,CAFS;AAGhB8U,cAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAHM;AAIhB6L,WAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAJ9B;AAKhB7L,oBALgB;AAMhB4H,4BANgB;AAOhBsxB,0BAPgB;AAQhB1xB,mBAAeI,WARC;AAShB8T,iBAAa;AACX1X,SAAG,CADQ;AAEXC,SAAG;AAFQ,KATG;AAahBtC,UAAMlB;AAbU,GAAlB;;AAgBA,8BAAaC,UAAUV,OAAvB,EAAgCS,SAAhC,EAA2CC,SAA3C;AACD;;AAED,SAASy4B,SAAT,CAAoB/xB,CAApB,EAAuB;AACrBqxB,wBAAsBvgB,WAAW2gB,mBAAX,EAAgCH,UAAhC,CAAtB;;AAEA,MAAMn5B,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUoH,EAAES,aAAlB;AACA,MAAMpH,YAAY,2BAAlB;;AAEA;AACA,4BAASf,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,WAAxB,EAAqC4xB,SAArC;;AAEA,MAAMvwB,cAAc;AAClByL,UAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,CAA3C,CADY;AAElByE,WAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEgxB,KAAnC,EAA0ChxB,EAAEixB,KAA5C,CAFW;AAGlBnd,YAAQ;AACNlX,SAAGoD,EAAE4xB,OADC;AAEN/0B,SAAGmD,EAAE6xB;AAFC;AAHU,GAApB;;AASArxB,cAAYH,MAAZ,GAAqBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAArB;;AAEA,MAAIqtB,aAAa,0BAAWtxB,WAAX,CAAjB;AACA,MAAMlH,YAAY;AAChBmB,WAAOuF,CADS;AAEhB9F,WAAOq3B,cAAcvxB,CAAd,CAFS;AAGhB8U,cAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAHM;AAIhB6L,WAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAJ9B;AAKhB7L,oBALgB;AAMhB4H,4BANgB;AAOhBsxB,0BAPgB;AAQhB1xB,mBAAeI,WARC;AAShB8T,iBAAa;AACX1X,SAAG,CADQ;AAEXC,SAAG;AAFQ,KATG;AAahBtC,UAAMlB;AAbU,GAAlB;;AAgBA,MAAM24B,kBAAkB,4BAAa14B,UAAUV,OAAvB,EAAgCS,SAAhC,EAA2CC,SAA3C,CAAxB;;AAEA,MAAI04B,eAAJ,EAAqB;AACnB;AACA14B,cAAUiB,IAAV,GAAiB,mCAAjB;AACA,gCAAajB,UAAUV,OAAvB,EAAgC,mCAAhC,EAAqEU,SAArE;AACD;;AAED,MAAM24B,mBAAmBV,cAAcvxB,CAAd,CAAzB;;AAEA,WAASoc,WAAT,CAAsBpc,CAAtB,EAAyB;AACvB;AACA,QAAM3G,YAAY,2BAAlB;AACA,QAAM+G,gBAAgB;AACpB6L,YAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,CAA3C,CADc;AAEpByE,aAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEgxB,KAAnC,EAA0ChxB,EAAEixB,KAA5C,CAFa;AAGpBnd,cAAQ;AACNlX,WAAGoD,EAAE4xB,OADC;AAEN/0B,WAAGmD,EAAE6xB;AAFC;AAHY,KAAtB;;AASAzxB,kBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEA;AACA,QAAM6P,cAAc;AAClBrI,YAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc6L,IAAtD,EAA4D6lB,WAAW7lB,IAAvE,CADY;AAElBxH,aAAO,0BAASpM,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcqE,KAAtD,EAA6DqtB,WAAWrtB,KAAxE,CAFW;AAGlBqP,cAAQ,0BAASzb,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc0T,MAAtD,EAA8Dge,WAAWhe,MAAzE,CAHU;AAIlBzT,cAAQ,0BAAShI,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcC,MAAtD,EAA8DyxB,WAAWzxB,MAAzE;AAJU,KAApB;;AAOA,QAAM/G,YAAY;AAChBY,aAAO+3B,gBADS;AAEhBnd,gBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFM;AAGhB6L,aAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAH9B;AAIhB7L,sBAJgB;AAKhB4H,8BALgB;AAMhBsxB,4BANgB;AAOhB1xB,kCAPgB;AAQhBkU,8BARgB;AAShB/Z,YAAMlB,SATU;AAUhB84B,eAASnyB,EAAEmyB,OAVK;AAWhBC,eAASpyB,EAAEoyB,OAXK;AAYhBC,gBAAUryB,EAAEqyB;AAZI,KAAlB;;AAeA,gCAAa/4B,UAAUV,OAAvB,EAAgCS,SAAhC,EAA2CC,SAA3C;;AAEA;AACAw4B,iBAAa,0BAAW1xB,aAAX,CAAb;;AAEA;AACA,WAAO,0BAAWJ,CAAX,CAAP;AACD;;AAED;AACA;AACA,WAASqc,SAAT,CAAoBrc,CAApB,EAAuB;AACrB;AACAytB,iBAAa4D,mBAAb;;AAEA,QAAIh4B,YAAY,yBAAhB;;AAEA,QAAI+3B,YAAJ,EAAkB;AAChB/3B,kBAAY,4BAAZ;AACD;;AAED;AACA,QAAM+G,gBAAgB;AACpB6L,YAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,CAA3C,CADc;AAEpByE,aAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEgxB,KAAnC,EAA0ChxB,EAAEixB,KAA5C,CAFa;AAGpBnd,cAAQ;AACNlX,WAAGoD,EAAE4xB,OADC;AAEN/0B,WAAGmD,EAAE6xB;AAFC;AAHY,KAAtB;;AASAzxB,kBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEA;AACA,QAAM6P,cAAc;AAClBrI,YAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc6L,IAAtD,EAA4D6lB,WAAW7lB,IAAvE,CADY;AAElBxH,aAAO,0BAASpM,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcqE,KAAtD,EAA6DqtB,WAAWrtB,KAAxE,CAFW;AAGlBqP,cAAQ,0BAASzb,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc0T,MAAtD,EAA8Dge,WAAWhe,MAAzE,CAHU;AAIlBzT,cAAQ,0BAAShI,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcC,MAAtD,EAA8DyxB,WAAWzxB,MAAzE;AAJU,KAApB;;AAOA,QAAM/G,YAAY;AAChBmB,aAAOuF,CADS;AAEhB9F,aAAO+3B,gBAFS;AAGhBnd,gBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAHM;AAIhB6L,aAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAJ9B;AAKhB7L,sBALgB;AAMhB4H,8BANgB;AAOhBsxB,4BAPgB;AAQhB1xB,kCARgB;AAShBkU,8BATgB;AAUhB/Z,YAAMlB;AAVU,KAAlB;;AAaA,gCAAaC,UAAUV,OAAvB,EAAgCS,SAAhC,EAA2CC,SAA3C;;AAEA,8BAAShB,CAAT,CAAWuC,QAAX,EAAqBsE,GAArB,CAAyB,WAAzB,EAAsCid,WAAtC;AACA,8BAAS9jB,CAAT,CAAWuC,QAAX,EAAqBsE,GAArB,CAAyB,SAAzB,EAAoCkd,SAApC;;AAEA,8BAAS/jB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,WAAjC,EAA8CgxB,SAA9C;;AAEAK,mBAAe,IAAf;AACD;;AAED,4BAAS94B,CAAT,CAAWuC,QAAX,EAAqBkF,EAArB,CAAwB,WAAxB,EAAqCqc,WAArC;AACA,4BAAS9jB,CAAT,CAAWuC,QAAX,EAAqBkF,EAArB,CAAwB,SAAxB,EAAmCsc,SAAnC;;AAEA,SAAO,0BAAWrc,CAAX,CAAP;AACD;;AAED,SAAS+wB,SAAT,CAAoB/wB,CAApB,EAAuB;AACrB,MAAM7H,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUoH,EAAES,aAAlB;AACA,MAAMpH,YAAY,2BAAlB;;AAEA,MAAMmH,cAAc;AAClByL,UAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,CAA3C,CADY;AAElByE,WAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEgxB,KAAnC,EAA0ChxB,EAAEixB,KAA5C,CAFW;AAGlBnd,YAAQ;AACNlX,SAAGoD,EAAE4xB,OADC;AAEN/0B,SAAGmD,EAAE6xB;AAFC;AAHU,GAApB;;AASArxB,cAAYH,MAAZ,GAAqBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAArB;;AAEA,MAAIqtB,aAAa,0BAAWtxB,WAAX,CAAjB;;AAEA,MAAMyxB,mBAAmBV,cAAcvxB,CAAd,CAAzB;;AAEA;AACA,MAAMI,gBAAgB;AACpB6L,UAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,CAA3C,CADc;AAEpByE,WAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEgxB,KAAnC,EAA0ChxB,EAAEixB,KAA5C,CAFa;AAGpBnd,YAAQ;AACNlX,SAAGoD,EAAE4xB,OADC;AAEN/0B,SAAGmD,EAAE6xB;AAFC;AAHY,GAAtB;;AASAzxB,gBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEA;AACA,MAAM6P,cAAc;AAClBrI,UAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc6L,IAAtD,EAA4D6lB,WAAW7lB,IAAvE,CADY;AAElBxH,WAAO,0BAASpM,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcqE,KAAtD,EAA6DqtB,WAAWrtB,KAAxE,CAFW;AAGlBqP,YAAQ,0BAASzb,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc0T,MAAtD,EAA8Dge,WAAWhe,MAAzE,CAHU;AAIlBzT,YAAQ,0BAAShI,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcC,MAAtD,EAA8DyxB,WAAWzxB,MAAzE;AAJU,GAApB;;AAOA,MAAM/G,YAAY;AAChBY,WAAO+3B,gBADS;AAEhBnd,cAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFM;AAGhB6L,WAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAH9B;AAIhB7L,oBAJgB;AAKhB4H,4BALgB;AAMhBsxB,0BANgB;AAOhB1xB,gCAPgB;AAQhBkU,4BARgB;AAShB/Z,UAAMlB;AATU,GAAlB;;AAYA,8BAAaT,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;;AAEA;AACAw4B,eAAa,0BAAW1xB,aAAX,CAAb;AACD;;AAED,SAASU,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,WAAxB,EAAqC4yB,SAArC;AACA,4BAASz5B,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,WAAxB,EAAqC4xB,SAArC;AACA,4BAASz4B,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,UAAxB,EAAoCuyB,gBAApC;AACD;;AAED,SAASzwB,MAAT,CAAiBrI,OAAjB,EAA0B;AACxB;AACAkI,UAAQlI,OAAR;;AAEA,4BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,WAAvB,EAAoCgyB,SAApC;AACA,4BAASz5B,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,WAAvB,EAAoCgxB,SAApC;AACA,4BAASz4B,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,UAAvB,EAAmC2xB,gBAAnC;AACD;;AAED;AACA,IAAMY,aAAa;AACjBrxB,gBADiB;AAEjBH;AAFiB,CAAnB;;kBAKewxB,U;;;;;;;;;;;;;AC7Sf;;;;AACA;;;;;;AAEA,SAASC,UAAT,CAAqBvyB,CAArB,EAAwB;AACtB;AACA;AACA;AACA;AACA;AACA,MAAIA,EAAE8lB,aAAF,CAAgBvrB,IAAhB,KAAyB,YAAzB,IAAyCyF,EAAE8lB,aAAF,CAAgB0M,WAAhB,KAAgC,CAA7E,EAAgF;AAC9E;AACD;AACD;AACA,MAAIxyB,EAAE8lB,aAAF,CAAgBvrB,IAAhB,KAAyB,gBAAzB,IAA6CyF,EAAE8lB,aAAF,CAAgB2M,IAAhB,KAAyB,CAA1E,EAA6E;AAC3E;AACD;;AAEDzyB,IAAEgD,cAAF;;AAEA,MAAM7K,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUoH,EAAES,aAAlB;;AAEA,MAAI7D,UAAJ;AACA,MAAIC,UAAJ;;AAEA,MAAImD,EAAEgxB,KAAF,KAAYh4B,SAAZ,IAAyBgH,EAAEixB,KAAF,KAAYj4B,SAAzC,EAAoD;AAClD4D,QAAIoD,EAAEgxB,KAAN;AACAn0B,QAAImD,EAAEixB,KAAN;AACD,GAHD,MAGO,IAAIjxB,EAAE8lB,aAAF,IACE9lB,EAAE8lB,aAAF,CAAgBkL,KAAhB,KAA0Bh4B,SAD5B,IAEEgH,EAAE8lB,aAAF,CAAgBmL,KAAhB,KAA0Bj4B,SAFhC,EAE2C;AAChD4D,QAAIoD,EAAE8lB,aAAF,CAAgBkL,KAApB;AACAn0B,QAAImD,EAAE8lB,aAAF,CAAgBmL,KAApB;AACD,GALM,MAKA;AACL;AACAr0B,QAAIoD,EAAEpD,CAAN;AACAC,QAAImD,EAAEnD,CAAN;AACD;;AAED,MAAM61B,iBAAiBv6B,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCgE,CAAjC,EAAoCC,CAApC,CAAvB;;AAEAmD,MAAK5H,OAAOqC,KAAP,IAAgBrC,OAAOqC,KAAP,CAAak4B,UAA9B,GAA4Cv6B,OAAOqC,KAAnD,GAA2DuF,CAA/D,CAtCsB,CAsC4C;;AAElE,MAAI2yB,mBAAJ;;AAEA,MAAI3yB,EAAE8lB,aAAF,IAAmB9lB,EAAE8lB,aAAF,CAAgB6M,UAAvC,EAAmD;AACjDA,iBAAa,CAAC3yB,EAAE8lB,aAAF,CAAgB6M,UAA9B;AACD,GAFD,MAEO,IAAI3yB,EAAE8lB,aAAF,IAAmB9lB,EAAE8lB,aAAF,CAAgBxO,MAAvC,EAA+C;AACpDqb,iBAAa,CAAC3yB,EAAE8lB,aAAF,CAAgBxO,MAA9B;AACD,GAFM,MAEA,IAAItX,EAAE8lB,aAAF,IAAmB9lB,EAAE8lB,aAAF,CAAgBtrB,MAAvC,EAA+C;AACpDm4B,iBAAa,CAAC3yB,EAAE8lB,aAAF,CAAgBtrB,MAA9B;AACD,GAFM,MAEA;AACLm4B,iBAAa3yB,EAAE2yB,UAAf;AACD;;AAED,MAAMrjB,YAAYqjB,aAAa,CAAb,GAAiB,CAAC,CAAlB,GAAsB,CAAxC;;AAEA,MAAMC,iBAAiB;AACrBh6B,oBADqB;AAErBkc,cAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFW;AAGrB6L,WAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHzB;AAIrB6K,wBAJqB;AAKrB0hB,WAAOp0B,CALc;AAMrBq0B,WAAOp0B,CANc;AAOrBg2B,YAAQH,eAAe91B,CAPF;AAQrBk2B,YAAQJ,eAAe71B;AARF,GAAvB;;AAWA,8BAAajE,OAAb,EAAsB,4BAAtB,EAAoDg6B,cAApD;AACD;;AAED,IAAMG,mBAAmB,2BAAzB;;AAEA,SAAS9xB,MAAT,CAAiBrI,OAAjB,EAA0B;AACxB;AACAkI,UAAQlI,OAAR;;AAEA,4BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuBgzB,gBAAvB,EAAyCR,UAAzC;AACD;;AAED,SAASzxB,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBo6B,MAApB,CAA2BD,gBAA3B,EAA6CR,UAA7C;AACD;;AAED;AACA,IAAMU,kBAAkB;AACtBhyB,gBADsB;AAEtBH;AAFsB,CAAxB;;kBAKemyB,e;;;;;;;;;;;;;AC1Ff;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,IAAIzyB,oBAAJ;AAAA,IACEJ,sBADF;AAAA,IAEE0xB,mBAFF;AAAA,IAGExd,oBAHF;AAAA,IAIEhb,kBAJF;AAAA,IAKE45B,wBALF;AAAA,IAMEC,qBANF;AAAA,IAOEC,0BAPF;;AASA,IAAIC,YAAY,GAAhB;AAAA,IACEC,eAAe,GADjB;AAAA,IAEEC,mBAAmB,KAFrB;AAAA,IAGEC,UAAU,KAHZ;AAAA,IAIEC,kBAJF;;AAMA,IAAMC,aAAa,GAAnB;AAAA,IACEC,mBAAmB,CADrB;;AAGA,SAASC,OAAT,CAAkB5zB,CAAlB,EAAqB;AACnB,MAAM7H,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUoH,EAAES,aAAF,IAAmBT,EAAE6zB,QAAF,CAAWpzB,aAA9C;AACA,MAAIpH,kBAAJ;AAAA,MACEy6B,oBADF;AAAA,MAEEC,cAFF;AAAA,MAGEC,0BAHF;AAAA,MAIEC,iBAJF;;AAMA;AACAj0B,IAAEgD,cAAF;;AAEA;AACA,MAAKhD,EAAEk0B,QAAF,IAAcl0B,EAAEk0B,QAAF,CAAWp6B,MAAX,GAAoB,CAAnC,IACGkG,EAAE8lB,aAAF,IAAmB9lB,EAAE8lB,aAAF,CAAgBqO,OAAnC,IAA8Cn0B,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwBr6B,MAAxB,GAAiC,CADtF,EAC0F;AACxF05B,cAAU,KAAV;AACA/F,iBAAa0F,YAAb;AACD;;AAED,UAAQnzB,EAAEzF,IAAV;AACA,SAAK,KAAL;AACEi5B,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEA;AACA/yB,sBAAgB;AACd6L,cAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAEk0B,QAAF,CAAW,CAAX,CAA3C,CADQ;AAEdzvB,eAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEk0B,QAAF,CAAW,CAAX,EAAclD,KAA/C,EAAsDhxB,EAAEk0B,QAAF,CAAW,CAAX,EAAcjD,KAApE,CAFO;AAGdnd,gBAAQ;AACNlX,aAAGoD,EAAEk0B,QAAF,CAAW,CAAX,EAActC,OADX;AAEN/0B,aAAGmD,EAAEk0B,QAAF,CAAW,CAAX,EAAcrC;AAFX;AAHM,OAAhB;AAQAzxB,oBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEApL,kBAAY,qBAAZ;AACAC,kBAAY;AACVmB,eAAOuF,CADG;AAEV8U,kBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,eAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,wBAJU;AAKVwH,oCALU;AAMV7F,cAAMlB,SANI;AAOV+6B,sBAAc;AAPJ,OAAZ;;AAUA,kCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACA;;AAEF,SAAK,WAAL;AACEk6B,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEA;AACA/yB,sBAAgB;AACd6L,cAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAEk0B,QAAF,CAAW,CAAX,CAA3C,CADQ;AAEdzvB,eAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEk0B,QAAF,CAAW,CAAX,EAAclD,KAA/C,EAAsDhxB,EAAEk0B,QAAF,CAAW,CAAX,EAAcjD,KAApE,CAFO;AAGdnd,gBAAQ;AACNlX,aAAGoD,EAAEk0B,QAAF,CAAW,CAAX,EAActC,OADX;AAEN/0B,aAAGmD,EAAEk0B,QAAF,CAAW,CAAX,EAAcrC;AAFX;AAHM,OAAhB;AAQAzxB,oBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEApL,kBAAY,2BAAZ;AACAC,kBAAY;AACVmB,eAAOuF,CADG;AAEV8U,kBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,eAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,wBAJU;AAKVwH,oCALU;AAMV7F,cAAMlB,SANI;AAOV+6B,sBAAc;AAPJ,OAAZ;;AAUA,kCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACA;;AAEF,SAAK,YAAL;AACEk6B,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEAE,kBAAY,GAAZ;AACA;;AAEF,SAAK,WAAL;AACEG,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEA,UAAII,qBAAqB,IAAzB,EAA+B;AAC7BF,oBAAYrzB,EAAEyW,KAAd;AACA8c,2BAAmB,KAAnB;AACA;AACD;;AAEDO,oBAAc,CAAC9zB,EAAEyW,KAAF,GAAU4c,SAAX,IAAwBA,SAAtC;;AAEA7yB,oBAAc;AACZyL,cAAMjM,EAAE2S,MADI;AAEZlO,eAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAE2S,MAAF,CAAS/V,CAA1C,EAA6CoD,EAAE2S,MAAF,CAAS9V,CAAtD;AAFK,OAAd;AAIA2D,kBAAYH,MAAZ,GAAqBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAArB;;AAEApL,kBAAY,4BAAZ;AACAC,kBAAY;AACVmB,eAAOuF,CADG;AAEVQ,gCAFU;AAGVsU,kBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAHA;AAIV6L,eAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAJpC;AAKV7L,wBALU;AAMV0W,mBAAWtP,EAAEyW,KAAF,GAAU,CAAV,GAAc,CAAd,GAAkB,CAAC,CANpB;AAOVqd,gCAPU;AAQVv5B,cAAMlB,SARI;AASV+6B,sBAAc;AATJ,OAAZ;;AAYA,kCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;;AAEA+5B,kBAAYrzB,EAAEyW,KAAd;AACA;;AAEF,SAAK,YAAL;AACE4c,kBAAY,GAAZ;;AAEA5F,mBAAa0F,YAAb;;AAEA1F,mBAAayF,eAAb;AACAA,wBAAkBpiB,WAAW,YAAY;AACvCtQ,sBAAc;AACZyL,gBAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,CAA3C,CADM;AAEZ1vB,iBAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BnD,KAA5D,EAAmEhxB,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BlD,KAA9F,CAFK;AAGZnd,kBAAQ;AACNlX,eAAGoD,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BvC,OADxB;AAEN/0B,eAAGmD,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BtC;AAFxB;AAHI,SAAd;AAQArxB,oBAAYH,MAAZ,GAAqBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAArB;;AAEApL,oBAAY,4BAAZ;AACA,YAAI2G,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwBr6B,MAAxB,GAAiC,CAArC,EAAwC;AACtCT,sBAAY,iCAAZ;AACD;;AAEDC,oBAAY;AACVmB,iBAAOuF,CADG;AAEV8U,oBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,iBAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,0BAJU;AAKV4H,kCALU;AAMVJ,yBAAeI,WANL;AAOVjG,gBAAMlB,SAPI;AAQV+6B,wBAAc;AARJ,SAAZ;;AAWA,YAAMpC,kBAAkB,4BAAap5B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC,CAAxB;;AAEA,YAAI04B,oBAAoB,IAAxB,EAA8B;AAC5B;AACA;;AAEA;AACA;AACA34B,sBAAY,kCAAZ;AACA,cAAI2G,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwBr6B,MAAxB,GAAiC,CAArC,EAAwC;AACtCT,wBAAY,uCAAZ;AACD;;AAEDC,oBAAUiB,IAAV,GAAiBlB,SAAjB;AACA,sCAAaT,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACD;;AAED;AACAw4B,qBAAa,0BAAWtxB,WAAX,CAAb;AACD,OA9CiB,EA8Cf,EA9Ce,CAAlB;;AAgDAgzB,gBAAU,IAAV;AACAJ,0BAAoB,CAApB;AACAD,qBAAeriB,WAAW,YAAY;AACpC,YAAI,CAAC0iB,OAAL,EAAc;AACZ;AACD;;AAEDpzB,wBAAgB;AACd6L,gBAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,CAA3C,CADQ;AAEd1vB,iBAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BnD,KAA5D,EAAmEhxB,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BlD,KAA9F,CAFO;AAGdnd,kBAAQ;AACNlX,eAAGoD,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BvC,OADxB;AAEN/0B,eAAGmD,EAAE8lB,aAAF,CAAgBqO,OAAhB,CAAwB,CAAxB,EAA2BtC;AAFxB;AAHM,SAAhB;AAQAzxB,sBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAAvB;;AAEApL,oBAAY,4BAAZ;AACAC,oBAAY;AACVmB,iBAAOuF,CADG;AAEV8U,oBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,iBAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,0BAJU;AAKVwH,sCALU;AAMV7F,gBAAMlB,SANI;AAOV+6B,wBAAc;AAPJ,SAAZ;;AAUA,oCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;;AAEA;AACD,OA7Bc,EA6BZo6B,UA7BY,CAAf;AA8BA;;AAEF,SAAK,UAAL;AACEL,kBAAY,GAAZ;;AAEAG,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEAriB,iBAAW,YAAY;AACrBtQ,sBAAc;AACZyL,gBAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAE8lB,aAAF,CAAgBuO,cAAhB,CAA+B,CAA/B,CAA3C,CADM;AAEZ5vB,iBAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAE8lB,aAAF,CAAgBuO,cAAhB,CAA+B,CAA/B,EAAkCrD,KAAnE,EAA0EhxB,EAAE8lB,aAAF,CAAgBuO,cAAhB,CAA+B,CAA/B,EAAkCpD,KAA5G,CAFK;AAGZnd,kBAAQ;AACNlX,eAAGoD,EAAE8lB,aAAF,CAAgBuO,cAAhB,CAA+B,CAA/B,EAAkCzC,OAD/B;AAEN/0B,eAAGmD,EAAE8lB,aAAF,CAAgBuO,cAAhB,CAA+B,CAA/B,EAAkCxC;AAF/B;AAHI,SAAd;AAQArxB,oBAAYH,MAAZ,GAAqBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmC4H,YAAYiE,KAA/C,CAArB;;AAEApL,oBAAY,0BAAZ;;AAEAC,oBAAY;AACVmB,iBAAOuF,CADG;AAEV8U,oBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,iBAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,0BAJU;AAKV4H,kCALU;AAMVJ,yBAAeI,WANL;AAOVjG,gBAAMlB,SAPI;AAQV+6B,wBAAc;AARJ,SAAZ;;AAWA,oCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACD,OAzBD,EAyBG,EAzBH;AA0BA;;AAEF,SAAK,SAAL;AACE;AACA;AACA;AACA;AACAy6B,cAAQ;AACNn3B,WAAGoD,EAAEs0B,MAAF,GAAWb,UAAU72B,CADlB;AAENC,WAAGmD,EAAEsX,MAAF,GAAWmc,UAAU52B;AAFlB,OAAR;;AAKA42B,kBAAY;AACV72B,WAAGoD,EAAEs0B,MADK;AAEVz3B,WAAGmD,EAAEsX;AAFK,OAAZ;;AAKA;AACAlX,sBAAgB;AACd6L,cAAM;AACJrP,aAAGk1B,WAAW7lB,IAAX,CAAgBrP,CAAhB,GAAoBm3B,MAAMn3B,CADzB;AAEJC,aAAGi1B,WAAW7lB,IAAX,CAAgBpP,CAAhB,GAAoBk3B,MAAMl3B;AAFzB,SADQ;AAKd4H,eAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCk5B,WAAW7lB,IAAX,CAAgBrP,CAAhB,GAAoBm3B,MAAMn3B,CAA3D,EAA8Dk1B,WAAW7lB,IAAX,CAAgBpP,CAAhB,GAAoBk3B,MAAMl3B,CAAxF,CALO;AAMdiX,gBAAQ;AACNlX,aAAGk1B,WAAWhe,MAAX,CAAkBlX,CAAlB,GAAsBm3B,MAAMn3B,CADzB;AAENC,aAAGi1B,WAAWhe,MAAX,CAAkBjX,CAAlB,GAAsBk3B,MAAMl3B;AAFzB;AANM,OAAhB;AAWAuD,oBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEA;AACA6P,oBAAc;AACZrI,cAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc6L,IAAtD,EAA4D6lB,WAAW7lB,IAAvE,CADM;AAEZxH,eAAO,0BAASpM,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcqE,KAAtD,EAA6DqtB,WAAWrtB,KAAxE,CAFK;AAGZqP,gBAAQ,0BAASzb,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc0T,MAAtD,EAA8Dge,WAAWhe,MAAzE,CAHI;AAIZzT,gBAAQ,0BAAShI,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcC,MAAtD,EAA8DyxB,WAAWzxB,MAAzE;AAJI,OAAd;;AAOA+yB,2BAAqBn1B,KAAK0b,IAAL,CAAUrF,YAAYrI,IAAZ,CAAiBrP,CAAjB,GAAqB0X,YAAYrI,IAAZ,CAAiBrP,CAAtC,GAA0C0X,YAAYrI,IAAZ,CAAiBpP,CAAjB,GAAqByX,YAAYrI,IAAZ,CAAiBpP,CAA1F,CAArB;AACA;AACA,UAAIu2B,oBAAoBO,gBAAxB,EAA0C;AACxC;AACAH,kBAAU,KAAV;AACA/F,qBAAa0F,YAAb;AACD;;AAED95B,kBAAY,2BAAZ;AACA,UAAI2G,EAAEk0B,QAAF,CAAWp6B,MAAX,GAAoB,CAAxB,EAA2B;AACzBT,oBAAY,gCAAZ;AACD;;AAEDC,kBAAY;AACVwb,kBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CADA;AAEV6L,eAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAFpC;AAGV7L,wBAHU;AAIV4H,gCAJU;AAKVsxB,8BALU;AAMV1xB,oCANU;AAOVkU,gCAPU;AAQV4D,qBAAalY,EAAEk0B,QAAF,CAAWp6B,MARd;AASVS,cAAMlB,SATI;AAUV+6B,sBAAc;AAVJ,OAAZ;;AAaA,kCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;;AAEAw4B,mBAAa,0BAAW1xB,aAAX,CAAb;AACA;;AAEF,SAAK,UAAL;AACEqzB,kBAAY;AACV72B,WAAGoD,EAAEs0B,MADK;AAEVz3B,WAAGmD,EAAEsX;AAFK,OAAZ;;AAKAlX,sBAAgB;AACd6L,cAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAEk0B,QAAF,CAAW,CAAX,CAA3C,CADQ;AAEdzvB,eAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEk0B,QAAF,CAAW,CAAX,EAAclD,KAA/C,EAAsDhxB,EAAEk0B,QAAF,CAAW,CAAX,EAAcjD,KAApE,CAFO;AAGdnd,gBAAQ;AACNlX,aAAGoD,EAAEk0B,QAAF,CAAW,CAAX,EAActC,OADX;AAEN/0B,aAAGmD,EAAEk0B,QAAF,CAAW,CAAX,EAAcrC;AAFX;AAHM,OAAhB;AAQAzxB,oBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;AACAqtB,mBAAa,0BAAW1xB,aAAX,CAAb;AACA;;AAEF,SAAK,QAAL;AACEozB,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEA;AACA;AACA,UAAI,CAACrB,UAAL,EAAiB;AACf,eAAO,KAAP;AACD;;AAED1xB,sBAAgB;AACd6L,cAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+B8sB,WAA/B,CAA2C3xB,EAAEk0B,QAAF,CAAW,CAAX,CAA3C,CADQ;AAEdzvB,eAAOtM,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCoH,EAAEk0B,QAAF,CAAW,CAAX,EAAclD,KAA/C,EAAsDhxB,EAAEk0B,QAAF,CAAW,CAAX,EAAcjD,KAApE,CAFO;AAGdnd,gBAAQ;AACNlX,aAAGoD,EAAEk0B,QAAF,CAAW,CAAX,EAActC,OADX;AAEN/0B,aAAGmD,EAAEk0B,QAAF,CAAW,CAAX,EAAcrC;AAFX;AAHM,OAAhB;AAQAzxB,oBAAcC,MAAd,GAAuBlI,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCwH,cAAcqE,KAAjD,CAAvB;;AAEA;AACA6P,oBAAc;AACZrI,cAAM,0BAAS5T,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc6L,IAAtD,EAA4D6lB,WAAW7lB,IAAvE,CADM;AAEZxH,eAAO,0BAASpM,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcqE,KAAtD,EAA6DqtB,WAAWrtB,KAAxE,CAFK;AAGZqP,gBAAQ,0BAASzb,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAc0T,MAAtD,EAA8Dge,WAAWhe,MAAzE,CAHI;AAIZzT,gBAAQ,0BAAShI,eAAT,CAAyBwM,KAAzB,CAA+BqtB,QAA/B,CAAwC9xB,cAAcC,MAAtD,EAA8DyxB,WAAWzxB,MAAzE;AAJI,OAAd;;AAOAhH,kBAAY,yBAAZ;;AAEAC,kBAAY;AACVmB,eAAOuF,EAAE6zB,QADC;AAEV/e,kBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,eAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,wBAJU;AAKV4H,gCALU;AAMVsxB,8BANU;AAOV1xB,oCAPU;AAQVkU,gCARU;AASV/Z,cAAMlB,SATI;AAUV+6B,sBAAc;AAVJ,OAAZ;;AAaA,kCAAax7B,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;;AAEA06B,0BAAoBh0B,EAAEk0B,QAAF,CAAWp6B,MAAX,GAAoBkG,EAAEu0B,eAAF,CAAkBz6B,MAA1D;;AAEA,UAAIk6B,sBAAsB,CAA1B,EAA6B;AAC3BT,2BAAmB,IAAnB;AACD;;AAED,aAAO,0BAAWvzB,CAAX,CAAP;;AAEF,SAAK,YAAL;AACEwzB,gBAAU,KAAV;AACA/F,mBAAa0F,YAAb;;AAEAc,iBAAWj0B,EAAEi0B,QAAF,GAAaX,YAAxB;;AAEAA,qBAAetzB,EAAEi0B,QAAjB;;AAEA56B,kBAAY,6BAAZ;AACAC,kBAAY;AACVmB,eAAOuF,EAAE6zB,QADC;AAEV/e,kBAAU3c,YAAY4c,WAAZ,CAAwBnc,OAAxB,CAFA;AAGV6L,eAAOtM,YAAYW,iBAAZ,CAA8BF,OAA9B,EAAuC6L,KAHpC;AAIV7L,wBAJU;AAKVq7B,0BALU;AAMV15B,cAAMlB;AANI,OAAZ;AAQA,kCAAaT,OAAb,EAAsBS,SAAtB,EAAiCC,SAAjC;AACA;AA7XF;;AAgYA,SAAO,KAAP;AACD;;AAED,SAAS2H,MAAT,CAAiBrI,OAAjB,EAA0B;AACxBkI,UAAQlI,OAAR;AACA,MAAML,SAAS,0BAASA,MAAxB;;AAEA,MAAMi8B,gBAAgB;AACpBC,gBAAYl8B,OAAOm8B,sBAAP,GAAgCn8B,OAAOo8B,iBAAvC,GAA2Dp8B,OAAOq8B;AAD1D,GAAtB;;AAIA,MAAMC,KAAK,IAAIt8B,OAAOu8B,OAAX,CAAmBl8B,OAAnB,EAA4B47B,aAA5B,CAAX;;AAEA,MAAMO,aAAa;AACjBb,cAAU,CADO;AAEjB5kB,eAAW/W,OAAOy8B,aAFD;AAGjBC,eAAW;AAHM,GAAnB;;AAMA,MAAMrU,MAAM,IAAIroB,OAAO28B,GAAX,CAAeH,UAAf,CAAZ;AACA,MAAMI,QAAQ,IAAI58B,OAAO68B,KAAX,CAAiB;AAC7BH,eAAW;AADkB,GAAjB,CAAd;AAGA,MAAM/T,SAAS,IAAI3oB,OAAO88B,MAAX,CAAkB;AAC/BJ,eAAW;AADoB,GAAlB,CAAf;;AAIE;AACFE,QAAMG,aAAN,CAAoB1U,GAApB;AACAuU,QAAMG,aAAN,CAAoBpU,MAApB;AACAA,SAAOoU,aAAP,CAAqB1U,GAArB;;AAEA,MAAM2U,YAAY,IAAIh9B,OAAOi9B,GAAX,CAAe;AAC/B/6B,WAAO,WADwB;AAE/Bg7B,UAAM,CAFyB;AAG/BC,cAAU,IAHqB;AAI/BT,eAAW,EAJoB;AAK/BU,kBAAc;AALiB,GAAf,CAAlB;;AAQAJ,YAAUD,aAAV,CAAwB1U,GAAxB;;AAEA;AACAiU,KAAGz7B,GAAH,CAAO,CAACm8B,SAAD,EAAY3U,GAAZ,EAAiBM,MAAjB,EAAyBiU,KAAzB,CAAP;AACAN,KAAG90B,EAAH,CAAM,uEAAN,EAA+E6zB,OAA/E;;AAEA,8BAAkB3yB,MAAlB,CAAyBrI,OAAzB;AACA,4BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C6zB,OAA9C;AACA,4BAASt7B,CAAT,CAAWM,OAAX,EAAoBc,IAApB,CAAyB,QAAzB,EAAmCm7B,EAAnC;AACD;;AAED,SAAS/zB,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,8BAAkBkI,OAAlB,CAA0BlI,OAA1B;AACA,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+Cy0B,OAA/C;AACA,MAAMiB,KAAK,0BAASv8B,CAAT,CAAWM,OAAX,EAAoBc,IAApB,CAAyB,QAAzB,CAAX;;AAEA,MAAIm7B,EAAJ,EAAQ;AACNA,OAAG11B,GAAH,CAAO,4DAAP,EAAqEy0B,OAArE;AACD;AACF;;AAED;AACA,IAAMgC,aAAa;AACjB30B,gBADiB;AAEjBH;AAFiB,CAAnB;;kBAKe80B,U;;;;;;;;;;;;;;AC9ef;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAM18B,WAAW,OAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM42B,YAAY;AAChB3R,aAAS,IADO;AAEhBloB,YAAQ,IAFQ;AAGhB2D,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CAAnC,GAAuC,EADrC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAAnC,GAAuC,EAFrC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OAPE;AAaP85B,cAAQ;AACNl5B,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CAAnC,GAAuC,EADpC;AAENC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAAnC,GAAuC,EAFpC;AAGN+F,mBAAW,IAHL;AAIN5G,gBAAQ;AAJF,OAbD;AAmBP+5B,YAAM;AACJn5B,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADlC;AAEJC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAAnC,GAAuC,EAFtC;AAGJ+F,mBAAW,IAHP;AAIJ5G,gBAAQ;AAJJ;AAnBC;AAHO,GAAlB;;AA+BA,SAAO65B,SAAP;AACD;AACD;;AAEA,SAASv1B,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMhI,cAAc,0BAASA,WAA7B;;AAEA,MAAM69B,cAAc;AAClBxmB,WAAOrX,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CADW;AAElB3P,SAAK1H,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD;AAFa,GAApB;;AAKA,MAAIo2B,kBAAkB,0BAAS59B,eAAT,CAAyB29B,WAAzB,CAAqCC,eAArC,CAAqDD,WAArD,EAAkE71B,MAAlE,CAAtB;;AAEA,MAAI81B,kBAAkB,CAAtB,EAAyB;AACvB,WAAO,IAAP;AACD;;AAEDD,cAAYxmB,KAAZ,GAAoBrX,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAam2B,MAAhD,CAApB;AACAE,cAAYn2B,GAAZ,GAAkB1H,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAao2B,IAAhD,CAAlB;;AAEAE,oBAAkB,0BAAS59B,eAAT,CAAyB29B,WAAzB,CAAqCC,eAArC,CAAqDD,WAArD,EAAkE71B,MAAlE,CAAlB;;AAEA,SAAQ81B,kBAAkB,CAA1B;AACD;;AAED;AACA,SAASj1B,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;;AAEtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED;AACA,MAAM0D,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACA,MAAIva,cAAJ;AACA,MAAMsG,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMc,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMmE,SAASwX,MAAM1X,gBAAN,EAAf;AACA,MAAMnJ,cAAc,0BAASA,WAA7B;;AAEA,OAAK,IAAI0B,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA;AACA,QAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,QAAM38B,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA;AACA,QAAIH,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACD,KAFD,MAEO;AACLL,cAAQ,qBAAWG,YAAX,EAAR;AACD;;AAED;AACAc,YAAQoF,SAAR;AACApF,YAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,YAAQqF,SAAR,GAAoBA,SAApB;;AAEA,QAAIu0B,oBAAoBn+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa6P,KAA1D,CAAxB;AACA,QAAI+mB,kBAAkBp+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAaE,GAA1D,CAAtB;;AAEAnD,YAAQuZ,MAAR,CAAeqgB,kBAAkB15B,CAAjC,EAAoC05B,kBAAkBz5B,CAAtD;AACAH,YAAQwZ,MAAR,CAAeqgB,gBAAgB35B,CAA/B,EAAkC25B,gBAAgB15B,CAAlD;;AAEAy5B,wBAAoBn+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAam2B,MAA1D,CAApB;AACAS,sBAAkBp+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAao2B,IAA1D,CAAlB;;AAEAr5B,YAAQuZ,MAAR,CAAeqgB,kBAAkB15B,CAAjC,EAAoC05B,kBAAkBz5B,CAAtD;AACAH,YAAQwZ,MAAR,CAAeqgB,gBAAgB35B,CAA/B,EAAkC25B,gBAAgB15B,CAAlD;AACAH,YAAQ4F,MAAR;;AAEA;AACA,+BAAY5F,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC;;AAEA;AACAjD,YAAQyB,SAAR,GAAoB1C,KAApB;;AAEA;AACA;AACA,QAAM+6B,MAAM,CAACv4B,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA7B,IAAkCqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAA3B,CAAnC,IAAoEtD,UAAUmL,KAAV,CAAgBqI,kBAAhG;AACA,QAAM4pB,MAAM,CAACz4B,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAA7B,IAAkCoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA3B,CAAnC,IAAoEvD,UAAUmL,KAAV,CAAgBsI,eAAhG;AACA,QAAM4pB,MAAM,CAAC14B,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAam2B,MAAb,CAAoBl5B,CAA9B,IAAmCqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAao2B,IAAb,CAAkBn5B,CAA5B,CAApC,IAAsEtD,UAAUmL,KAAV,CAAgBqI,kBAAlG;AACA,QAAM8pB,MAAM,CAAC34B,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAam2B,MAAb,CAAoBj5B,CAA9B,IAAmCoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAao2B,IAAb,CAAkBl5B,CAA5B,CAApC,IAAsEvD,UAAUmL,KAAV,CAAgBsI,eAAlG;;AAEA,QAAIiM,SAAQ/a,KAAK44B,IAAL,CAAU54B,KAAK2X,GAAL,CAAS,CAAE4gB,MAAMG,GAAP,GAAeD,MAAME,GAAtB,KAA+B34B,KAAK0b,IAAL,CAAW6c,MAAMA,GAAP,GAAeE,MAAMA,GAA/B,IAAuCz4B,KAAK0b,IAAL,CAAWgd,MAAMA,GAAP,GAAeC,MAAMA,GAA/B,CAAtE,CAAT,CAAV,CAAZ;;AAEA5d,cAAU,MAAM/a,KAAKmE,EAArB;;AAEA,QAAM00B,SAAS,8BAAe9d,MAAf,EAAsB,CAAtB,CAAf;AACA,QAAM+d,MAAM,MAAZ,CAvD6C,CAuDzB;AACpB,QAAMh5B,OAAO+4B,OAAO75B,QAAP,KAAoB+5B,OAAOC,YAAP,CAAoBC,SAASH,GAAT,EAAc,EAAd,CAApB,CAAjC;;AAEA,QAAM3S,QAAQ,CAACkS,kBAAkB15B,CAAlB,GAAsB25B,gBAAgB35B,CAAvC,IAA4C,CAA1D;AACA,QAAMynB,QAAQ,CAACiS,kBAAkBz5B,CAAlB,GAAsB05B,gBAAgB15B,CAAvC,IAA4C,CAA1D;;AAEAH,YAAQU,IAAR,GAAeA,IAAf;AACA,+BAAYV,OAAZ,EAAqBqB,IAArB,EAA2BqmB,KAA3B,EAAkCC,KAAlC,EAAyC5oB,KAAzC;AACAiB,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,IAAMma,QAAQ,+BAAgB;AAC5B9Z,4CAD4B;AAE5B8B,kCAF4B;AAG5BV,8BAH4B;AAI5BpH;AAJ4B,CAAhB,CAAd;;AAOA,IAAM4mB,aAAa,yBAAU;AAC3B5gB,4CAD2B;AAE3B8B,kCAF2B;AAG3BV,8BAH2B;AAI3BpH;AAJ2B,CAAV,CAAnB;;QAQE8f,K,GAAAA,K;QACA8G,U,GAAAA,U;;;;;;;;;;;;;;ACnLF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAM5mB,WAAW,eAAjB;;AAEA;AACA;AApBA;AAqBA,SAASi+B,eAAT,CAA0BC,wBAA1B,EAAoD;AAClDA,2BAAyBC,OAAO,wBAAP,CAAzB;AACD;;AAED,SAASC,kBAAT,CAA6B59B,IAA7B,EAAmCJ,SAAnC,EAA8C89B,wBAA9C,EAAwE;AACtEA,2BAAyBC,OAAO,yBAAP,CAAzB;AACD;;AAED,IAAMt4B,gBAAgB;AACpBo4B,kCADoB;AAEpBG,wCAFoB;AAGpBC,eAAa,KAHO;AAIpBC,sBAAoB,IAJA;AAKpBC,cAAY;AALQ,CAAtB;;AAQA;;AAEA;AACA,SAASz4B,iBAAT,CAA4BC,cAA5B,EAA4C;AAC1C,MAAM9F,kBAAkB+F,qBAAqBD,cAArB,CAAxB;AACA,MAAM9G,cAAc,0BAASA,WAA7B;;AAEA,MAAMmB,YAAY;AAChBa,qBAAiB8E,eAAe/E;AADhB,GAAlB;;AAIA,WAASk9B,wBAAT,CAAmCr5B,IAAnC,EAAyC;AACvC,QAAIA,SAAS,IAAb,EAAmB;AACjB,sCAAgBkB,eAAerG,OAA/B,EAAwCM,QAAxC,EAAkDC,eAAlD;AACD,KAFD,MAEO;AACLA,sBAAgB4E,IAAhB,GAAuBA,IAAvB;AACD;;AAED5E,oBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7D,gBAAYqH,WAAZ,CAAwBP,eAAerG,OAAvC;;AAEA,8BAASN,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCmH,EAAnC,CAAsC,2BAAtC,EAAmEzG,SAAnE,EAA8EymB,cAAc3gB,iBAA5F;AACA,8BAAS9G,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCmH,EAAnC,CAAsC,2BAAtC,EAAmEzG,SAAnE,EAA8EymB,cAAc1gB,iBAA5F;AACA,8BAAS/G,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCmH,EAAnC,CAAsC,mCAAtC,EAA2EzG,SAA3E,EAAsFymB,cAAczgB,yBAApG;AACA,8BAAShH,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCmH,EAAnC,CAAsC,kCAAtC,EAA0EzG,SAA1E,EAAqFymB,cAAcxgB,wBAAnG;AACD;;AAED;AACA,+BAAaN,eAAerG,OAA5B,EAAqCM,QAArC,EAA+CC,eAA/C;;AAEA;AACA;AACA,4BAASb,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCuG,GAAnC,CAAuC,2BAAvC,EAAoE4gB,cAAc3gB,iBAAlF;AACA,4BAAS9G,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCuG,GAAnC,CAAuC,2BAAvC,EAAoE4gB,cAAc1gB,iBAAlF;AACA,4BAAS/G,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCuG,GAAnC,CAAuC,mCAAvC,EAA4E4gB,cAAczgB,yBAA1F;AACA,4BAAShH,CAAT,CAAW2G,eAAerG,OAA1B,EAAmCuG,GAAnC,CAAuC,kCAAvC,EAA2E4gB,cAAcxgB,wBAAzF;;AAEApH,cAAYqH,WAAZ,CAAwBP,eAAerG,OAAvC;AACA,+BAAcqG,cAAd,EAA8B/F,QAA9B,EAAwCC,eAAxC,EAAyDA,gBAAgBwG,OAAhB,CAAwBE,GAAjF,EAAsF,YAAY;AAChG,QAAI,sCAAuBZ,cAAvB,EAAuC9F,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,sCAAgBV,eAAerG,OAA/B,EAAwCM,QAAxC,EAAkDC,eAAlD;AACD;;AAED,QAAMqI,SAASue,cAAcze,gBAAd,EAAf;;AAEA,QAAInI,gBAAgB4E,IAAhB,KAAyB/E,SAA7B,EAAwC;AACtCwI,aAAO21B,eAAP,CAAuBC,wBAAvB;AACD;;AAEDj/B,gBAAYqH,WAAZ,CAAwBP,eAAerG,OAAvC;AACD,GAbD;AAcD;;AAED,SAASsG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM9F,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB2D,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADjC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFjC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OAPE;AAaP07B,eAAS;AACP17B,gBAAQ,KADD;AAEPqP,kBAAU,KAFH;AAGPgJ,4BAAoB,KAHb;AAIPzS,4BAAoB,IAJb;AAKPgD,6BAAqB,IALd;AAMPiE,wBAAgB;AANT;AAbF;AAHa,GAAxB;;AA2BA,SAAO1P,eAAP;AACD;AACD;;AAEA,SAASmH,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMhI,cAAc,0BAASA,WAA7B;;AAEA,MAAM69B,cAAc;AAClBxmB,WAAOrX,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CADW;AAElB3P,SAAK1H,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD;AAFa,GAApB;;AAKA,MAAMo2B,kBAAkB,0BAAS59B,eAAT,CAAyB29B,WAAzB,CAAqCC,eAArC,CAAqDD,WAArD,EAAkE71B,MAAlE,CAAxB;;AAGA,SAAQ81B,kBAAkB,EAA1B;AACD;;AAED;AACA,SAASj1B,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMsZ,iBAAiB3Z,UAAU2Z,cAAjC;AACA,MAAM9a,cAAc,0BAASA,WAA7B;;AAEA;AACA,MAAMuE,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAIva,cAAJ;AACA,MAAMsG,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMc,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMmE,SAASue,cAAcze,gBAAd,EAAf;;AAEA,OAAK,IAAIzH,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA,QAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,QAAM38B,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,QAAIH,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACD,KAFD,MAEO;AACLL,cAAQ,qBAAWG,YAAX,EAAR;AACD;;AAED;AACA,QAAM06B,oBAAoBn+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa6P,KAA1D,CAA1B;AACA,QAAM+mB,kBAAkBp+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAaE,GAA1D,CAAxB;;AAEA;AACA,QAAI2B,OAAOi2B,UAAX,EAAuB;AACrB,+BAAU/6B,OAAV,EAAmB65B,eAAnB,EAAoCD,iBAApC,EAAuD76B,KAAvD,EAA8DsG,SAA9D;AACD,KAFD,MAEO;AACL,+BAAUrF,OAAV,EAAmB45B,iBAAnB,EAAsCC,eAAtC,EAAuD96B,KAAvD,EAA8DsG,SAA9D;AACD;;AAED,QAAM41B,gBAAgB;AACpB91B,2BAAsBL,UAAUA,OAAOg2B;AADnB,KAAtB;;AAIA,QAAIh2B,OAAO+1B,WAAX,EAAwB;AACtB,iCAAY76B,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C,EAAqDk8B,aAArD;AACD;;AAED;AACA,QAAIj+B,KAAKqE,IAAL,IAAarE,KAAKqE,IAAL,KAAc,EAA/B,EAAmC;AACjCrB,cAAQU,IAAR,GAAeA,IAAf;;AAEA;AACA,UAAMw6B,YAAYl7B,QAAQsB,WAAR,CAAoBtE,KAAKqE,IAAzB,EAA+B1B,KAA/B,GAAuC,EAAzD;AACA,UAAMw7B,aAAa,oBAAUt6B,WAAV,KAA0B,EAA7C;;AAEA,UAAImD,WAAWzC,KAAKC,GAAL,CAAS05B,SAAT,EAAoBC,UAApB,IAAkC,CAAlC,GAAsC,CAArD;;AAEA,UAAItB,gBAAgB35B,CAAhB,GAAoB05B,kBAAkB15B,CAA1C,EAA6C;AAC3C8D,mBAAW,CAACA,QAAZ;AACD;;AAED,UAAIo3B,mBAAJ;;AAEA,UAAI,CAACp+B,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAA1B,EAAoC;AAClC,YAAI7J,OAAOi2B,UAAX,EAAuB;AACrBK,uBAAa;AACXl7B,eAAG25B,gBAAgB35B,CAAhB,GAAoBg7B,YAAY,CAAhC,GAAoCl3B,QAD5B;AAEX7D,eAAG05B,gBAAgB15B,CAAhB,GAAoBg7B,aAAa;AAFzB,WAAb;AAID,SALD,MAKO;AACL;AACA;AACAC,uBAAa;AACXl7B,eAAG05B,kBAAkB15B,CAAlB,GAAsBg7B,YAAY,CAAlC,GAAsCl3B,QAD9B;AAEX7D,eAAGy5B,kBAAkBz5B,CAAlB,GAAsBg7B,aAAa;AAF3B,WAAb;AAID;;AAED,YAAME,YAAY5/B,YAAY6/B,QAAZ,CAAqBC,YAArB,CAAkChlB,cAAlC,CAAlB;;AAEA8kB,kBAAUpa,MAAV;;AAEA,YAAMxd,SAAS43B,UAAUG,cAAV,CAAyBJ,WAAWl7B,CAApC,EAAuCk7B,WAAWj7B,CAAlD,CAAf;;AAEAnD,aAAKiG,OAAL,CAAa+3B,OAAb,CAAqB96B,CAArB,GAAyBuD,OAAOvD,CAAhC;AACAlD,aAAKiG,OAAL,CAAa+3B,OAAb,CAAqB76B,CAArB,GAAyBsD,OAAOtD,CAAhC;AACD;;AAEDi7B,mBAAa3/B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa+3B,OAA1D,CAAb;;AAEA,UAAMt5B,cAAc,2BAAY1B,OAAZ,EAAqBhD,KAAKqE,IAA1B,EAAgC+5B,WAAWl7B,CAA3C,EAA8Ck7B,WAAWj7B,CAAzD,EAA4DpB,KAA5D,CAApB;;AAEA/B,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqBt5B,WAArB,GAAmCA,WAAnC;;AAEA,UAAI1E,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjC;AACA,YAAM8sB,OAAO;AACX3oB,iBAAO,EADI;AAEX3P,eAAK;AAFM,SAAb;;AAKA,YAAMu4B,iBAAiB;AACrBx7B,aAAG,CAAC05B,kBAAkB15B,CAAlB,GAAsB25B,gBAAgB35B,CAAvC,IAA4C,CAD1B;AAErBC,aAAG,CAACy5B,kBAAkBz5B,CAAlB,GAAsB05B,gBAAgB15B,CAAvC,IAA4C;AAF1B,SAAvB;;AAKA,YAAM+W,SAAS,CAAC0iB,iBAAD,EAAoBC,eAApB,EAAqC6B,cAArC,CAAf;;AAEAD,aAAKt4B,GAAL,CAASjD,CAAT,GAAak7B,WAAWl7B,CAAxB;AACAu7B,aAAKt4B,GAAL,CAAShD,CAAT,GAAai7B,WAAWj7B,CAAxB;;AAEAs7B,aAAK3oB,KAAL,GAAa,0BAASnX,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDzkB,MAAhD,EAAwDukB,KAAKt4B,GAA7D,CAAb;;AAEA,YAAMy4B,oBAAoB,CAAC;AACzB;AACA17B,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFjB;AAGzBQ,aAAGuB,YAAYI;AAHU,SAAD,EAIvB;AACD;AACA5B,aAAGwB,YAAYG,IAFd;AAGD1B,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,SAJuB,EAQvB;AACD;AACAzB,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFzC;AAGDQ,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC;AAHhC,SARuB,EAYvB;AACD;AACAzB,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAFjC;AAGDQ,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,SAZuB,CAA1B;;AAmBA85B,aAAKt4B,GAAL,GAAW,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDC,iBAAhD,EAAmEH,KAAK3oB,KAAxE,CAAX;;AAEA9S,gBAAQoF,SAAR;AACApF,gBAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,gBAAQqF,SAAR,GAAoBA,SAApB;AACArF,gBAAQ67B,WAAR,CAAoB,CAAC,CAAD,EAAI,CAAJ,CAApB;AACA77B,gBAAQuZ,MAAR,CAAekiB,KAAK3oB,KAAL,CAAW5S,CAA1B,EAA6Bu7B,KAAK3oB,KAAL,CAAW3S,CAAxC;AACAH,gBAAQwZ,MAAR,CAAeiiB,KAAKt4B,GAAL,CAASjD,CAAxB,EAA2Bu7B,KAAKt4B,GAAL,CAAShD,CAApC;AACAH,gBAAQ4F,MAAR;AACD;AACF;;AAED5F,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,SAAS25B,sBAAT,CAAiC71B,cAAjC,EAAiD;AAC/C,MAAM/J,UAAU+J,eAAe/J,OAA/B;AACA,MAAMO,kBAAkB+F,qBAAqByD,cAArB,CAAxB;AACA,MAAMxK,cAAc,0BAASA,WAA7B;;AAEA,WAASi/B,wBAAT,CAAmCr5B,IAAnC,EAAyC;AACvC,QAAIA,SAAS,IAAb,EAAmB;AACjB,sCAAgBnF,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD,KAFD,MAEO;AACLA,sBAAgB4E,IAAhB,GAAuBA,IAAvB;AACD;;AAED5E,oBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,8BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDigB,mBAAmB3c,aAAxE;AACA,8BAAS/K,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DigB,mBAAmBnd,yBAA9E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8CigB,mBAAmBld,WAAjE;AACD;;AAED,+BAAalK,OAAb,EAAsBM,QAAtB,EAAgCC,eAAhC;AACA,4BAASb,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD6gB,mBAAmB3c,aAAzE;AACA,4BAAS/K,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4D6gB,mBAAmBnd,yBAA/E;AACA,4BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+C6gB,mBAAmBld,WAAlE;AACA3K,cAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,oCAAmB+J,cAAnB,EAAmCzJ,QAAnC,EAA6CC,eAA7C,EAA8DA,gBAAgBwG,OAAhB,CAAwBE,GAAtF,EAA2F,YAAY;AACrG1H,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAI,sCAAuB+J,cAAvB,EAAuCxJ,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD;;AAED,QAAMqI,SAASue,cAAcze,gBAAd,EAAf;;AAEA,QAAInI,gBAAgB4E,IAAhB,KAAyB/E,SAA7B,EAAwC;AACtCwI,aAAO21B,eAAP,CAAuBC,wBAAvB;AACD;AACF,GAbD;AAcD;;AAED,SAASqB,mBAAT,CAA8Bz4B,CAA9B,EAAiC1G,SAAjC,EAA4C;AAC1C,MAAMV,UAAUU,UAAUV,OAA1B;AACA,MAAMT,cAAc,0BAASA,WAA7B;AACA,MAAIuB,aAAJ;;AAEA,WAAS09B,wBAAT,CAAmC19B,IAAnC,EAAyCg/B,WAAzC,EAAsDC,UAAtD,EAAkE;AAChE,QAAIA,eAAe,IAAnB,EAAyB;AACvB,sCAAgB//B,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD,KAFD,MAEO;AACLA,WAAKqE,IAAL,GAAY26B,WAAZ;AACD;;AAEDh/B,SAAKsC,MAAL,GAAc,KAAd;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;;AAED,MAAIoH,EAAEtG,IAAF,IAAUsG,EAAEtG,IAAF,CAAOS,eAAjB,IAAoC,CAAC,oCAAqBb,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAzC,EAAwG;AACtG;AACD;;AAED,MAAMqH,SAASue,cAAcze,gBAAd,EAAf;;AAEA,MAAMnB,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,MAAM1G,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA;AACA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,OAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7CH,WAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,QAAIyG,cAAc1H,OAAd,EAAuBc,IAAvB,EAA6ByG,MAA7B,KACI,sCAAuBzG,KAAKiG,OAAL,CAAa+3B,OAApC,EAA6Cv3B,MAA7C,CADR,EAC8D;AAC5DzG,WAAKsC,MAAL,GAAc,IAAd;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACA;AACA4I,aAAO81B,kBAAP,CAA0B59B,IAA1B,EAAgCJ,SAAhC,EAA2C89B,wBAA3C;;AAEAp3B,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;AACF;AACF;;AAED,SAASyC,aAAT,CAAwBrD,CAAxB,EAA2B1G,SAA3B,EAAsC;AACpC,MAAMV,UAAUU,UAAUV,OAA1B;AACA,MAAMT,cAAc,0BAASA,WAA7B;AACA,MAAIuB,aAAJ;;AAEA,WAAS09B,wBAAT,CAAmC19B,IAAnC,EAAyCg/B,WAAzC,EAAsDC,UAAtD,EAAkE;AAChEhe,YAAQrS,GAAR,CAAY,wCAAZ;AACA,QAAIqwB,eAAe,IAAnB,EAAyB;AACvB,sCAAgB//B,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD,KAFD,MAEO;AACLA,WAAKqE,IAAL,GAAY26B,WAAZ;AACD;;AAEDh/B,SAAKsC,MAAL,GAAc,KAAd;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,8BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDigB,mBAAmBjd,kBAAxE;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DigB,mBAAmBnd,yBAA9E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8CigB,mBAAmBld,WAAjE;AACD;;AAED,MAAI9C,EAAEtG,IAAF,IAAUsG,EAAEtG,IAAF,CAAOS,eAAjB,IAAoC,CAAC,oCAAqBb,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAzC,EAAwG;AACtG;AACD;;AAED,MAAMqH,SAASue,cAAcze,gBAAd,EAAf;;AAEA,MAAMnB,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,MAAM1G,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA;AACA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAIL,UAAUghB,aAAd,EAA6B;AAC3B,8BAAShiB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD6gB,mBAAmBjd,kBAAzE;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4D6gB,mBAAmBnd,yBAA/E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+C6gB,mBAAmBld,WAAlE;;AAEA;AACAtB,WAAO81B,kBAAP,CAA0Bh+B,UAAUghB,aAApC,EAAmDhhB,SAAnD,EAA8D89B,wBAA9D;;AAEAp3B,MAAEY,wBAAF;;AAEA,WAAO,KAAP;AACD;;AAED,OAAK,IAAI/G,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7CH,WAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,QAAIyG,cAAc1H,OAAd,EAAuBc,IAAvB,EAA6ByG,MAA7B,KACI,sCAAuBzG,KAAKiG,OAAL,CAAa+3B,OAApC,EAA6Cv3B,MAA7C,CADR,EAC8D;AAC5DzG,WAAKsC,MAAL,GAAc,IAAd;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD6gB,mBAAmBjd,kBAAzE;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4D6gB,mBAAmBnd,yBAA/E;AACA,gCAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+C6gB,mBAAmBld,WAAlE;;AAEA;AACAtB,aAAO81B,kBAAP,CAA0B59B,IAA1B,EAAgCJ,SAAhC,EAA2C89B,wBAA3C;;AAEAp3B,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;AACF;;AAED,SAAO,KAAP,CApEoC,CAoEtB;AACf;;AAED,IAAMmf,gBAAgB,+BAAgB;AACpC/gB,sCADoC;AAEpCE,4CAFoC;AAGpC8B,kCAHoC;AAIpCV,8BAJoC;AAKpCpH,oBALoC;AAMpCqG,4BAA0Bk5B;AANU,CAAhB,CAAtB;;AASA1Y,cAAcxe,gBAAd,CAA+BxC,aAA/B;;AAEA,IAAMihB,qBAAqB,yBAAU;AACnChhB,qBAAmBw5B,sBADgB;AAEnCt5B,4CAFmC;AAGnC8B,kCAHmC;AAInCV,8BAJmC;AAKnCpH,oBALmC;AAMnCmK;AANmC,CAAV,CAA3B;;QASS0c,a,GAAAA,a;QAAeC,kB,GAAAA,kB;;;;;;;;;;;;;;AC9dxB;;;;AACA;;;;AACA;;AACA;;;;AACA;;AACA;;;;;;AAEA,IAAM9mB,WAAW,YAAjB;;AAEA,SAAS0/B,cAAT,CAAyB54B,CAAzB,EAA4B1G,SAA5B,EAAuC;AACrC0G,IAAEY,wBAAF,GADqC,CACP;;AAE9B;AACA,MAAMjH,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED;AACA,MAAMxB,cAAc,0BAASA,WAA7B;AACA,MAAM6tB,gBAAgBhmB,EAAES,aAAxB;AACA,MAAMwmB,uBAAuB9uB,YAAYW,iBAAZ,CAA8BktB,aAA9B,CAA7B;AACA,MAAMkB,gBAAgBD,qBAAqBxiB,KAArB,CAA2BmB,OAAjD;AACA,MAAMuhB,mBAAmBhvB,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6C0tB,aAA7C,CAAzB;;AAEA;AACA,MAAM2R,mBAAmBv/B,UAAU8G,aAAV,CAAwBqE,KAAjD;;AAEA;AACA,MAAM6H,eAAe,8CAAyBusB,gBAAzB,EAA2C1R,gBAA3C,CAArB;;AAEA;AACA,MAAM3E,cAAc7oB,SAASD,IAAT,CAAc,CAAd,EAAiB+oB,sBAArC;AACA,MAAMC,kBAAkBF,YAAYG,iBAAZ,EAAxB;;AAEA;AACAD,kBAAgB5kB,OAAhB,CAAwB,UAAUuX,aAAV,EAAyB;AAC/C;AACA,QAAIA,kBAAkB2Q,aAAtB,EAAqC;AACnC;AACD;;AAED,QAAI2C,cAAcC,OAAOC,SAAzB;AACA,QAAI/W,kBAAkB,CAAC,CAAvB;;AAEA,QAAM2W,sBAAsB,6BAAapT,aAAb,EAA4B,OAA5B,CAA5B;;AAEA,QAAIoT,wBAAwBzvB,SAA5B,EAAuC;AACrC;AACD;;AAED,QAAM6Y,YAAY4W,oBAAoB/uB,IAApB,CAAyB,CAAzB,CAAlB;;AAEA;AACAmY,cAAUI,QAAV,CAAmBnU,OAAnB,CAA2B,UAAU8H,OAAV,EAAmBjH,KAAnB,EAA0B;AACnD,UAAM4N,aAAapU,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CoM,OAA7C,CAAnB;AACA,UAAMkjB,gBAAgB,+BAAiBvc,WAAWG,oBAA5B,CAAtB;AACA,UAAM4G,MAAM,+BAAiB/G,WAAWC,UAA5B,CAAZ;AACA,UAAM+G,SAAS,+BAAiBhH,WAAWE,aAA5B,CAAf;AACA,UAAMqsB,SAASvlB,OAAO5G,KAAP,GAAekC,KAAf,CAAqByE,IAAI3G,KAAJ,EAArB,CAAf;AACA,UAAMjM,WAAWzC,KAAK2X,GAAL,CAASkjB,OAAOnsB,KAAP,GAAeE,GAAf,CAAmBic,aAAnB,IAAoCgQ,OAAOnsB,KAAP,GAAeE,GAAf,CAAmBP,YAAnB,CAA7C,CAAjB;AACA;;AAEA,UAAI5L,WAAWioB,WAAf,EAA4B;AAC1BA,sBAAcjoB,QAAd;AACAoR,0BAAkBnT,KAAlB;AACD;AACF,KAbD;;AAeA,QAAImT,oBAAoBD,UAAUE,mBAAlC,EAAuD;AACrD;AACD;;AAED;AACA,QAAID,oBAAoB,CAAC,CAArB,IAA0BD,UAAUI,QAAV,CAAmBH,eAAnB,MAAwC9Y,SAAtE,EAAiF;AAC/E,UAAMic,sBAAsB,6BAAmBrR,mBAAnB,EAA5B;AACA,UAAMsR,oBAAoB,6BAAmBpR,iBAAnB,EAA1B;AACA,UAAMqR,sBAAsB,6BAAmBnR,sBAAnB,EAA5B;;AAEA,UAAIiR,mBAAJ,EAAyB;AACvBA,4BAAoBI,aAApB;AACD;;AAED,UAAIlE,eAAJ;;AAEA,UAAIU,UAAU3B,YAAV,KAA2B,IAA/B,EAAqC;AACnCiB,iBAAShZ,YAAYiZ,SAAZ,CAAsBS,UAAUI,QAAV,CAAmBH,eAAnB,CAAtB,CAAT;AACD,OAFD,MAEO;AACLX,iBAAShZ,YAAYkZ,iBAAZ,CAA8BQ,UAAUI,QAAV,CAAmBH,eAAnB,CAA9B,CAAT;AACD;;AAEDX,aAAOT,IAAP,CAAY,UAAUjM,KAAV,EAAiB;AAC3B,YAAMqQ,WAAW3c,YAAY4c,WAAZ,CAAwBM,aAAxB,CAAjB;;AAEAxD,kBAAUE,mBAAV,GAAgCD,eAAhC;AACA3Z,oBAAYid,YAAZ,CAAyBC,aAAzB,EAAwC5Q,KAAxC,EAA+CqQ,QAA/C;AACA,YAAII,iBAAJ,EAAuB;AACrBA,4BAAkBG,aAAlB,EAAiC5Q,KAAjC;AACD;AACF,OARD,EAQG,UAAUkM,KAAV,EAAiB;AAClB,YAAM/K,UAAUiM,UAAUI,QAAV,CAAmBH,eAAnB,CAAhB;;AAEA,YAAIqD,mBAAJ,EAAyB;AACvBA,8BAAoBE,aAApB,EAAmCzP,OAAnC,EAA4C+K,KAA5C;AACD;AACF,OAdD;AAeD;AACF,GAvED;AAwED;;AAED,SAASnF,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiM,iBAA/D;AACA,4BAAS9S,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,8BAAS7B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqL,iBAA9D;AACA,8BAAS9S,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACAotB,mBAAe54B,CAAf,EAAkB1G,SAAlB;;AAEA,WAAO,KAAP,CALiE,CAKnD;AACf;AACF;;AAED,SAAS8R,iBAAT,CAA4BpL,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxCs/B,iBAAe54B,CAAf,EAAkB1G,SAAlB;;AAEA,SAAO,KAAP,CAHwC,CAG1B;AACf;;AAED,SAAS2H,MAAT,CAAiBrI,OAAjB,EAA0BuB,eAA1B,EAA2CsoB,sBAA3C,EAAmE;AACjE,MAAMnpB,YAAY;AAChBa;AADgB,GAAlB;;AAIE;AACF,iCAAevB,OAAf,EAAwBM,QAAxB;;AAEA,+BAAaN,OAAb,EAAsBM,QAAtB,EAAgC;AAC9BupB;AAD8B,GAAhC;;AAIA,4BAASnqB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;;AAEA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D+F,iBAA/D;AACD;;AAED;AACA,SAASyB,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACD;;AAED;AACA,IAAM4gB,aAAa;AACjB9e,YAAUF,MADO;AAEjBG,cAAYN,OAFK;AAGjBG,gBAHiB;AAIjBH;AAJiB,CAAnB;;AAOA,SAASi4B,eAAT,CAA0B/4B,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6D45B,eAA7D;AACD;;AAED,SAASC,iBAAT,CAA4Bh5B,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqX,YAA9D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4Dg5B,eAA5D;AACAH,iBAAe54B,CAAf,EAAkB1G,SAAlB;;AAEA,SAAO,KAAP;AACD;;AAED,SAAS8d,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnCs/B,iBAAe54B,CAAf,EAAkB1G,SAAlB;;AAEA,SAAO,KAAP,CAHmC,CAGrB;AACf;;AAED,SAAS2/B,WAAT,CAAsBrgC,OAAtB,EAA+B6pB,sBAA/B,EAAuD;AACrD;AACA,iCAAe7pB,OAAf,EAAwBM,QAAxB;;AAEA,+BAAaN,OAAb,EAAsBM,QAAtB,EAAgC;AAC9BupB;AAD8B,GAAhC;;AAIA,4BAASnqB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD65B,iBAAtD;;AAEA,4BAAS1gC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDi5B,iBAArD;AACD;;AAED;AACA,SAASE,YAAT,CAAuBtgC,OAAvB,EAAgC;AAC9B,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD65B,iBAAtD;AACD;;AAED,IAAM9Y,kBAAkB;AACtB/e,YAAU83B,WADY;AAEtB73B,cAAY83B,YAFU;AAGtBj4B,UAAQg4B,WAHc;AAItBn4B,WAASo4B;AAJa,CAAxB;;QAQEjZ,U,GAAAA,U;QACAC,e,GAAAA,e;;;;;;;;;;;;;AChNF;;;;AACA;;;;;;AAEA,SAASiZ,mBAAT,CAA8B7/B,SAA9B,EAAyC;AACvC,4BAASnB,WAAT,CAAqBihC,WAArB,CAAiC9/B,UAAUV,OAA3C;AACD;;AAED,SAAS0K,iBAAT,CAA4BtD,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC+/B,gBAAcC,QAAd,CAAuBhgC,SAAvB;;AAEA,SAAO,KAAP,CAHwC,CAG1B;AACf;;AAED,IAAM+/B,gBAAgB,6BAAc/1B,iBAAd,CAAtB;;AAEA+1B,cAAcE,UAAd,GAA2B;AACzBtwB,WAASkwB;AADgB,CAA3B;;AAIAE,cAAcC,QAAd,GAAyBH,mBAAzB;;kBAEeE,a;;;;;;;;;;;;;;ACrBf;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,IAAIG,sBAAJ;;AAEA,SAASC,eAAT,CAA0BngC,SAA1B,EAAqC;AACnC,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAM8a,iBAAiB9a,YAAYW,iBAAZ,CAA8BQ,UAAUV,OAAxC,CAAvB;;AAEA,MAAM8D,UAAUuW,eAAe5S,MAAf,CAAsBwiB,UAAtB,CAAiC,IAAjC,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMva,QAAQ,qBAAWK,cAAX,EAAd;AACA,MAAMsB,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMq8B,aAAa,oBAAUn8B,WAAV,EAAnB;AACA,MAAMiE,SAAS2e,UAAU7e,gBAAV,EAAf;;AAEA5E,UAAQgB,IAAR;;AAEA,MAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,YAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,YAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,YAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,MAAMz5B,IAAIqB,KAAKqU,KAAL,CAAWhZ,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAAzC,CAAV;AACA,MAAMC,IAAIoB,KAAKqU,KAAL,CAAWhZ,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAAzC,CAAV;;AAEA,MAAI2hB,qBAAJ;AACA,MAAIzgB,aAAJ;AAAA,MACEg5B,YADF;;AAGA,MAAIn6B,IAAI,CAAJ,IAASC,IAAI,CAAb,IAAkBD,KAAKtD,UAAUmL,KAAV,CAAgB4I,OAAvC,IAAkDxQ,KAAKvD,UAAUmL,KAAV,CAAgB8I,IAA3E,EAAiF;AAC/E;AACD;;AAED,MAAIjU,UAAUmL,KAAV,CAAgBhJ,KAApB,EAA2B;AACzB+iB,mBAAe,4BAAallB,UAAUV,OAAvB,EAAgCgE,CAAhC,EAAmCC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,CAAf;AACAkB,WAAUnB,CAAV,UAAgBC,CAAhB;AACAk6B,kBAAYvY,aAAa,CAAb,CAAZ,YAAkCA,aAAa,CAAb,CAAlC,YAAwDA,aAAa,CAAb,CAAxD,YAA8EA,aAAa,CAAb,CAA9E;AACD,GAJD,MAIO;AACLA,mBAAermB,YAAYwhC,eAAZ,CAA4BrgC,UAAUV,OAAtC,EAA+CgE,CAA/C,EAAkDC,CAAlD,EAAqD,CAArD,EAAwD,CAAxD,CAAf;AACA,QAAMuc,KAAKoF,aAAa,CAAb,CAAX;AACA,QAAMob,KAAKxgB,KAAK9f,UAAUmL,KAAV,CAAgBsC,KAArB,GAA6BzN,UAAUmL,KAAV,CAAgBuC,SAAxD;AACA,QAAMuB,MAAM,4BAAajP,UAAUmL,KAAvB,EAA8B2U,EAA9B,CAAZ;;AAEA;AACArb,WAAUnB,CAAV,UAAgBC,CAAhB;AACAk6B,mBAAa3d,EAAb,aAAuB3Q,WAAWmxB,GAAGC,OAAH,CAAW,CAAX,CAAX,CAAvB;AACA,QAAItxB,GAAJ,EAAS;AACPwuB,wBAAgBtuB,WAAWF,IAAIsxB,OAAJ,CAAY,CAAZ,CAAX,CAAhB;AACD;AACF;;AAED;AACA,MAAM15B,SAAS;AACb;AACAvD,OAAGtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAA9B,GAAkC,CAFxB;AAGbC,OAAGvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAA9B,GAAkC;AAHxB,GAAf;AAKA,MAAMi7B,aAAa3/B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6CuH,MAA7C,CAAnB;;AAEAzD,UAAQU,IAAR,GAAeA,IAAf;AACAV,UAAQyB,SAAR,GAAoB1C,KAApB;;AAEA,6BAAYiB,OAAZ,EAAqBq6B,GAArB,EAA0Be,WAAWl7B,CAArC,EAAwCk7B,WAAWj7B,CAAX,GAAe68B,UAAf,GAA4B,CAApE,EAAuEj+B,KAAvE;AACA,6BAAYiB,OAAZ,EAAqBqB,IAArB,EAA2B+5B,WAAWl7B,CAAtC,EAAyCk7B,WAAWj7B,CAApD,EAAuDpB,KAAvD;AACAiB,UAAQmC,OAAR;AACD;;AAED,SAASi7B,eAAT,CAA0BxgC,SAA1B,EAAqC;AACnC,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;AACA,MAAMqa,iBAAiB9a,YAAYW,iBAAZ,CAA8BF,OAA9B,CAAvB;AACA,MAAM6L,QAAQwO,eAAexO,KAA7B;;AAEA,MAAM/H,UAAUuW,eAAe5S,MAAf,CAAsBwiB,UAAtB,CAAiC,IAAjC,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMva,QAAQ,qBAAWK,cAAX,EAAd;AACA,MAAMsB,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMmE,SAAS2e,UAAU7e,gBAAV,EAAf;;AAEA5E,UAAQgB,IAAR;;AAEA,MAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,YAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,YAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,YAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,MAAMzvB,eAAezO,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,qBAAzB,EAAgDiL,MAAMmB,OAAtD,CAArB;AACA,MAAIiB,iBAAJ;;AAEA,MAAID,YAAJ,EAAkB;AAChBC,eAAWD,aAAaC,QAAxB;AACD;;AAED,MAAIkzB,mBAAJ;;AAEA,MAAIzgC,UAAU86B,YAAV,KAA2B,IAA/B,EAAqC;AACnC2F,iBAAa5hC,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCU,UAAU8G,aAAV,CAAwB6L,IAAxB,CAA6BrP,CAA9D,EACXtD,UAAU8G,aAAV,CAAwB6L,IAAxB,CAA6BpP,CAA7B,GAAiC,oBAAUU,WAAV,KAA0B,CADhD,CAAb;AAED,GAHD,MAGO;AACLw8B,iBAAa5hC,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCU,UAAU8G,aAAV,CAAwB6L,IAAxB,CAA6BrP,CAA9D,EACXtD,UAAU8G,aAAV,CAAwB6L,IAAxB,CAA6BpP,CAA7B,GAAiC,oBAAUU,WAAV,KAA0B,CADhD,CAAb;AAED;;AAED,MAAIihB,qBAAJ;AACA,MAAIzgB,OAAO,EAAX;;AAEA,MAAIg8B,WAAWn9B,CAAX,GAAe,CAAf,IAAoBm9B,WAAWl9B,CAAX,GAAe,CAAnC,IACEk9B,WAAWn9B,CAAX,IAAgB6H,MAAM4I,OADxB,IACmC0sB,WAAWl9B,CAAX,IAAgB4H,MAAM8I,IAD7D,EACmE;AACjE;AACD;;AAED,MAAI9I,MAAMhJ,KAAV,EAAiB;AACf+iB,mBAAe,4BAAa5lB,OAAb,EAAsBmhC,WAAWn9B,CAAjC,EAAoCm9B,WAAWl9B,CAA/C,EAAkD,CAAlD,EAAqD,CAArD,CAAf;AACAkB,mBAAaygB,aAAa,CAAb,CAAb,YAAmCA,aAAa,CAAb,CAAnC,YAAyDA,aAAa,CAAb,CAAzD;AACD,GAHD,MAGO;AACLA,mBAAermB,YAAYwhC,eAAZ,CAA4B/gC,OAA5B,EAAqCmhC,WAAWn9B,CAAhD,EAAmDm9B,WAAWl9B,CAA9D,EAAiE,CAAjE,EAAoE,CAApE,CAAf;AACA,QAAMuc,KAAKoF,aAAa,CAAb,CAAX;AACA,QAAMob,KAAKxgB,KAAK9f,UAAUmL,KAAV,CAAgBsC,KAArB,GAA6BzN,UAAUmL,KAAV,CAAgBuC,SAAxD;;AAEA,QAAMgzB,yBAAyBvxB,WAAWmxB,GAAGC,OAAH,CAAW,CAAX,CAAX,CAA/B;;AAEA,QAAIhzB,aAAa,IAAjB,EAAuB;AACrB9I,uBAAei8B,sBAAf;AACD,KAFD,MAEO,IAAInzB,aAAa,IAAjB,EAAuB;AAC5B9I,cAAQi8B,sBAAR;AACA,UAAMzxB,MAAM,4BAAajP,UAAUmL,KAAvB,EAA8B2U,EAA9B,CAAZ;;AAEA,UAAI7Q,GAAJ,EAAS;AACPxK,2BAAiB0K,WAAWF,IAAIsxB,OAAJ,CAAY,CAAZ,CAAX,CAAjB;AACD;AACF,KAPM,MAOA;AACL97B,cAAQi8B,sBAAR;AACD;AACF;;AAED;AACA,MAAMlC,aAAa3/B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCmhC,UAAnC,CAAnB;;AAEAr9B,UAAQU,IAAR,GAAeA,IAAf;AACAV,UAAQyB,SAAR,GAAoB1C,KAApB;;AAEA;AACA,MAAI4tB,oBAAJ;AACA,MAAMlnB,eAAe,CAArB;AACA,MAAM9F,QAAQK,QAAQsB,WAAR,CAAoBD,IAApB,EAA0B1B,KAAxC;;AAEA,MAAI/C,UAAU86B,YAAV,KAA2B,IAA/B,EAAqC;AACnC/K,kBAAc;AACZzsB,SAAG,CAACP,KAAD,GAAS,CAAT,GAAa,CADJ;AAEZQ,SAAG,CAAC,oBAAUU,WAAV,EAAD,GAA2B,EAA3B,GAAgC,IAAI4E;AAF3B,KAAd;AAID,GALD,MAKO;AACLknB,kBAAc;AACZzsB,SAAG,EADS;AAEZC,SAAG,EAAE,oBAAUU,WAAV,KAA0B,EAA5B,IAAkC;AAFzB,KAAd;AAID;;AAEDb,UAAQoF,SAAR;AACApF,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQwF,GAAR,CAAY41B,WAAWl7B,CAAvB,EAA0Bk7B,WAAWj7B,CAArC,EAAwCsF,YAAxC,EAAsD,CAAtD,EAAyD,IAAIlE,KAAKmE,EAAlE;AACA1F,UAAQ4F,MAAR;;AAEA,6BAAY5F,OAAZ,EAAqBqB,IAArB,EAA2B+5B,WAAWl7B,CAAX,GAAeysB,YAAYzsB,CAAtD,EAAyDk7B,WAAWj7B,CAAX,GAAewsB,YAAYxsB,CAApF,EAAuFpB,KAAvF;AACAiB,UAAQmC,OAAR;AACD;;AAED,SAAS2M,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEAA,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDk5B,qBAAxD;AACA,4BAAS3hC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDqM,eAAtD;AACA,4BAASrT,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAASyG,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,MAAI,oCAAqBU,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjEvB,YAAQsI,gBAAR,CAAyB,0BAAzB,EAAqD+4B,qBAArD;AACA,8BAAS3hC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDqX,YAApD;AACA,8BAAS9e,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkDyL,eAAlD;AACA,8BAASlT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDyL,eAArD;AACA2U,cAAUmZ,QAAV,CAAmBhgC,SAAnB;;AAEA,WAAO,KAAP,CAPiE,CAOnD;AACf;AACF;;AAED,SAAS2gC,qBAAT,GAAkC;AAChC,MAAIT,aAAJ,EAAmB;AACjBrZ,cAAUmZ,QAAV,CAAmBE,aAAnB;AACAA,oBAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA,SAASpiB,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA4gC,kBAAgBlgC,SAAhB;AACA,4BAASnB,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;;AAEA,SAAO,KAAP,CANmC,CAMrB;AACf;;AAED,IAAMunB,YAAY,qCAAsB9gB,iBAAtB,CAAlB;;AAEA8gB,UAAUoZ,UAAV,GAAuB;AACrBtwB,WAASwwB,eADY;AAErBS,WAASJ;AAFY,CAAvB;;AAKA3Z,UAAUmZ,QAAV,GAAqBG,eAArB;;AAEA,IAAM38B,UAAU;AACdsH,oBAAkB;AADJ,CAAhB;;AAIA,IAAMgc,iBAAiB,6BAAchJ,YAAd,EAA4Bta,OAA5B,CAAvB;;QAGEqjB,S,GAAAA,S;QACAC,c,GAAAA,c;;;;;;;;;;;;;;ACjPF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAMlnB,WAAW,eAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM9F,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB8D,iBAAa,IAHS;AAItBH,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADjC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFjC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OAPE;AAaP07B,eAAS;AACP17B,gBAAQ,KADD;AAEPqP,kBAAU,KAFH;AAGPgJ,4BAAoB,KAHb;AAIPzS,4BAAoB,IAJb;AAKPgD,6BAAqB,IALd;AAMPiE,wBAAgB;AANT;AAbF;AAJa,GAAxB;;AA4BA,SAAO1P,eAAP;AACD;AACD;;AAEA;AACA,SAASghC,gBAAT,CAA2BvhC,OAA3B,EAAoCc,IAApC,EAA0CyG,MAA1C,EAAkDO,QAAlD,EAA4D;AAC1D,MAAMvI,cAAc,0BAASA,WAA7B;AACA,MAAMiiC,cAAcjiC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAApB;AACA,MAAM6qB,YAAYliC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAlB;;AAEA,MAAMy6B,eAAe;AACnB/7B,UAAMN,KAAKqN,GAAL,CAAS8uB,YAAYx9B,CAArB,EAAwBy9B,UAAUz9B,CAAlC,IAAuC8D,WAAW,CADrC;AAEnBlC,SAAKP,KAAKqN,GAAL,CAAS8uB,YAAYv9B,CAArB,EAAwBw9B,UAAUx9B,CAAlC,IAAuC6D,WAAW,CAFpC;AAGnBrE,WAAO4B,KAAK2X,GAAL,CAASwkB,YAAYx9B,CAAZ,GAAgBy9B,UAAUz9B,CAAnC,IAAwC8D,QAH5B;AAInBrC,YAAQJ,KAAK2X,GAAL,CAASwkB,YAAYv9B,CAAZ,GAAgBw9B,UAAUx9B,CAAnC,IAAwC6D;AAJ7B,GAArB;;AAOA,MAAM65B,eAAe;AACnBh8B,UAAMN,KAAKqN,GAAL,CAAS8uB,YAAYx9B,CAArB,EAAwBy9B,UAAUz9B,CAAlC,IAAuC8D,WAAW,CADrC;AAEnBlC,SAAKP,KAAKqN,GAAL,CAAS8uB,YAAYv9B,CAArB,EAAwBw9B,UAAUx9B,CAAlC,IAAuC6D,WAAW,CAFpC;AAGnBrE,WAAO4B,KAAK2X,GAAL,CAASwkB,YAAYx9B,CAAZ,GAAgBy9B,UAAUz9B,CAAnC,IAAwC8D,QAH5B;AAInBrC,YAAQJ,KAAK2X,GAAL,CAASwkB,YAAYv9B,CAAZ,GAAgBw9B,UAAUx9B,CAAnC,IAAwC6D;AAJ7B,GAArB;;AAOA,MAAM85B,sBAAsB,8BAAeF,YAAf,EAA6Bn6B,MAA7B,CAA5B;AACA,MAAMs6B,sBAAsB,8BAAeF,YAAf,EAA6Bp6B,MAA7B,CAA5B;;AAEA,MAAIs6B,uBAAuB,CAACD,mBAA5B,EAAiD;AAC/C,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD;;AAED,SAASl6B,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,SAAOg6B,iBAAiBvhC,OAAjB,EAA0Bc,IAA1B,EAAgCyG,MAAhC,EAAwC,EAAxC,CAAP;AACD;;AAED,SAASu6B,kBAAT,CAA6B9hC,OAA7B,EAAsCc,IAAtC,EAA4CyG,MAA5C,EAAoD;AAClD,SAAOg6B,iBAAiBvhC,OAAjB,EAA0Bc,IAA1B,EAAgCyG,MAAhC,EAAwC,EAAxC,CAAP;AACD;;AAED,SAASw6B,gBAAT,CAA2B/9B,CAA3B,EAA8B;AAC5B;AACA,MAAMg+B,QAAQh+B,EAAEK,QAAF,GAAa0N,KAAb,CAAmB,GAAnB,CAAd;;AAEAiwB,QAAM,CAAN,IAAWA,MAAM,CAAN,EAAS1wB,OAAT,CAAiB,uBAAjB,EAA0C,GAA1C,CAAX;;AAEA,SAAO0wB,MAAM3wB,IAAN,CAAW,GAAX,CAAP;AACD;;AAED,SAASjJ,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMxB,cAAc,0BAASA,WAA7B;AACA,MAAMsM,QAAQnL,UAAUmL,KAAxB;AACA,MAAM7L,UAAUU,UAAUV,OAA1B;AACA,MAAMmJ,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMkF,SAAS6e,cAAc/e,gBAAd,EAAf;AACA,MAAM5E,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;AACA,MAAMjc,eAAezO,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,qBAAzB,EAAgDiL,MAAMmB,OAAtD,CAArB;AACA,MAAIiB,iBAAJ;;AAEA,MAAID,YAAJ,EAAkB;AAChBC,eAAWD,aAAaC,QAAxB;AACD;;AAEDnK,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACA,OAAK,IAAInc,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA,QAAMhE,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA;AACA,QAAI2H,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED;AACA,QAAM56B,QAAQ,qBAAWM,gBAAX,CAA4BrC,KAAKsC,MAAjC,CAAd;;AAEA;AACA,QAAMs6B,oBAAoBn+B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAA1B;AACA,QAAM+mB,kBAAkBp+B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAxB;;AAEA;AACA;AACA,QAAMg7B,aAAa58B,KAAKqN,GAAL,CAASgrB,kBAAkB15B,CAA3B,EAA8B25B,gBAAgB35B,CAA9C,CAAnB;AACA,QAAMk+B,YAAY78B,KAAKqN,GAAL,CAASgrB,kBAAkBz5B,CAA3B,EAA8B05B,gBAAgB15B,CAA9C,CAAlB;AACA,QAAMk+B,cAAc98B,KAAK2X,GAAL,CAAS0gB,kBAAkB15B,CAAlB,GAAsB25B,gBAAgB35B,CAA/C,CAApB;AACA,QAAMo+B,eAAe/8B,KAAK2X,GAAL,CAAS0gB,kBAAkBz5B,CAAlB,GAAsB05B,gBAAgB15B,CAA/C,CAArB;;AAEA;AACAH,YAAQoF,SAAR;AACApF,YAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,YAAQqF,SAAR,GAAoBA,SAApB;AACA,+BAAYrF,OAAZ,EAAqBm+B,UAArB,EAAiCC,SAAjC,EAA4CC,WAA5C,EAAyDC,YAAzD;AACAt+B,YAAQoc,SAAR;;AAEA;AACA;AACA,QAAItX,UAAUA,OAAOg2B,kBAArB,EAAyC;AACvC;AACA,UAAI99B,KAAKsC,MAAL,KAAgB,IAApB,EAA0B;AACxB,mCAAYU,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;AACD,OAFD,MAEO;AACL;AACA;AACA,YAAMk8B,gBAAgB;AACpB91B,+BAAqB;AADD,SAAtB;;AAIA,mCAAYnF,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C,EAAqDk8B,aAArD;AACD;AACF,KAbD,MAaO;AACL;AACA,iCAAYj7B,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;AACD;;AAED;AACA,QAAIw/B,aAAJ;AAAA,QACEC,mBADF;AAAA,QAEEC,sBAFF;;AAIA;AACA;AACA;AACA,QAAIzhC,KAAKoG,WAAL,KAAqB,KAAzB,EAAgC;AAC9B;AACAo7B,mBAAaxhC,KAAKwhC,UAAlB;AACAC,sBAAgBzhC,KAAKyhC,aAArB;AACAF,aAAOvhC,KAAKuhC,IAAZ;AACD,KALD,MAKO;AACL;;AAEA;AACA,UAAM1oB,UAAU;AACdhU,cAAMN,KAAKqU,KAAL,CAAWrU,KAAKqN,GAAL,CAAS5R,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA5B,EAA+BlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAhD,CAAX,CADQ;AAEd4B,aAAKP,KAAKqU,KAAL,CAAWrU,KAAKqN,GAAL,CAAS5R,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAA5B,EAA+BnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAhD,CAAX,CAFS;AAGdR,eAAO4B,KAAKqU,KAAL,CAAWrU,KAAK2X,GAAL,CAASlc,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAAnB,GAAuBlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAjD,CAAX,CAHO;AAIdyB,gBAAQJ,KAAKqU,KAAL,CAAWrU,KAAK2X,GAAL,CAASlc,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAAnB,GAAuBnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAjD,CAAX;AAJM,OAAhB;;AAOA;AACA;AACA,UAAI,CAAC4H,MAAMhJ,KAAX,EAAkB;AAChB;AACA,YAAM2/B,SAASjjC,YAAYkjC,SAAZ,CAAsBziC,OAAtB,EAA+B2Z,QAAQhU,IAAvC,EAA6CgU,QAAQ/T,GAArD,EAA0D+T,QAAQlW,KAAlE,EAAyEkW,QAAQlU,MAAjF,CAAf;;AAEA;AACA68B,qBAAa,0CAA2BE,MAA3B,EAAmC7oB,OAAnC,CAAb;;AAEA,YAAI1L,aAAa,IAAjB,EAAuB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACAs0B,0BAAgB;AACd3hB,kBAAM,4BAAa/U,KAAb,EAAoB,CAACy2B,WAAW1hB,IAAX,GAAkB/U,MAAMuC,SAAzB,IAAsCvC,MAAMsC,KAAhE,CADQ;AAEd2S,oBAAQ,4BAAajV,KAAb,EAAoB,CAACy2B,WAAWxhB,MAAX,GAAoBjV,MAAMuC,SAA3B,IAAwCvC,MAAMsC,KAAlE;AAFM,WAAhB;AAID;;AAED;AACA,YAAIm0B,cAAc,CAACI,MAAMJ,WAAW1hB,IAAjB,CAAnB,EAA2C;AACzC9f,eAAKwhC,UAAL,GAAkBA,UAAlB;AACAxhC,eAAKyhC,aAAL,GAAqBA,aAArB;AACD;AACF;;AAED;AACA;AACA,UAAMruB,qBAAqBrI,MAAMqI,kBAAN,IAA4B,CAAvD;AACA,UAAMC,kBAAkBtI,MAAMsI,eAAN,IAAyB,CAAjD;;AAEA;AACAkuB,aAAOh9B,KAAKmE,EAAL,IAAWmQ,QAAQlW,KAAR,GAAgByQ,kBAAhB,GAAqC,CAAhD,KAAsDyF,QAAQlU,MAAR,GAAiB0O,eAAjB,GAAmC,CAAzF,CAAP;;AAEA;AACA,UAAI,CAACuuB,MAAML,IAAN,CAAL,EAAkB;AAChBvhC,aAAKuhC,IAAL,GAAYA,IAAZ;AACD;;AAED;AACAvhC,WAAKoG,WAAL,GAAmB,KAAnB;AACD;;AAED;AACA,QAAMnD,YAAY,EAAlB;;AAEA;AACA,QAAIu+B,cAAcA,WAAW1hB,IAAX,KAAoBxgB,SAAtC,EAAiD;AAC/C;AACA,UAAIuiC,WAAW,EAAf;;AAEA,UAAI10B,aAAa,IAAjB,EAAuB;AACrB00B,mBAAW,KAAX;AACD;;AAED;AACA,UAAIC,sBAAoBb,iBAAiBO,WAAW1hB,IAAX,CAAgBqgB,OAAhB,CAAwB,CAAxB,CAAjB,CAApB,GAAmE0B,QAAvE;AACA;AACA,UAAIE,0BAAwBd,iBAAiBO,WAAWxhB,MAAX,CAAkBmgB,OAAlB,CAA0B,CAA1B,CAAjB,CAAxB,GAAyE0B,QAA7E;;AAEA;AACA,UAAIJ,iBAAiBA,cAAc3hB,IAAd,KAAuBxgB,SAA5C,EAAuD;AACrD,YAAM0iC,UAAU,QAAhB;;AAEAF,oBAAYE,UAAUf,iBAAiBQ,cAAc3hB,IAAd,CAAmBqgB,OAAnB,CAA2B,CAA3B,CAAjB,CAAtB;AACA4B,sBAAcC,UAAUf,iBAAiBQ,cAAczhB,MAAd,CAAqBmgB,OAArB,CAA6B,CAA7B,CAAjB,CAAxB;AACD;;AAED;AACAl9B,gBAAUyJ,IAAV,CAAeo1B,QAAf;AACA7+B,gBAAUyJ,IAAV,CAAeq1B,UAAf;AACD;;AAED;AACA,QAAIR,IAAJ,EAAU;AACR;AACA;AACA;AACA,UAAIU,iBAAe3E,OAAOC,YAAP,CAAoB,GAApB,CAAnB;;AAEA,UAAI,CAACxyB,MAAMsI,eAAP,IAA0B,CAACtI,MAAMqI,kBAArC,EAAyD;AACvD6uB,6BAAmB3E,OAAOC,YAAP,CAAoB,GAApB,CAAnB;AACD;;AAED;AACA,UAAM2E,sBAAoBjB,iBAAiBM,KAAKpB,OAAL,CAAa,CAAb,CAAjB,CAApB,GAAwD8B,MAA9D;;AAEA;AACAh/B,gBAAUyJ,IAAV,CAAew1B,QAAf;AACD;;AAED;AACA;AACA,QAAI,CAACliC,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAA1B,EAAoC;AAClC;AACA;AACA3R,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqB96B,CAArB,GAAyBqB,KAAKC,GAAL,CAASxE,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA5B,EAA+BlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAhD,CAAzB;AACAlD,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqB76B,CAArB,GAAyB,CAACnD,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAAnB,GAAuBnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAzC,IAA8C,CAAvE;AACD;;AAED;AACA,QAAMi7B,aAAa3/B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa+3B,OAAhD,CAAnB;;AAEA;AACA,QAAM56B,UAAU;AACdwB,iBAAW;AACT1B,WAAG,KADM;AAETC,WAAG;AAFM;AADG,KAAhB;;AAOA;AACA,QAAMuB,cAAc,2BAAY1B,OAAZ,EAAqBC,SAArB,EAAgCm7B,WAAWl7B,CAA3C,EAClBk7B,WAAWj7B,CADO,EACJpB,KADI,EACGqB,OADH,CAApB;;AAGA;AACApD,SAAKiG,OAAL,CAAa+3B,OAAb,CAAqBt5B,WAArB,GAAmCA,WAAnC;;AAEA;AACA;AACA;AACA,QAAI1E,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjC;;AAEA;AACA;AACA,UAAM8sB,OAAO;AACX3oB,eAAO,EADI;AAEX3P,aAAK;AACHjD,aAAGk7B,WAAWl7B,CADX;AAEHC,aAAGi7B,WAAWj7B;AAFX;AAFM,OAAb;;AAQA;AACA,UAAMg/B,gBAAgB,CAAC;AACrB;AACAj/B,WAAGi+B,aAAaE,cAAc,CAFT;AAGrBl+B,WAAGi+B;AAHkB,OAAD,EAInB;AACD;AACAl+B,WAAGi+B,UAFF;AAGDh+B,WAAGi+B,YAAYE,eAAe;AAH7B,OAJmB,EAQnB;AACD;AACAp+B,WAAGi+B,aAAaE,cAAc,CAF7B;AAGDl+B,WAAGi+B,YAAYE;AAHd,OARmB,EAYnB;AACD;AACAp+B,WAAGi+B,aAAaE,WAFf;AAGDl+B,WAAGi+B,YAAYE,eAAe;AAH7B,OAZmB,CAAtB;;AAkBA;AACA;AACA7C,WAAK3oB,KAAL,GAAa,0BAASnX,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDwD,aAAhD,EAA+D1D,KAAKt4B,GAApE,CAAb;;AAEA;AACA,UAAMy4B,oBAAoB,CAAC;AACzB;AACA17B,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFjB;AAGzBQ,WAAGuB,YAAYI;AAHU,OAAD,EAIvB;AACD;AACA5B,WAAGwB,YAAYG,IAFd;AAGD1B,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,OAJuB,EAQvB;AACD;AACAzB,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFzC;AAGDQ,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC;AAHhC,OARuB,EAYvB;AACD;AACAzB,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAFjC;AAGDQ,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,OAZuB,CAA1B;;AAkBA;AACA;AACA85B,WAAKt4B,GAAL,GAAW,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDC,iBAAhD,EAAmEH,KAAK3oB,KAAxE,CAAX;;AAEA;AACA9S,cAAQoF,SAAR;AACApF,cAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,cAAQqF,SAAR,GAAoBA,SAApB;AACArF,cAAQ67B,WAAR,CAAoB,CAAC,CAAD,EAAI,CAAJ,CAApB;AACA77B,cAAQuZ,MAAR,CAAekiB,KAAK3oB,KAAL,CAAW5S,CAA1B,EAA6Bu7B,KAAK3oB,KAAL,CAAW3S,CAAxC;AACAH,cAAQwZ,MAAR,CAAeiiB,KAAKt4B,GAAL,CAASjD,CAAxB,EAA2Bu7B,KAAKt4B,GAAL,CAAShD,CAApC;AACAH,cAAQ4F,MAAR;AACD;;AAED5F,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,IAAMwhB,gBAAgB,+BAAgB;AACpCnhB,4CADoC;AAEpC8B,kCAFoC;AAGpCV,8BAHoC;AAIpCpH;AAJoC,CAAhB,CAAtB;;AAOA,IAAMonB,qBAAqB,yBAAU;AACnCphB,4CADmC;AAEnC8B,kCAFmC;AAGnCV,iBAAeo6B,kBAHoB;AAInCxhC;AAJmC,CAAV,CAA3B;;QAOSmnB,a,GAAAA,a;QAAeC,kB,GAAAA,kB;;;;;;;;;;;;;;AC5ZxB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAMpnB,WAAW,UAAjB;AACA,IAAI6F,gBAAgB;AAClB+8B,iBAAe;AACbn8B,aAAS;AACP6P,aAAO;AACL5M,mBAAW,IADN;AAEL5G,gBAAQ;AAFH;AADA;AADI,GADG;AASlBukB,YAAU,KATQ;AAUlBwb,aAAW,KAVO;AAWlBC,iBAAe,CAXG;AAYlBC,eAAa,CAAC;AAZI,CAApB;;AAeA;AACA,SAASC,QAAT,CAAmB5iC,SAAnB,EAA8B;AAC5B,MAAMK,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED,MAAMwI,SAAS+e,SAASjf,gBAAT,EAAf;;AAEA;AACA;AACA,MAAM5H,OAAOC,SAASD,IAAT,CAAc8H,OAAOy6B,WAArB,CAAb;;AAEA,MAAME,aAAa;AACjBv/B,OAAGtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CADhB;AAEjBC,OAAGvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAFhB;AAGjB+F,eAAW,IAHM;AAIjB5G,YAAQ,IAJS;AAKjBogC,WAAO;AALU,GAAnB;;AAQE;AACF,MAAI1iC,KAAKiG,OAAL,CAAa7F,MAAjB,EAAyB;AACvB;AACAJ,SAAKiG,OAAL,CAAa6B,OAAOw6B,aAAP,GAAuB,CAApC,EAAuCI,KAAvC,CAA6Ch2B,IAA7C,CAAkD9M,UAAU8G,aAAV,CAAwBqE,KAA1E;AACD;;AAED;AACA/K,OAAKiG,OAAL,CAAayG,IAAb,CAAkB+1B,UAAlB;;AAEA;AACA36B,SAAOw6B,aAAP,IAAwB,CAAxB;;AAEA;AACAx6B,SAAO+e,QAAP,GAAkB,KAAlB;;AAEA;AACA,4BAASpoB,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAASgQ,eAAT,CAA0BtP,SAA1B,EAAqC+iC,SAArC,EAAgD;AAC9C,MAAM1iC,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED,MAAMU,OAAOC,SAASD,IAAT,CAAc2iC,SAAd,CAAb;;AAEA,MAAI3iC,KAAKiG,OAAL,KAAiB3G,SAArB,EAAgC;AAC9B;AACD;;AAED,MAAMsjC,aAAahjC,UAAU8G,aAAV,CAAwBC,MAA3C;;AAEA,OAAK,IAAIxG,IAAI,CAAb,EAAgBA,IAAIH,KAAKiG,OAAL,CAAa7F,MAAjC,EAAyCD,GAAzC,EAA8C;AAC5C,QAAMiP,eAAe,0BAAS3Q,WAAT,CAAqB8J,aAArB,CAAmC3I,UAAUV,OAA7C,EAAsDc,KAAKiG,OAAL,CAAa9F,CAAb,CAAtD,CAArB;;AAEA,QAAI,0BAASxB,eAAT,CAAyBwM,KAAzB,CAA+BnE,QAA/B,CAAwCoI,YAAxC,EAAsDwzB,UAAtD,IAAoE,CAAxE,EAA2E;AACzE,aAAOziC,CAAP;AACD;AACF;;AAED;AACD;;AAED,SAAS0iC,uBAAT,CAAkCjjC,SAAlC,EAA6C;AAC3C,MAAMK,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAI6iC,qBAAJ;;AAEA,OAAK,IAAIH,YAAY,CAArB,EAAwBA,YAAY1iC,SAASD,IAAT,CAAcI,MAAlD,EAA0DuiC,WAA1D,EAAuE;AACrEG,mBAAe5zB,gBAAgBtP,SAAhB,EAA2B+iC,SAA3B,CAAf;AACA,QAAIG,iBAAiBxjC,SAArB,EAAgC;AAC9B,aAAO;AACLwjC,kCADK;AAELH;AAFK,OAAP;AAID;AACF;AACF;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS7wB,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;;AAEA;AACA,MAAM7R,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED,MAAMwI,SAAS+e,SAASjf,gBAAT,EAAf;;AAEA,MAAI,CAAChI,UAAUmB,KAAV,CAAgB43B,QAArB,EAA+B;AAC7B7wB,WAAO+e,QAAP,GAAkB,KAAlB;AACD;;AAED,4BAASpoB,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAASwG,iBAAT,CAA4BY,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAMK,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAM6H,SAAS+e,SAASjf,gBAAT,EAAf;;AAEA,MAAM5H,OAAOC,SAASD,IAAT,CAAc8H,OAAOy6B,WAArB,CAAb;;AAEA;AACA,MAAIr/B,IAAIqB,KAAKC,GAAL,CAAS5E,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAAvC,EAA0C,CAA1C,CAAR;;AAEAA,MAAIqB,KAAKqN,GAAL,CAAS1O,CAAT,EAAYtD,UAAUmL,KAAV,CAAgBpI,KAA5B,CAAJ;AACAmF,SAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC5S,CAAnC,GAAuCA,CAAvC;;AAEA,MAAIC,IAAIoB,KAAKC,GAAL,CAAS5E,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAAvC,EAA0C,CAA1C,CAAR;;AAEAA,MAAIoB,KAAKqN,GAAL,CAASzO,CAAT,EAAYvD,UAAUmL,KAAV,CAAgBpG,MAA5B,CAAJ;AACAmD,SAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC3S,CAAnC,GAAuCA,CAAvC;;AAEA,MAAMm/B,gBAAgBx6B,OAAOw6B,aAA7B;;AAEA,MAAIx6B,OAAOu6B,SAAX,EAAsB;AACpB;AACAriC,SAAKsC,MAAL,GAAc,IAAd;AACAtC,SAAKkJ,SAAL,GAAiB,IAAjB;AACAlJ,SAAKiG,OAAL,CAAaq8B,aAAb,EAA4Bp/B,CAA5B,GAAgC4E,OAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC5S,CAAnE;AACAlD,SAAKiG,OAAL,CAAaq8B,aAAb,EAA4Bn/B,CAA5B,GAAgC2E,OAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC3S,CAAnE;AACA,QAAIm/B,aAAJ,EAAmB;AACjB,UAAMS,gBAAgB/iC,KAAKiG,OAAL,CAAaq8B,gBAAgB,CAA7B,EAAgCI,KAAhC,CAAsCtiC,MAAtC,GAA+C,CAArE;AACA,UAAM4iC,WAAWhjC,KAAKiG,OAAL,CAAaq8B,gBAAgB,CAA7B,EAAgCI,KAAhC,CAAsCK,aAAtC,CAAjB;;AAEAC,eAAS9/B,CAAT,GAAa4E,OAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC5S,CAAhD;AACA8/B,eAAS7/B,CAAT,GAAa2E,OAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC3S,CAAhD;AACD;AACF;;AAED,MAAI2E,OAAO+e,QAAX,EAAqB;AACnB7mB,SAAKiG,OAAL,CAAaq8B,gBAAgB,CAA7B,EAAgCI,KAAhC,CAAsCh2B,IAAtC,CAA2C9M,UAAU8G,aAAV,CAAwBqE,KAAnE;AACD,GAFD,MAEO;AACL;AACA,QAAM+3B,eAAe5zB,gBAAgBtP,SAAhB,EAA2BkI,OAAOy6B,WAAlC,CAArB;;AAEA;AACA;AACA,QAAIO,iBAAiBxjC,SAAjB,IAA8BwjC,eAAgB9iC,KAAKiG,OAAL,CAAa7F,MAAb,GAAsB,CAAxE,EAA4E;AAC1E0H,aAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC5S,CAAnC,GAAuClD,KAAKiG,OAAL,CAAa68B,YAAb,EAA2B5/B,CAAlE;AACA4E,aAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC3S,CAAnC,GAAuCnD,KAAKiG,OAAL,CAAa68B,YAAb,EAA2B3/B,CAAlE;AACD;AACF;;AAED;AACA,4BAAS1E,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAAS+jC,YAAT,CAAuBrjC,SAAvB,EAAkC;AAChC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DX,iBAA9D;AACA,4BAAS9G,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;;AAEA,MAAMrS,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB2D,aAAS;AAHa,GAAxB;;AAMA,MAAM6B,SAAS+e,SAASjf,gBAAT,EAAf;;AAEAE,SAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC5S,CAAnC,GAAuCtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CAArE;AACA4E,SAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA7B,CAAmC3S,CAAnC,GAAuCvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H,CAArE;;AAEA,+BAAavD,UAAUV,OAAvB,EAAgCM,QAAhC,EAA0CC,eAA1C;;AAEA,MAAMQ,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEAsI,SAAOy6B,WAAP,GAAqBtiC,SAASD,IAAT,CAAcI,MAAd,GAAuB,CAA5C;AACD;;AAED,SAAS8iC,UAAT,CAAqBtjC,SAArB,EAAgCkjC,YAAhC,EAA8C;AAC5C,MAAM7iC,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAM6H,SAAS+e,SAASjf,gBAAT,EAAf;;AAEA,MAAM5H,OAAOC,SAASD,IAAT,CAAc8H,OAAOy6B,WAArB,CAAb;;AAEAviC,OAAKsC,MAAL,GAAc,KAAd;AACAtC,OAAKkJ,SAAL,GAAiB,KAAjB;;AAEA;AACA,MAAI45B,iBAAiBxjC,SAArB,EAAgC;AAC9B;AACAU,SAAKiG,OAAL,CAAa6B,OAAOw6B,aAAP,GAAuB,CAApC,EAAuCI,KAAvC,CAA6Ch2B,IAA7C,CAAkD;AAChDxJ,SAAGlD,KAAKiG,OAAL,CAAa68B,YAAb,EAA2B5/B,CADkB;AAEhDC,SAAGnD,KAAKiG,OAAL,CAAa68B,YAAb,EAA2B3/B;AAFkB,KAAlD;AAID;;AAED,MAAI2E,OAAOu6B,SAAX,EAAsB;AACpBv6B,WAAOu6B,SAAP,GAAmB,KAAnB;AACD;;AAED;AACAv6B,SAAOw6B,aAAP,GAAuB,CAAvB;AACAx6B,SAAOy6B,WAAP,GAAqB,CAAC,CAAtB;;AAEA,4BAAS3jC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DC,iBAA/D;;AAEA,4BAASjH,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAASyG,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,QAAMR,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,QAAIsjC,qBAAJ;AAAA,QAAkBH,kBAAlB;;AAEA,QAAM76B,SAAS+e,SAASjf,gBAAT,EAAf;AACA,QAAM26B,cAAcz6B,OAAOy6B,WAA3B;;AAEA,QAAIz6B,OAAOu6B,SAAX,EAAsB;AACpBa,iBAAWtjC,SAAX;;AAEA;AACD;;AAED,QAAI2iC,cAAc,CAAlB,EAAqB;AACnB,UAAMY,SAASN,wBAAwBjjC,SAAxB,CAAf;;AAEA,UAAIujC,MAAJ,EAAY;AACVL,uBAAeK,OAAOL,YAAtB;AACAH,oBAAYQ,OAAOR,SAAnB;AACA;AACA,YAAIG,iBAAiBxjC,SAArB,EAAgC;AAC9B,oCAASV,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DX,iBAA9D;AACA,oCAAS9G,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACAhK,iBAAOu6B,SAAP,GAAmB,IAAnB;AACAv6B,iBAAOw6B,aAAP,GAAuBQ,YAAvB;AACAh7B,iBAAOy6B,WAAP,GAAqBI,SAArB;AACD;AACF,OAXD,MAWO;AACLM,qBAAarjC,SAAb;AACA4iC,iBAAS5iC,SAAT;AACD;AACF,KAlBD,MAkBO,IAAI2iC,eAAe,CAAf,IAAoBtiC,SAASD,IAAT,CAAcuiC,WAAd,EAA2BjgC,MAAnD,EAA2D;AAChEwgC,qBAAe5zB,gBAAgBtP,SAAhB,EAA2B2iC,WAA3B,CAAf;AACA,UAAIO,iBAAiBxjC,SAArB,EAAgC;AAC9B4jC,mBAAWtjC,SAAX,EAAsBkjC,YAAtB;AACD,OAFD,MAEO,IAAIljC,UAAUmB,KAAV,CAAgB43B,QAApB,EAA8B;AACnC7wB,eAAO+e,QAAP,GAAkB,IAAlB;AACD,OAFM,MAEA;AACL2b,iBAAS5iC,SAAT;AACD;AACF;;AAED,WAAO,KAAP,CA3CiE,CA2CnD;AACf;AACF;;AAED;;AAEA;AACA,SAAS0H,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3B,MAAM1G,YAAY0G,EAAExF,MAApB;;AAEA;AACA,MAAMb,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED,MAAMb,cAAc,0BAASA,WAA7B;AACA,MAAMqJ,SAAS+e,SAASjf,gBAAT,EAAf;;AAEA;AACA,MAAM5E,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAIva,cAAJ;AACA,MAAMsG,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAIf,YAAY,qBAAWG,YAAX,EAAhB;;AAEA,OAAK,IAAI7B,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA,QAAMhE,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,QAAIH,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACAP,kBAAY,qBAAWG,YAAX,EAAZ;AACD,KAHD,MAGO;AACLD,cAAQ,qBAAWG,YAAX,EAAR;AACAL,kBAAY,qBAAWK,YAAX,EAAZ;AACD;;AAED,QAAIkhC,oBAAJ;;AAEA,QAAIpjC,KAAKiG,OAAL,CAAa7F,MAAjB,EAAyB;AACvB,WAAK,IAAIijC,IAAI,CAAb,EAAgBA,IAAIrjC,KAAKiG,OAAL,CAAa7F,MAAjC,EAAyCijC,GAAzC,EAA8C;AAC5C;AACAD,sBAAcpjC,KAAKiG,OAAL,CAAao9B,CAAb,CAAd;AACA,YAAMzG,oBAAoBn+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6CkkC,WAA7C,CAA1B;;AAEApgC,gBAAQoF,SAAR;AACApF,gBAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,gBAAQqF,SAAR,GAAoBA,SAApB;AACArF,gBAAQuZ,MAAR,CAAeqgB,kBAAkB15B,CAAjC,EAAoC05B,kBAAkBz5B,CAAtD;;AAEA,aAAK,IAAImgC,IAAI,CAAb,EAAgBA,IAAItjC,KAAKiG,OAAL,CAAao9B,CAAb,EAAgBX,KAAhB,CAAsBtiC,MAA1C,EAAkDkjC,GAAlD,EAAuD;AACrD,cAAMC,aAAa9kC,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAao9B,CAAb,EAAgBX,KAAhB,CAAsBY,CAAtB,CAA7C,CAAnB;;AAEAtgC,kBAAQwZ,MAAR,CAAe+mB,WAAWrgC,CAA1B,EAA6BqgC,WAAWpgC,CAAxC;AACAH,kBAAQ4F,MAAR;AACD;;AAED,YAAM46B,sBAAsB/kC,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6C4I,OAAOs6B,aAAP,CAAqBn8B,OAArB,CAA6B6P,KAA1E,CAA5B;;AAEA,YAAIutB,MAAOrjC,KAAKiG,OAAL,CAAa7F,MAAb,GAAsB,CAAjC,EAAqC;AACnC,cAAIJ,KAAKsC,MAAL,IAAe,CAACwF,OAAO+e,QAAvB,IAAmC,CAAC/e,OAAOu6B,SAA/C,EAA0D;AACxD;AACA;AACAr/B,oBAAQwZ,MAAR,CAAegnB,oBAAoBtgC,CAAnC,EAAsCsgC,oBAAoBrgC,CAA1D;AACAH,oBAAQ4F,MAAR;AACD;AACF;AACF;AACF;;AAED;AACA,QAAMxF,UAAU;AACduF,YAAM9G;AADQ,KAAhB;;AAIA,QAAI7B,KAAKsC,MAAT,EAAiB;AACf,iCAAYU,OAAZ,EAAqBpD,SAArB,EAAgCkI,OAAOs6B,aAAP,CAAqBn8B,OAArD,EAA8DlE,KAA9D,EAAqEqB,OAArE;AACD;AACD;AACA,+BAAYJ,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C,EAAqDqB,OAArD;;AAEAJ,YAAQmC,OAAR;AACD;AACF;AACD;AACA,SAASoC,MAAT,CAAiBrI,OAAjB,EAA0B;AACxB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACAxG,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;;AAEApI,UAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,4BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,SAASkI,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACAxG,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACA,4BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,SAASuI,QAAT,CAAmBvI,OAAnB,EAA4BuB,eAA5B,EAA6C;AAC3C,MAAMb,YAAY;AAChBa;AADgB,GAAlB;;AAIA,4BAAS7B,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqD7F,SAArD,EAAgE+F,iBAAhE;AACA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACAxG,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;;AAEApI,UAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACA,4BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D+F,iBAA/D;;AAEA,4BAASlH,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,SAASwI,UAAT,CAAqBxI,OAArB,EAA8B;AAC5B,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDC,iBAArD;AACAxG,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;;AAEApI,UAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;;AAEA,4BAAS7I,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,SAAS0I,gBAAT,GAA6B;AAC3B,SAAOvC,aAAP;AACD;;AAED,SAASwC,gBAAT,CAA2BC,MAA3B,EAAmC;AACjCzC,kBAAgByC,MAAhB;AACD;;AAED;AACA,IAAM+e,WAAW;AACftf,gBADe;AAEfH,kBAFe;AAGfK,oBAHe;AAIfC,wBAJe;AAKfE,oCALe;AAMfC;AANe,CAAjB;;QASSgf,Q,GAAAA,Q;;;;;;;;;;;;;;ACncT;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAMrnB,WAAW,WAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAMk+B,mBAAmB,6BAAal+B,eAAexE,KAAf,CAAqBgG,aAAlC,EAAiDvH,QAAjD,CAAzB;;AAEA,MAAIikC,oBAAoBA,iBAAiBzjC,IAArC,IAA6CyjC,iBAAiBzjC,IAAjB,CAAsBI,MAAtB,GAA+B,CAAhF,EAAmF;AACjF;AACD;;AAED;AACA,MAAMX,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB2D,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADjC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFjC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL;AAPE;AAHa,GAAxB;;AAmBA,SAAO7C,eAAP;AACD;AACD;;AAEA,SAAS8iB,eAAT,CAA0BrjB,OAA1B,EAAmCc,IAAnC,EAAyCyG,MAAzC,EAAiD;AAC/C,MAAMhI,cAAc,0BAASA,WAA7B;AACA,MAAMiiC,cAAcjiC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAApB;AACA,MAAM6qB,YAAYliC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAlB;;AAEA,MAAM4N,OAAO;AACXlP,UAAMN,KAAKqN,GAAL,CAAS8uB,YAAYx9B,CAArB,EAAwBy9B,UAAUz9B,CAAlC,CADK;AAEX4B,SAAKP,KAAKqN,GAAL,CAAS8uB,YAAYv9B,CAArB,EAAwBw9B,UAAUx9B,CAAlC,CAFM;AAGXR,WAAO4B,KAAK2X,GAAL,CAASwkB,YAAYx9B,CAAZ,GAAgBy9B,UAAUz9B,CAAnC,CAHI;AAIXyB,YAAQJ,KAAK2X,GAAL,CAASwkB,YAAYv9B,CAAZ,GAAgBw9B,UAAUx9B,CAAnC;AAJG,GAAb;;AAOA,MAAIugC,YAAY,KAAhB;;AAEA,MAAKj9B,OAAOvD,CAAP,IAAY6Q,KAAKlP,IAAjB,IAAyB4B,OAAOvD,CAAP,IAAa6Q,KAAKlP,IAAL,GAAYkP,KAAKpR,KAAxD,IAAmE8D,OAAOtD,CAAP,IAAY4Q,KAAKjP,GAApF,IAA2F2B,OAAOtD,CAAP,IAAa4Q,KAAKjP,GAAL,GAAWiP,KAAKpP,MAA5H,EAAqI;AACnI++B,gBAAY,IAAZ;AACD;;AAED,SAAOA,SAAP;AACD;;AAED,SAAS98B,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMhI,cAAc,0BAASA,WAA7B;AACA,MAAMiiC,cAAcjiC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAApB;AACA,MAAM6qB,YAAYliC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAlB;;AAEA,MAAM4N,OAAO;AACXlP,UAAMN,KAAKqN,GAAL,CAAS8uB,YAAYx9B,CAArB,EAAwBy9B,UAAUz9B,CAAlC,CADK;AAEX4B,SAAKP,KAAKqN,GAAL,CAAS8uB,YAAYv9B,CAArB,EAAwBw9B,UAAUx9B,CAAlC,CAFM;AAGXR,WAAO4B,KAAK2X,GAAL,CAASwkB,YAAYx9B,CAAZ,GAAgBy9B,UAAUz9B,CAAnC,CAHI;AAIXyB,YAAQJ,KAAK2X,GAAL,CAASwkB,YAAYv9B,CAAZ,GAAgBw9B,UAAUx9B,CAAnC;AAJG,GAAb;;AAOA,MAAMo5B,kBAAkB,0BAAS59B,eAAT,CAAyBoV,IAAzB,CAA8BwoB,eAA9B,CAA8CxoB,IAA9C,EAAoDtN,MAApD,CAAxB;;AAGA,SAAQ81B,kBAAkB,CAA1B;AACD;;AAED;;AAEA,SAASj1B,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAIS,aAAaX,SAAjB,EAA4B;AAC1B;AACD;;AAED,MAAMb,cAAc,0BAASA,WAA7B;AACA;AACA,MAAMuE,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAIva,cAAJ;AACA,MAAMsG,YAAY,oBAAUzF,YAAV,EAAlB;;AAEAI,UAAQgB,IAAR;;AAEA,MAAMhE,OAAOC,SAASD,IAAT,CAAc,CAAd,CAAb;;AAEA,MAAI,CAACA,IAAL,EAAW;AACT;AACD;;AAED,MAAIA,KAAKsC,MAAT,EAAiB;AACfP,YAAQ,qBAAWK,cAAX,EAAR;AACD,GAFD,MAEO;AACLL,YAAQ,qBAAWG,YAAX,EAAR;AACD;;AAED,MAAM06B,oBAAoBn+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa6P,KAA1D,CAA1B;AACA,MAAM+mB,kBAAkBp+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAaE,GAA1D,CAAxB;;AAEA,MAAM4N,OAAO;AACXlP,UAAMN,KAAKqN,GAAL,CAASgrB,kBAAkB15B,CAA3B,EAA8B25B,gBAAgB35B,CAA9C,CADK;AAEX4B,SAAKP,KAAKqN,GAAL,CAASgrB,kBAAkBz5B,CAA3B,EAA8B05B,gBAAgB15B,CAA9C,CAFM;AAGXR,WAAO4B,KAAK2X,GAAL,CAAS0gB,kBAAkB15B,CAAlB,GAAsB25B,gBAAgB35B,CAA/C,CAHI;AAIXyB,YAAQJ,KAAK2X,GAAL,CAAS0gB,kBAAkBz5B,CAAlB,GAAsB05B,gBAAgB15B,CAA/C;AAJG,GAAb;;AAOE;AACFH,UAAQoF,SAAR;AACApF,UAAQkB,WAAR,GAAsB,aAAtB;;AAEAlB,UAAQ+Q,IAAR,CAAa,CAAb,EAAgB,CAAhB,EAAmB/Q,QAAQ2D,MAAR,CAAeg9B,WAAlC,EAA+C3gC,QAAQ2D,MAAR,CAAei9B,YAA9D;;AAEA5gC,UAAQ+Q,IAAR,CAAaA,KAAKpR,KAAL,GAAaoR,KAAKlP,IAA/B,EAAqCkP,KAAKjP,GAA1C,EAA+C,CAACiP,KAAKpR,KAArD,EAA4DoR,KAAKpP,MAAjE;AACA3B,UAAQ4F,MAAR;AACA5F,UAAQyB,SAAR,GAAoB,iBAApB;AACAzB,UAAQ2F,IAAR;AACA3F,UAAQoc,SAAR;;AAEA;AACApc,UAAQoF,SAAR;AACApF,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQqF,SAAR,GAAoBA,SAApB;AACArF,UAAQ67B,WAAR,CAAoB,CAAC,CAAD,CAApB;AACA77B,UAAQ6gC,UAAR,CAAmB9vB,KAAKlP,IAAxB,EAA8BkP,KAAKjP,GAAnC,EAAwCiP,KAAKpR,KAA7C,EAAoDoR,KAAKpP,MAAzD;;AAEA;AACA3B,UAAQ67B,WAAR,CAAoB,EAApB;;AAEA;AACA,6BAAY77B,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;AACAiB,UAAQmC,OAAR;AACD;AACD;;AAEA;AACA,IAAMe,4BAA4B,IAAlC;;AAEA,IAAMgD,YAAY,wCAAyB;AACzC1D,4CADyC;AAEzC8B,kCAFyC;AAGzCV,8BAHyC;AAIzC2b,kCAJyC;AAKzC/iB;AALyC,CAAzB,EAMf0G,yBANe,CAAlB;;AAQA,IAAM4gB,iBAAiB,yBAAU;AAC/BthB,4CAD+B;AAE/B8B,kCAF+B;AAG/BV,8BAH+B;AAI/B2b,kCAJ+B;AAK/B/iB;AAL+B,CAAV,EAMpB0G,yBANoB,CAAvB;;QASEgD,S,GAAAA,S;QACA4d,c,GAAAA,c;;;;;;;;;;;;;AC9KF;;;;AACA;;;;;;AAEA,SAASxf,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAMmL,QAAQnL,UAAUmL,KAAxB;AACA,MAAM+4B,QAAQ/4B,MAAM+4B,KAApB;;AAEA,MAAM9gC,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMrZ,YAAY,EAAlB;;AAEAI,SAAO2C,IAAP,CAAY89B,KAAZ,EAAmB1/B,OAAnB,CAA2B,UAAU2/B,GAAV,EAAe;AACxC,QAAM1/B,OAAU0/B,GAAV,WAAmBD,MAAMC,GAAN,CAAzB;;AAEA9gC,cAAUyJ,IAAV,CAAerI,IAAf;AACD,GAJD;;AAMA,6BAAYrB,OAAZ,EAAqBC,SAArB,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,QAAtC;;AAEAA,YAAUmB,OAAV,CAAkB,UAAUC,IAAV,EAAgB;AAChC4c,YAAQrS,GAAR,CAAYvK,IAAZ;AACD,GAFD;AAGD;;AAED,IAAM2/B,aAAa,2BAAY18B,eAAZ,CAAnB;;kBAEe08B,U;;;;;;;;;;;;;;AC5Bf;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAMxkC,WAAW,QAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM9F,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB2D,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADjC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFjC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OAPE;AAaP07B,eAAS;AACP17B,gBAAQ,KADD;AAEPqP,kBAAU,KAFH;AAGPgJ,4BAAoB,KAHb;AAIPzS,4BAAoB,IAJb;AAKPgD,6BAAqB,IALd;AAMPiE,wBAAgB;AANT;AAbF;AAHa,GAAxB;;AA2BA,SAAO1P,eAAP;AACD;AACD;;AAEA,SAASmH,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMhI,cAAc,0BAASA,WAA7B;AACA,MAAM69B,cAAc;AAClBxmB,WAAOrX,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CADW;AAElB3P,SAAK1H,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD;AAFa,GAApB;AAIA,MAAMo2B,kBAAkB,0BAAS59B,eAAT,CAAyB29B,WAAzB,CAAqCC,eAArC,CAAqDD,WAArD,EAAkE71B,MAAlE,CAAxB;;AAGA,SAAQ81B,kBAAkB,EAA1B;AACD;;AAED;AACA,SAASj1B,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMxB,cAAc,0BAASA,WAA7B;AACA;AACA,MAAMuE,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;AAVsC,MAW9Bpe,KAX8B,GAWXnL,SAXW,CAW9BmL,KAX8B;AAAA,MAWvB7L,OAXuB,GAWXU,SAXW,CAWvBV,OAXuB;;;AAatC8D,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMjU,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMkF,SAAS1H,OAAOwH,gBAAP,EAAf;AACA,MAAMiL,aAAapU,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CiL,MAAMmB,OAAnD,CAAnB;AACA,MAAImH,wBAAJ;AACA,MAAI4wB,wBAAJ;;AAEA,MAAIpxB,UAAJ,EAAgB;AACdQ,sBAAkBR,WAAWQ,eAAX,IAA8BR,WAAWqxB,oBAA3D;AACAD,sBAAkBpxB,WAAWO,kBAAX,IAAiCP,WAAWsxB,oBAA9D;AACD,GAHD,MAGO;AACL9wB,sBAAkBtI,MAAMsI,eAAxB;AACA4wB,sBAAkBl5B,MAAMqI,kBAAxB;AACD;;AAED,OAAK,IAAIjT,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA;AACA,QAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,QAAM38B,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;AACA,QAAM4B,QAAQ,qBAAWM,gBAAX,CAA4BrC,KAAKsC,MAAjC,CAAd;;AAEA;AACA,QAAMs6B,oBAAoBn+B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAA1B;AACA,QAAM+mB,kBAAkBp+B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAxB;;AAEA;AACAnD,YAAQoF,SAAR;AACApF,YAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,YAAQqF,SAAR,GAAoBA,SAApB;AACArF,YAAQuZ,MAAR,CAAeqgB,kBAAkB15B,CAAjC,EAAoC05B,kBAAkBz5B,CAAtD;AACAH,YAAQwZ,MAAR,CAAeqgB,gBAAgB35B,CAA/B,EAAkC25B,gBAAgB15B,CAAlD;AACAH,YAAQ4F,MAAR;;AAEA;AACA,QAAMq1B,gBAAgB;AACpB91B,2BAAsBL,UAAUA,OAAOg2B;AADnB,KAAtB;;AAIA,+BAAY96B,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C,EAAqDk8B,aAArD;;AAEA;AACAj7B,YAAQyB,SAAR,GAAoB1C,KAApB;;AAEA;AACA,QAAMqiC,KAAK,CAACpkC,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAjB,GAAqBlD,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAAzC,KAA+CmQ,mBAAmB,CAAlE,CAAX;AACA,QAAMgxB,KAAK,CAACrkC,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAjB,GAAqBnD,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAAzC,KAA+C8gC,mBAAmB,CAAlE,CAAX;;AAEA;AACA,QAAM7jC,UAASmE,KAAK0b,IAAL,CAAUmkB,KAAKA,EAAL,GAAUC,KAAKA,EAAzB,CAAf;;AAEA;AACArkC,SAAKI,MAAL,GAAcA,OAAd;;AAEA;AACA,QAAI6hC,SAAS,KAAb;;AAEA,QAAI,CAAC5uB,eAAD,IAAoB,CAAC4wB,eAAzB,EAA0C;AACxChC,eAAS,SAAT;AACD;;AAED;AACA,QAAM59B,YAAUjE,QAAO+/B,OAAP,CAAe,CAAf,CAAV,GAA8B8B,MAApC;;AAEA,QAAI,CAACjiC,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAA1B,EAAoC;AAClC,UAAMlL,SAAS;AACbvD,WAAGqB,KAAKC,GAAL,CAASxE,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA5B,EAA+BlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAhD;AADU,OAAf;;AAIA;AACA;AACA,UAAIuD,OAAOvD,CAAP,KAAalD,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAApC,EAAuC;AACrCuD,eAAOtD,CAAP,GAAWnD,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAA9B;AACD,OAFD,MAEO;AACLsD,eAAOtD,CAAP,GAAWnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA5B;AACD;;AAEDnD,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqB96B,CAArB,GAAyBuD,OAAOvD,CAAhC;AACAlD,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqB76B,CAArB,GAAyBsD,OAAOtD,CAAhC;AACD;;AAED,QAAMi7B,aAAa3/B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa+3B,OAA1D,CAAnB;;AAEA;AACA;AACAI,eAAWl7B,CAAX,IAAgB,EAAhB;;AAEA,QAAME,UAAU;AACdwB,iBAAW;AACT1B,WAAG,KADM;AAETC,WAAG;AAFM;AADG,KAAhB;;AAOA;AACA,QAAMuB,cAAc,2BAAY1B,OAAZ,EAAqBqB,IAArB,EAA2B+5B,WAAWl7B,CAAtC,EAAyCk7B,WAAWj7B,CAApD,EAAuDpB,KAAvD,EAA8DqB,OAA9D,CAApB;;AAEApD,SAAKiG,OAAL,CAAa+3B,OAAb,CAAqBt5B,WAArB,GAAmCA,WAAnC;;AAEA,QAAI1E,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjC;AACA,UAAM8sB,OAAO;AACX3oB,eAAO,EADI;AAEX3P,aAAK;AAFM,OAAb;;AAKA,UAAMu4B,iBAAiB;AACrBx7B,WAAG,CAAC05B,kBAAkB15B,CAAlB,GAAsB25B,gBAAgB35B,CAAvC,IAA4C,CAD1B;AAErBC,WAAG,CAACy5B,kBAAkBz5B,CAAlB,GAAsB05B,gBAAgB15B,CAAvC,IAA4C;AAF1B,OAAvB;;AAKA,UAAM+W,SAAS,CAAC0iB,iBAAD,EAAoBC,eAApB,EAAqC6B,cAArC,CAAf;;AAEAD,WAAKt4B,GAAL,CAASjD,CAAT,GAAak7B,WAAWl7B,CAAxB;AACAu7B,WAAKt4B,GAAL,CAAShD,CAAT,GAAai7B,WAAWj7B,CAAxB;;AAEAs7B,WAAK3oB,KAAL,GAAa,0BAASnX,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDzkB,MAAhD,EAAwDukB,KAAKt4B,GAA7D,CAAb;;AAEA,UAAMy4B,oBAAoB,CAAC;AACzB;AACA17B,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFjB;AAGzBQ,WAAGuB,YAAYI;AAHU,OAAD,EAIvB;AACD;AACA5B,WAAGwB,YAAYG,IAFd;AAGD1B,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,OAJuB,EAQvB;AACD;AACAzB,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFzC;AAGDQ,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC;AAHhC,OARuB,EAYvB;AACD;AACAzB,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAFjC;AAGDQ,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,OAZuB,CAA1B;;AAmBA85B,WAAKt4B,GAAL,GAAW,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDC,iBAAhD,EAAmEH,KAAK3oB,KAAxE,CAAX;;AAEA9S,cAAQoF,SAAR;AACApF,cAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,cAAQqF,SAAR,GAAoBA,SAApB;AACArF,cAAQ67B,WAAR,CAAoB,CAAC,CAAD,EAAI,CAAJ,CAApB;AACA77B,cAAQuZ,MAAR,CAAekiB,KAAK3oB,KAAL,CAAW5S,CAA1B,EAA6Bu7B,KAAK3oB,KAAL,CAAW3S,CAAxC;AACAH,cAAQwZ,MAAR,CAAeiiB,KAAKt4B,GAAL,CAASjD,CAAxB,EAA2Bu7B,KAAKt4B,GAAL,CAAShD,CAApC;AACAH,cAAQ4F,MAAR;AACD;;AAED5F,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,IAAM/E,SAAS,+BAAgB;AAC7BoF,4CAD6B;AAE7B8B,kCAF6B;AAG7BV,8BAH6B;AAI7BpH;AAJ6B,CAAhB,CAAf;;AAOA,IAAMunB,cAAc,yBAAU;AAC5BvhB,4CAD4B;AAE5B8B,kCAF4B;AAG5BV,8BAH4B;AAI5BpH;AAJ4B,CAAV,CAApB;;QAQEY,M,GAAAA,M;QACA2mB,W,GAAAA,W;;;;;;;;;;;;;;ACxPF;;;;AACA;;;;AACA;;AACA;;;;;;AAEA,IAAI1hB,gBAAgB;AAClBi/B,eAAa,GADK;AAElBC,sBAAoB;AAFF,CAApB;;AAKA,IAAIrzB,oBAAJ;;AAEA,IAAIxK,sBAAJ;;AAEA;AACA,SAASoL,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmDqM,eAAnD;AACA,4BAASlT,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDqM,eAAtD;AACA5S,UAAQmI,mBAAR,CAA4B,qBAA5B,EAAmDm9B,gBAAnD;AACAC,WAAS7kC,SAAT;AACD;;AAED,SAAS6kC,QAAT,CAAmB7kC,SAAnB,EAA8B;AAC5B,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BwlC,IAA9B,CAAmC,cAAnC,EAAmDC,IAAnD;AACA;AACAxjC,WAASyjC,IAAT,CAAcC,KAAd,CAAoBC,MAApB,GAA6B,SAA7B;AACD;;AAED;AACA,SAASn/B,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,MAAI,oCAAqBU,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,8BAAS7B,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D8d,YAA/D;AACA,8BAAS9e,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkDzG,SAAlD,EAA6DkS,eAA7D;AACA,8BAASlT,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDzG,SAArD,EAAgEkS,eAAhE;;AAEApL,oBAAgB9G,UAAU8G,aAA1B;AACAxH,YAAQsI,gBAAR,CAAyB,qBAAzB,EAAgDg9B,gBAAhD;AACAO,0BAAsBnlC,SAAtB;;AAEA,WAAO,KAAP,CATiE,CASnD;AACf;AACF;;AAED,SAAS4kC,gBAAT,CAA2Bl+B,CAA3B,EAA8B;AAC5B,MAAM1G,YAAY0G,EAAExF,MAApB;;AAEAlB,YAAU8G,aAAV,GAA0BA,aAA1B;AACAq+B,wBAAsBnlC,SAAtB;AACD;;AAED,SAASy/B,eAAT,CAA0B/4B,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,4BAASN,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6D45B,eAA7D;AACA,4BAASzgC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,0BAAlC,EAA8D45B,eAA9D;AACAngC,UAAQmI,mBAAR,CAA4B,qBAA5B,EAAmDm9B,gBAAnD;AACAC,WAAS7kC,SAAT;AACD;;AAED;AACA,SAAS8d,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC8G,kBAAgB9G,UAAU8G,aAA1B;;AAEAq+B,wBAAsBnlC,SAAtB;AACA,MAAIA,UAAU86B,YAAV,KAA2B,IAA/B,EAAqC;AACnC,8BAAS97B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4Dg5B,eAA5D;AACA,8BAASzgC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,0BAAjC,EAA6Dg5B,eAA7D;AACD;;AAED,SAAO,KAAP,CATmC,CASrB;AACf;;AAED;AACA,SAAS0F,qBAAT,CAAgCnlC,SAAhC,EAA2C;AACzC,MAAMolC,gBAAgB,0BAASpmC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BwlC,IAA9B,CAAmC,cAAnC,EAAmD5kC,GAAnD,CAAuD,CAAvD,CAAtB;;AAEA,MAAI,CAACklC,aAAL,EAAoB;AAClBC,8BAA0BrlC,UAAUV,OAApC;AACD;;AAED,MAAM4I,SAASkf,QAAQpf,gBAAR,EAAf;;AAEA,MAAM08B,cAAcx8B,OAAOw8B,WAA3B;AACA,MAAMC,qBAAqBz8B,OAAOy8B,kBAAlC;;AAEA;AACA;AACA,MAAM59B,SAAS,0BAAS/H,CAAT,CAAWgB,UAAUV,OAArB,EAA8BwlC,IAA9B,CAAmC,QAAnC,EAA6CQ,GAA7C,CAAiD,cAAjD,EAAiEplC,GAAjE,CAAqE,CAArE,CAAf;AACA,MAAMkD,UAAU2D,OAAOwiB,UAAP,CAAkB,IAAlB,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAM6oB,UAAUH,cAAc7b,UAAd,CAAyB,IAAzB,CAAhB;;AAEAgc,UAAQ7oB,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAM8oB,UAAUd,cAAcC,kBAA9B;;AAEA;AACA,MAAMc,iBAAiB,0BAAS5mC,WAAT,CAAqB8J,aAArB,CAAmC3I,UAAUV,OAA7C,EAAsDU,UAAU8G,aAAV,CAAwBqE,KAA9E,CAAvB;;AAEA,MAAInL,UAAU86B,YAAV,KAA2B,IAA/B,EAAqC;AACnC2K,mBAAeliC,CAAf,IAAoB,OAAOiiC,OAA3B;AACD;;AAEDC,iBAAeniC,CAAf,GAAmBqB,KAAKC,GAAL,CAAS6gC,eAAeniC,CAAxB,EAA2B,CAA3B,CAAnB;AACAmiC,iBAAeniC,CAAf,GAAmBqB,KAAKqN,GAAL,CAASyzB,eAAeniC,CAAxB,EAA2ByD,OAAOhE,KAAlC,CAAnB;;AAEA0iC,iBAAeliC,CAAf,GAAmBoB,KAAKC,GAAL,CAAS6gC,eAAeliC,CAAxB,EAA2B,CAA3B,CAAnB;AACAkiC,iBAAeliC,CAAf,GAAmBoB,KAAKqN,GAAL,CAASyzB,eAAeliC,CAAxB,EAA2BwD,OAAOhC,MAAlC,CAAnB;;AAEA;AACAwgC,UAAQG,SAAR,CAAkB,CAAlB,EAAqB,CAArB,EAAwBhB,WAAxB,EAAqCA,WAArC;AACAa,UAAQ1gC,SAAR,GAAoB,aAApB;;AAEA;AACA0gC,UAAQngC,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBs/B,WAAvB,EAAoCA,WAApC;;AAEA,MAAMiB,WAAW;AACfriC,OAAGmiC,eAAeniC,CAAf,GAAmB,MAAMkiC,OADb;AAEfjiC,OAAGkiC,eAAeliC,CAAf,GAAmB,MAAMiiC;AAFb,GAAjB;;AAKA,MAAIl0B,gBAAgB,QAApB,EAA8B;AAC5B;AACA;AACAq0B,aAASriC,CAAT,GAAaqB,KAAKC,GAAL,CAAS+gC,SAASriC,CAAlB,EAAqB,CAArB,CAAb;AACAqiC,aAASpiC,CAAT,GAAaoB,KAAKC,GAAL,CAAS+gC,SAASpiC,CAAlB,EAAqB,CAArB,CAAb;AACD;;AAEDoiC,WAASriC,CAAT,GAAaqB,KAAKqN,GAAL,CAAS2zB,SAASriC,CAAlB,EAAqByD,OAAOhE,KAA5B,CAAb;AACA4iC,WAASpiC,CAAT,GAAaoB,KAAKqN,GAAL,CAAS2zB,SAASpiC,CAAlB,EAAqBwD,OAAOhC,MAA5B,CAAb;;AAEA,MAAM6gC,gBAAgB;AACpBtiC,OAAG,CAACyD,OAAOhE,KAAP,GAAe4iC,SAASriC,CAAzB,IAA8BqhC,kBADb;AAEpBphC,OAAG,CAACwD,OAAOhC,MAAP,GAAgB4gC,SAASpiC,CAA1B,IAA+BohC;AAFd,GAAtB;;AAKAY,UAAQM,SAAR,CAAkB9+B,MAAlB,EAA0B4+B,SAASriC,CAAnC,EAAsCqiC,SAASpiC,CAA/C,EAAkDwD,OAAOhE,KAAP,GAAe4iC,SAASriC,CAA1E,EAA6EyD,OAAOhC,MAAP,GAAgB4gC,SAASpiC,CAAtG,EAAyG,CAAzG,EAA4G,CAA5G,EAA+GqiC,cAActiC,CAA7H,EAAgIsiC,cAAcriC,CAA9I;;AAEA;AACA6hC,gBAAcH,KAAd,CAAoB//B,GAApB,GAA6BugC,eAAeliC,CAAf,GAAmB,MAAMmhC,WAAtD;AACAU,gBAAcH,KAAd,CAAoBhgC,IAApB,GAA8BwgC,eAAeniC,CAAf,GAAmB,MAAMohC,WAAvD;;AAEAU,gBAAcH,KAAd,CAAoBa,OAApB,GAA8B,OAA9B;;AAEA;AACAvkC,WAASyjC,IAAT,CAAcC,KAAd,CAAoBC,MAApB,GAA6B,MAA7B;AACD;;AAED;AACA,SAASG,yBAAT,CAAoC/lC,OAApC,EAA6C;AAC3C;AACA,MAAI,0BAASN,CAAT,CAAWM,OAAX,EAAoBwlC,IAApB,CAAyB,cAAzB,EAAyCtkC,MAAzC,KAAoD,CAAxD,EAA2D;AACzD;AACA,QAAM4kC,gBAAgB7jC,SAASwkC,aAAT,CAAuB,QAAvB,CAAtB;AACA;;AAEAX,kBAAcY,SAAd,CAAwBlmC,GAAxB,CAA4B,aAA5B;;AAEA,QAAMoI,SAASkf,QAAQpf,gBAAR,EAAf;;AAEAo9B,kBAAcriC,KAAd,GAAsBmF,OAAOw8B,WAA7B;AACAU,kBAAcrgC,MAAd,GAAuBmD,OAAOw8B,WAA9B;;AAEA;AACAU,kBAAcH,KAAd,CAAoBgB,QAApB,GAA+B,UAA/B;AACA3mC,YAAQ4mC,WAAR,CAAoBd,aAApB;AACD;AACF;;AAED;AACA,SAASe,yBAAT,CAAoC7mC,OAApC,EAA6C;AAC3C,4BAASN,CAAT,CAAWM,OAAX,EAAoBwlC,IAApB,CAAyB,cAAzB,EAAyCxZ,MAAzC;AACD;;AAED;AACA,SAAS9jB,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;AACAogC,4BAA0B7mC,OAA1B;AACD;;AAED,SAASqI,MAAT,CAAiBrI,OAAjB,EAA0B;AACxB,MAAI,CAACgS,WAAL,EAAkB;AAChB,QAAMH,aAAa,iDAAnB;AACA,QAAMC,OAAOD,WAAWE,KAAX,CAAiB,GAAjB,CAAb;;AAEAC,kBAAcF,KAAK,CAAL,CAAd;AACD;;AAEDi0B,4BAA0B/lC,OAA1B;AACD;;AAED,SAASuI,QAAT,CAAmBvI,OAAnB,EAA4BuB,eAA5B,EAA6C;AAC3C,MAAMb,YAAY;AAChBa;AADgB,GAAlB;;AAIA,4BAAS7B,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;;AAEA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D+F,iBAA/D;AACAs/B,4BAA0B/lC,OAA1B;AACD;;AAED;AACA,SAAS0I,gBAAT,GAA6B;AAC3B,SAAOvC,aAAP;AACD;;AAED,SAASwC,gBAAT,CAA2BC,MAA3B,EAAmC;AACjCzC,kBAAgByC,MAAhB;AACD;;AAED;AACA,IAAMkf,UAAU;AACdzf,gBADc;AAEdE,oBAFc;AAGdC,cAAYN,OAHE;AAIdA,kBAJc;AAKdQ,oCALc;AAMdC;AANc,CAAhB;;AASA,IAAMzE,UAAU;AACdsH,oBAAkB,IADJ;AAEdC,oBAAkBs6B,yBAFJ;AAGdr6B,mBAAiBm7B;AAHH,CAAhB;;AAMA,IAAM9e,mBAAmB,6BAAcvJ,YAAd,EAA4Bta,OAA5B,CAAzB;;QAGE4jB,O,GAAAA,O;QACAC,gB,GAAAA,gB;;;;;;;;;;;;;AC9OF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAAS+e,qBAAT,CAAgC9mC,OAAhC,EAAyC;AACvC,MAAMT,cAAc,0BAASA,WAA7B;AACA,MAAM8a,iBAAiB9a,YAAYW,iBAAZ,CAA8BF,OAA9B,CAAvB;AACA,MAAM+mC,qBAAqBxnC,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,kBAAzB,EAA6CyZ,eAAexO,KAAf,CAAqBmB,OAAlE,CAA3B;;AAEA,MAAI,CAAC+5B,kBAAD,IAAuB,CAACA,mBAAmBnzB,UAA3C,IAAyD,CAACmzB,mBAAmBlzB,aAAjF,EAAgG;AAC9F;AACD;;AAED,MAAMmzB,YAAY,gBAAYxpB,oBAAZ,CAAiCupB,mBAAmBnzB,UAApD,CAAlB;AACA,MAAMqzB,eAAe,gBAAYzpB,oBAAZ,CAAiCupB,mBAAmBlzB,aAApD,CAArB;;AAEA,MAAMqzB,oBAAoB,gBAAYzpB,uBAAZ,CAAoCupB,SAApC,CAA1B;AACA,MAAMG,uBAAuB,gBAAY1pB,uBAAZ,CAAoCwpB,YAApC,CAA7B;;AAEA,SAAO;AACLrhC,SAAKuhC,oBADA;AAELnyB,YAAQiyB,YAFH;AAGLthC,UAAMuhC,iBAHD;AAILnyB,WAAOiyB;AAJF,GAAP;AAMD;;AAED,SAASI,6BAAT,CAAwCpnC,OAAxC,EAAiD;AAC/C,MAAMT,cAAc,0BAASA,WAA7B;AACA,MAAM8a,iBAAiB9a,YAAYW,iBAAZ,CAA8BF,OAA9B,CAAvB;AACA,MAAIuH,eAAJ;;AAEAA,WAAS;AACPvD,OAAGqW,eAAexO,KAAf,CAAqBpI,KAArB,GAA6B,CADzB;AAEPQ,OAAG;AAFI,GAAT;AAIA,MAAM2B,MAAMrG,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCuH,MAAnC,CAAZ;;AAEAA,WAAS;AACPvD,OAAGqW,eAAexO,KAAf,CAAqBpI,KAArB,GAA6B,CADzB;AAEPQ,OAAGoW,eAAexO,KAAf,CAAqBpG,MAArB,GAA8B;AAF1B,GAAT;AAIA,MAAMuP,SAASzV,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCuH,MAAnC,CAAf;;AAEAA,WAAS;AACPvD,OAAG,CADI;AAEPC,OAAGoW,eAAexO,KAAf,CAAqBpG,MAArB,GAA8B;AAF1B,GAAT;AAIA,MAAME,OAAOpG,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCuH,MAAnC,CAAb;;AAEAA,WAAS;AACPvD,OAAGqW,eAAexO,KAAf,CAAqBpI,KAArB,GAA6B,EADzB;AAEPQ,OAAGoW,eAAexO,KAAf,CAAqBpG,MAArB,GAA8B;AAF1B,GAAT;AAIA,MAAMsP,QAAQxV,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCuH,MAAnC,CAAd;;AAEA,SAAO;AACL3B,YADK;AAELoP,kBAFK;AAGLrP,cAHK;AAILoP;AAJK,GAAP;AAMD;;AAED,SAAS3M,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,MAAMqnC,UAAUP,sBAAsB9mC,OAAtB,CAAhB;;AAEA,MAAI,CAACqnC,OAAL,EAAc;AACZ;AACD;;AAED,MAAM9/B,SAAS6/B,8BAA8BpnC,OAA9B,EAAuCqnC,OAAvC,CAAf;;AAEA,MAAMvjC,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMva,QAAQ,qBAAWG,YAAX,EAAd;;AAEA,MAAMskC,aAAa;AACjB1hC,SAAK9B,QAAQsB,WAAR,CAAoBiiC,QAAQzhC,GAA5B,EAAiCnC,KADrB;AAEjBkC,UAAM7B,QAAQsB,WAAR,CAAoBiiC,QAAQ1hC,IAA5B,EAAkClC,KAFvB;AAGjBsR,WAAOjR,QAAQsB,WAAR,CAAoBiiC,QAAQtyB,KAA5B,EAAmCtR,KAHzB;AAIjBuR,YAAQlR,QAAQsB,WAAR,CAAoBiiC,QAAQryB,MAA5B,EAAoCvR;AAJ3B,GAAnB;;AAOA,6BAAYK,OAAZ,EAAqBujC,QAAQzhC,GAA7B,EAAkC2B,OAAO3B,GAAP,CAAW5B,CAAX,GAAesjC,WAAW1hC,GAAX,GAAiB,CAAlE,EAAqE2B,OAAO3B,GAAP,CAAW3B,CAAhF,EAAmFpB,KAAnF;AACA,6BAAYiB,OAAZ,EAAqBujC,QAAQ1hC,IAA7B,EAAmC4B,OAAO5B,IAAP,CAAY3B,CAAZ,GAAgBsjC,WAAW3hC,IAAX,GAAkB,CAArE,EAAwE4B,OAAO5B,IAAP,CAAY1B,CAApF,EAAuFpB,KAAvF;;AAEA,MAAM+F,SAAS2+B,mBAAmB7+B,gBAAnB,EAAf;;AAEA,MAAIE,UAAUA,OAAO4+B,cAArB,EAAqC;AACnC,+BAAY1jC,OAAZ,EAAqBujC,QAAQtyB,KAA7B,EAAoCxN,OAAOwN,KAAP,CAAa/Q,CAAb,GAAiBsjC,WAAWvyB,KAAX,GAAmB,CAAxE,EAA2ExN,OAAOwN,KAAP,CAAa9Q,CAAxF,EAA2FpB,KAA3F;AACA,+BAAYiB,OAAZ,EAAqBujC,QAAQryB,MAA7B,EAAqCzN,OAAOyN,MAAP,CAAchR,CAAd,GAAkBsjC,WAAWtyB,MAAX,GAAoB,CAA3E,EAA8EzN,OAAOyN,MAAP,CAAc/Q,CAA5F,EAA+FpB,KAA/F;AACD;AACF;AACD;;AAEA;AACA,IAAM0kC,qBAAqB,2BAAYn/B,eAAZ,CAA3B;;kBAEem/B,kB;;;;;;;;;;;;;;ACzGf;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAAS30B,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,4BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,8BAAS7B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqX,YAA9D;AACA,8BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;;AAEA,WAAO,KAAP,CALiE,CAKnD;AACf;AACF;;AAED,SAAS4L,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;;AAEnC;AACA,MAAI+mC,aAAa/mC,UAAUwb,QAAV,CAAmB2B,KAApC;AACA,MAAI6pB,cAAchnC,UAAUwb,QAAV,CAAmB2B,KAArC;;AAEA,MAAInd,UAAUmL,KAAV,CAAgBsI,eAAhB,GAAkCzT,UAAUmL,KAAV,CAAgBqI,kBAAtD,EAA0E;AACxEuzB,kBAAe/mC,UAAUmL,KAAV,CAAgBqI,kBAAhB,GAAqCxT,UAAUmL,KAAV,CAAgBsI,eAApE;AACD,GAFD,MAEO,IAAIzT,UAAUmL,KAAV,CAAgBqI,kBAAhB,GAAqCxT,UAAUmL,KAAV,CAAgBsI,eAAzD,EAA0E;AAC/EuzB,mBAAgBhnC,UAAUmL,KAAV,CAAgBsI,eAAhB,GAAkCzT,UAAUmL,KAAV,CAAgBqI,kBAAlE;AACD;;AAEDxT,YAAUwb,QAAV,CAAmBuU,WAAnB,CAA+BzsB,CAA/B,IAAqCtD,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BrP,CAA3B,GAA+ByjC,UAApE;AACA/mC,YAAUwb,QAAV,CAAmBuU,WAAnB,CAA+BxsB,CAA/B,IAAqCvD,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA3B,GAA+ByjC,WAApE;AACA,4BAASnoC,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;;AAEA,SAAO,KAAP,CAhBmC,CAgBrB;AACf;;AAED,IAAM8L,MAAM,qCAAsBvhB,iBAAtB,CAAZ;AACA,IAAMwhB,eAAe,6BAAczJ,YAAd,CAArB;;QAGEwJ,G,GAAAA,G;QACAC,Y,GAAAA,Y;;;;;;;;;;;;;AC7CF;;;;AACA;;;;;;AAEA,SAAS0f,gBAAT,CAA2BvgC,CAA3B,EAA8B1G,SAA9B,EAAyC;AACvC,MAAMkI,SAASg/B,cAAcl/B,gBAAd,EAAf;;AAEA,MAAIE,UAAUA,OAAOyW,YAAP,CAAoB3e,SAApB,CAAd,EAA8C;AAC5CA,cAAUwb,QAAV,CAAmBuU,WAAnB,CAA+BzsB,CAA/B,IAAqCtD,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BrP,CAA3B,GAA+BtD,UAAUwb,QAAV,CAAmB2B,KAAvF;AACAnd,cAAUwb,QAAV,CAAmBuU,WAAnB,CAA+BxsB,CAA/B,IAAqCvD,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA3B,GAA+BvD,UAAUwb,QAAV,CAAmB2B,KAAvF;AACA,8BAASte,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;;AAEA,WAAO,KAAP,CAL4C,CAK9B;AACf;AACF;;AAED,IAAM/V,gBAAgB;AACpBkZ,cADoB,wBACN3e,SADM,EACK;AACvB,WAAQA,UAAU4e,WAAV,IAAyB,CAAjC;AACD;AAHmB,CAAtB;;AAMA,IAAMsoB,gBAAgB,kCAAmBD,gBAAnB,CAAtB;;AAEAC,cAAcj/B,gBAAd,CAA+BxC,aAA/B;;kBAEeyhC,a;;;;;;;;;;;;;;ACzBf;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAMtnC,WAAW,OAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM9F,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB2D,aAAS;AACPE,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL;AADE;AAHa,GAAxB;;AAcA,SAAO7C,eAAP;AACD;AACD;;AAEA;AACA,SAASmH,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMk6B,YAAY,0BAASliC,WAAT,CAAqB8J,aAArB,CAAmCrJ,OAAnC,EAA4Cc,KAAKiG,OAAL,CAAaE,GAAzD,CAAlB;;AAGA,SAAO,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BnE,QAA/B,CAAwC25B,SAAxC,EAAmDl6B,MAAnD,IAA6D,CAApE;AACD;;AAED,SAASa,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMxB,cAAc,0BAASA,WAA7B;AACA;AACA,MAAMuE,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAIva,cAAJ;AACA,MAAM2B,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMq8B,aAAa,oBAAUn8B,WAAV,EAAnB;;AAEA,OAAK,IAAI1D,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;;AAE7C6C,YAAQgB,IAAR;AACA,QAAMhE,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,QAAIH,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACD,KAFD,MAEO;AACLL,cAAQ,qBAAWG,YAAX,EAAR;AACD;;AAED;AACA,+BAAYc,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;;AAEA,QAAMmB,IAAIqB,KAAKqU,KAAL,CAAW5Y,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAA5B,CAAV;AACA,QAAMC,IAAIoB,KAAKqU,KAAL,CAAW5Y,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA5B,CAAV;AACA,QAAI2hB,qBAAJ;;AAEA,QAAIzgB,aAAJ;AAAA,QACEg5B,YADF;;AAGA,QAAIn6B,IAAI,CAAJ,IAASC,IAAI,CAAb,IAAkBD,KAAKtD,UAAUmL,KAAV,CAAgB4I,OAAvC,IAAkDxQ,KAAKvD,UAAUmL,KAAV,CAAgB8I,IAA3E,EAAiF;AAC/E;AACD;;AAED,QAAIjU,UAAUmL,KAAV,CAAgBhJ,KAApB,EAA2B;AACzBsC,aAAUnB,CAAV,UAAgBC,CAAhB;AACA2hB,qBAAe,4BAAallB,UAAUV,OAAvB,EAAgCgE,CAAhC,EAAmCC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,CAAf;AACAk6B,oBAAYvY,aAAa,CAAb,CAAZ,YAAkCA,aAAa,CAAb,CAAlC,YAAwDA,aAAa,CAAb,CAAxD;AACD,KAJD,MAIO;AACLA,qBAAermB,YAAYwhC,eAAZ,CAA4BrgC,UAAUV,OAAtC,EAA+CgE,CAA/C,EAAkDC,CAAlD,EAAqD,CAArD,EAAwD,CAAxD,CAAf;AACA,UAAMuc,KAAKoF,aAAa,CAAb,CAAX;AACA,UAAMob,KAAKxgB,KAAK9f,UAAUmL,KAAV,CAAgBsC,KAArB,GAA6BzN,UAAUmL,KAAV,CAAgBuC,SAAxD;AACA,UAAMuB,MAAM,4BAAajP,UAAUmL,KAAvB,EAA8B2U,EAA9B,CAAZ;;AAEA;AACArb,aAAUnB,CAAV,UAAgBC,CAAhB;AACAk6B,qBAAa3d,EAAb,aAAuB3Q,WAAWmxB,GAAGC,OAAH,CAAW,CAAX,CAAX,CAAvB;AACA,UAAItxB,GAAJ,EAAS;AACPwuB,0BAAgBtuB,WAAWF,IAAIsxB,OAAJ,CAAY,CAAZ,CAAX,CAAhB;AACD;AACF;;AAED,QAAM15B,SAAS;AACb;AACAvD,SAAGlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAjB,GAAqB,CAFX;AAGbC,SAAGnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAjB,GAAqB;AAHX,KAAf;AAKA,QAAMi7B,aAAa3/B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6CuH,MAA7C,CAAnB;;AAEAzD,YAAQU,IAAR,GAAeA,IAAf;AACAV,YAAQyB,SAAR,GAAoB1C,KAApB;;AAEA,+BAAYiB,OAAZ,EAAqBq6B,GAArB,EAA0Be,WAAWl7B,CAArC,EAAwCk7B,WAAWj7B,CAAX,GAAe68B,UAAf,GAA4B,CAApE,EAAuEj+B,KAAvE;AACA,+BAAYiB,OAAZ,EAAqBqB,IAArB,EAA2B+5B,WAAWl7B,CAAtC,EAAyCk7B,WAAWj7B,CAApD,EAAuDpB,KAAvD;AACAiB,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,IAAMiiB,QAAQ,+BAAgB;AAC5B5hB,4CAD4B;AAE5B8B,kCAF4B;AAG5BV,8BAH4B;AAI5BpH;AAJ4B,CAAhB,CAAd;;AAOA,IAAM6nB,aAAa,yBAAU;AAC3B7hB,4CAD2B;AAE3B8B,kCAF2B;AAG3BV,8BAH2B;AAI3BpH;AAJ2B,CAAV,CAAnB;;QAQE4nB,K,GAAAA,K;QACAC,U,GAAAA,U;;;;;;;;;;;;;;ACzIF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAM7nB,WAAW,cAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM9F,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB8D,iBAAa,IAHS;AAItBH,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADjC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFjC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OAPE;AAaP07B,eAAS;AACP17B,gBAAQ,KADD;AAEPqP,kBAAU,KAFH;AAGPgJ,4BAAoB,KAHb;AAIPzS,4BAAoB,IAJb;AAKPgD,6BAAqB,IALd;AAMPiE,wBAAgB;AANT;AAbF;AAJa,GAAxB;;AA4BA,SAAO1P,eAAP;AACD;AACD;;AAEA,SAASmH,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMhI,cAAc,0BAASA,WAA7B;AACA,MAAMiiC,cAAcjiC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAApB;AACA,MAAM6qB,YAAYliC,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAlB;;AAEA,MAAM4N,OAAO;AACXlP,UAAMN,KAAKqN,GAAL,CAAS8uB,YAAYx9B,CAArB,EAAwBy9B,UAAUz9B,CAAlC,CADK;AAEX4B,SAAKP,KAAKqN,GAAL,CAAS8uB,YAAYv9B,CAArB,EAAwBw9B,UAAUx9B,CAAlC,CAFM;AAGXR,WAAO4B,KAAK2X,GAAL,CAASwkB,YAAYx9B,CAAZ,GAAgBy9B,UAAUz9B,CAAnC,CAHI;AAIXyB,YAAQJ,KAAK2X,GAAL,CAASwkB,YAAYv9B,CAAZ,GAAgBw9B,UAAUx9B,CAAnC;AAJG,GAAb;;AAOA,MAAMo5B,kBAAkB,0BAAS59B,eAAT,CAAyBoV,IAAzB,CAA8BwoB,eAA9B,CAA8CxoB,IAA9C,EAAoDtN,MAApD,CAAxB;;AAGA,SAAQ81B,kBAAkB,CAA1B;AACD;;AAED;;AAEA,SAASwK,mBAAT,CAA8BrnB,EAA9B,EAAkC7G,OAAlC,EAA2C;AACzC;;AAEA,MAAI8G,MAAM,CAAV;AACA,MAAIC,aAAa,CAAjB;AACA,MAAIC,QAAQ,CAAZ;AACA,MAAI5a,QAAQ,CAAZ;;AAEA,OAAK,IAAI9B,IAAI0V,QAAQ/T,GAArB,EAA0B3B,IAAI0V,QAAQ/T,GAAR,GAAc+T,QAAQlU,MAApD,EAA4DxB,GAA5D,EAAiE;AAC/D,SAAK,IAAID,IAAI2V,QAAQhU,IAArB,EAA2B3B,IAAI2V,QAAQhU,IAAR,GAAegU,QAAQlW,KAAtD,EAA6DO,GAA7D,EAAkE;AAChEyc,aAAOD,GAAGza,KAAH,CAAP;AACA2a,oBAAcF,GAAGza,KAAH,IAAYya,GAAGza,KAAH,CAA1B;AACA4a;AACA5a;AACD;AACF;;AAED,MAAI4a,UAAU,CAAd,EAAiB;AACf,WAAO;AACLA,kBADK;AAELC,YAAM,GAFD;AAGLC,gBAAU,GAHL;AAILC,cAAQ;AAJH,KAAP;AAMD;;AAED,MAAMF,OAAOH,MAAME,KAAnB;AACA,MAAME,WAAWH,aAAaC,KAAb,GAAqBC,OAAOA,IAA7C;;AAEA,SAAO;AACLD,gBADK;AAELC,cAFK;AAGLC,sBAHK;AAILC,YAAQzb,KAAK0b,IAAL,CAAUF,QAAV;AAJH,GAAP;AAMD;;AAED,SAASkhB,gBAAT,CAA2B/9B,CAA3B,EAA8B;AAC5B;AACA,MAAMg+B,QAAQh+B,EAAEK,QAAF,GAAa0N,KAAb,CAAmB,GAAnB,CAAd;;AAEAiwB,QAAM,CAAN,IAAWA,MAAM,CAAN,EAAS1wB,OAAT,CAAiB,uBAAjB,EAA0C,GAA1C,CAAX;;AAEA,SAAO0wB,MAAM3wB,IAAN,CAAW,GAAX,CAAP;AACD;;AAED,SAASjJ,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMxB,cAAc,0BAASA,WAA7B;AACA,MAAMsM,QAAQnL,UAAUmL,KAAxB;AACA,MAAM7L,UAAUU,UAAUV,OAA1B;AACA,MAAMmJ,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMkF,SAASwf,aAAa1f,gBAAb,EAAf;AACA,MAAM5E,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;AACA,MAAMjc,eAAezO,YAAYwO,QAAZ,CAAqBnN,GAArB,CAAyB,qBAAzB,EAAgDiL,MAAMmB,OAAtD,CAArB;AACA,MAAIiB,iBAAJ;;AAEA,MAAID,YAAJ,EAAkB;AAChBC,eAAWD,aAAaC,QAAxB;AACD;;AAEDnK,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACA,OAAK,IAAInc,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA,QAAMhE,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA;AACA,QAAI2H,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED;AACA,QAAM56B,QAAQ,qBAAWM,gBAAX,CAA4BrC,KAAKsC,MAAjC,CAAd;;AAEA;AACA,QAAMs6B,oBAAoBn+B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CAA1B;AACA,QAAM+mB,kBAAkBp+B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAxB;;AAEA;AACA;AACA,QAAMg7B,aAAa58B,KAAKqN,GAAL,CAASgrB,kBAAkB15B,CAA3B,EAA8B25B,gBAAgB35B,CAA9C,CAAnB;AACA,QAAMk+B,YAAY78B,KAAKqN,GAAL,CAASgrB,kBAAkBz5B,CAA3B,EAA8B05B,gBAAgB15B,CAA9C,CAAlB;AACA,QAAMk+B,cAAc98B,KAAK2X,GAAL,CAAS0gB,kBAAkB15B,CAAlB,GAAsB25B,gBAAgB35B,CAA/C,CAApB;AACA,QAAMo+B,eAAe/8B,KAAK2X,GAAL,CAAS0gB,kBAAkBz5B,CAAlB,GAAsB05B,gBAAgB15B,CAA/C,CAArB;;AAEA;AACAH,YAAQoF,SAAR;AACApF,YAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,YAAQqF,SAAR,GAAoBA,SAApB;AACArF,YAAQ+Q,IAAR,CAAaotB,UAAb,EAAyBC,SAAzB,EAAoCC,WAApC,EAAiDC,YAAjD;AACAt+B,YAAQ4F,MAAR;;AAEA;AACA;AACA,QAAId,UAAUA,OAAOg2B,kBAArB,EAAyC;AACvC;AACA,UAAI99B,KAAKsC,MAAL,KAAgB,IAApB,EAA0B;AACxB,mCAAYU,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;AACD,OAFD,MAEO;AACL;AACA;AACA,YAAMk8B,gBAAgB;AACpB91B,+BAAqB;AADD,SAAtB;;AAIA,mCAAYnF,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C,EAAqDk8B,aAArD;AACD;AACF,KAbD,MAaO;AACL;AACA,iCAAYj7B,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C;AACD;;AAED;AACA,QAAIw/B,aAAJ;AAAA,QACEC,mBADF;AAAA,QAEEC,sBAFF;;AAIA;AACA;AACA;AACA,QAAIzhC,KAAKoG,WAAL,KAAqB,KAAzB,EAAgC;AAC9B;AACAo7B,mBAAaxhC,KAAKwhC,UAAlB;AACAC,sBAAgBzhC,KAAKyhC,aAArB;AACAF,aAAOvhC,KAAKuhC,IAAZ;AACD,KALD,MAKO;AACL;;AAEA;AACA,UAAM1oB,UAAU;AACdhU,cAAMN,KAAKqN,GAAL,CAAS5R,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA5B,EAA+BlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAhD,CADQ;AAEd4B,aAAKP,KAAKqN,GAAL,CAAS5R,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAA5B,EAA+BnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAhD,CAFS;AAGdR,eAAO4B,KAAK2X,GAAL,CAASlc,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAAnB,GAAuBlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAjD,CAHO;AAIdyB,gBAAQJ,KAAK2X,GAAL,CAASlc,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAAnB,GAAuBnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAjD;AAJM,OAAhB;;AAOA;AACA;AACA,UAAI,CAAC4H,MAAMhJ,KAAX,EAAkB;AAChB;AACA,YAAM2/B,SAASjjC,YAAYkjC,SAAZ,CAAsBziC,OAAtB,EAA+B2Z,QAAQhU,IAAvC,EAA6CgU,QAAQ/T,GAArD,EAA0D+T,QAAQlW,KAAlE,EAAyEkW,QAAQlU,MAAjF,CAAf;;AAEA;AACA68B,qBAAauF,oBAAoBrF,MAApB,EAA4B7oB,OAA5B,CAAb;;AAEA,YAAI1L,aAAa,IAAjB,EAAuB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACAs0B,0BAAgB;AACd3hB,kBAAM,4BAAa/U,KAAb,EAAoB,CAACy2B,WAAW1hB,IAAX,GAAkB/U,MAAMuC,SAAzB,IAAsCvC,MAAMsC,KAAhE,CADQ;AAEd2S,oBAAQ,4BAAajV,KAAb,EAAoB,CAACy2B,WAAWxhB,MAAX,GAAoBjV,MAAMuC,SAA3B,IAAwCvC,MAAMsC,KAAlE;AAFM,WAAhB;AAID;;AAED;AACA,YAAIm0B,cAAc,CAACI,MAAMJ,WAAW1hB,IAAjB,CAAnB,EAA2C;AACzC9f,eAAKwhC,UAAL,GAAkBA,UAAlB;AACAxhC,eAAKyhC,aAAL,GAAqBA,aAArB;AACD;AACF;;AAED;AACA;AACA,UAAMruB,qBAAqBrI,MAAMqI,kBAAN,IAA4B,CAAvD;AACA,UAAMC,kBAAkBtI,MAAMsI,eAAN,IAAyB,CAAjD;;AAEA;AACAkuB,aAAQ1oB,QAAQlW,KAAR,GAAgByQ,kBAAjB,IAAwCyF,QAAQlU,MAAR,GAAiB0O,eAAzD,CAAP;;AAEA;AACA,UAAI,CAACuuB,MAAML,IAAN,CAAL,EAAkB;AAChBvhC,aAAKuhC,IAAL,GAAYA,IAAZ;AACD;;AAED;AACAvhC,WAAKoG,WAAL,GAAmB,KAAnB;AACD;;AAED;AACA,QAAMnD,YAAY,EAAlB;;AAEA;AACA,QAAIu+B,cAAcA,WAAW1hB,IAA7B,EAAmC;AACjC;AACA,UAAI+hB,WAAW,EAAf;;AAEA,UAAI10B,aAAa,IAAjB,EAAuB;AACrB00B,mBAAW,KAAX;AACD;;AAED;AACA,UAAIC,sBAAoBb,iBAAiBO,WAAW1hB,IAAX,CAAgBqgB,OAAhB,CAAwB,CAAxB,CAAjB,CAApB,GAAmE0B,QAAvE;AACA;AACA,UAAIE,0BAAwBd,iBAAiBO,WAAWxhB,MAAX,CAAkBmgB,OAAlB,CAA0B,CAA1B,CAAjB,CAAxB,GAAyE0B,QAA7E;;AAEA;AACA,UAAIJ,iBAAiBA,cAAc3hB,IAAd,KAAuBxgB,SAA5C,EAAuD;AACrD,YAAM0iC,UAAU,QAAhB;;AAEAF,oBAAYE,UAAUf,iBAAiBQ,cAAc3hB,IAAd,CAAmBqgB,OAAnB,CAA2B,CAA3B,CAAjB,CAAtB;AACA4B,sBAAcC,UAAUf,iBAAiBQ,cAAczhB,MAAd,CAAqBmgB,OAArB,CAA6B,CAA7B,CAAjB,CAAxB;AACD;;AAED;AACAl9B,gBAAUyJ,IAAV,CAAeo1B,QAAf;AACA7+B,gBAAUyJ,IAAV,CAAeq1B,UAAf;AACD;;AAED;AACA,QAAIR,IAAJ,EAAU;AACR;AACA;AACA;AACA,UAAIU,iBAAe3E,OAAOC,YAAP,CAAoB,GAApB,CAAnB;;AAEA,UAAI,CAACxyB,MAAMsI,eAAP,IAA0B,CAACtI,MAAMqI,kBAArC,EAAyD;AACvD6uB,6BAAmB3E,OAAOC,YAAP,CAAoB,GAApB,CAAnB;AACD;;AAED;AACA,UAAM2E,sBAAoBjB,iBAAiBM,KAAKpB,OAAL,CAAa,CAAb,CAAjB,CAApB,GAAwD8B,MAA9D;;AAEA;AACAh/B,gBAAUyJ,IAAV,CAAew1B,QAAf;AACD;;AAED;AACA;AACA,QAAI,CAACliC,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAA1B,EAAoC;AAClC;AACA;AACA3R,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqB96B,CAArB,GAAyBqB,KAAKC,GAAL,CAASxE,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA5B,EAA+BlD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAAhD,CAAzB;AACAlD,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqB76B,CAArB,GAAyB,CAACnD,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAAnB,GAAuBnD,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAAzC,IAA8C,CAAvE;AACD;;AAED;AACA,QAAMi7B,aAAa3/B,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa+3B,OAAhD,CAAnB;;AAEA;AACA,QAAM56B,UAAU;AACdwB,iBAAW;AACT1B,WAAG,KADM;AAETC,WAAG;AAFM;AADG,KAAhB;;AAOA;AACA,QAAMuB,cAAc,2BAAY1B,OAAZ,EAAqBC,SAArB,EAAgCm7B,WAAWl7B,CAA3C,EAClBk7B,WAAWj7B,CADO,EACJpB,KADI,EACGqB,OADH,CAApB;;AAGA;AACApD,SAAKiG,OAAL,CAAa+3B,OAAb,CAAqBt5B,WAArB,GAAmCA,WAAnC;;AAEA;AACA;AACA;AACA,QAAI1E,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjC;;AAEA;AACA;AACA,UAAM8sB,OAAO;AACX3oB,eAAO,EADI;AAEX3P,aAAK;AACHjD,aAAGk7B,WAAWl7B,CADX;AAEHC,aAAGi7B,WAAWj7B;AAFX;AAFM,OAAb;;AAQA;AACA,UAAMg/B,gBAAgB,CAAC;AACrB;AACAj/B,WAAGi+B,aAAaE,cAAc,CAFT;AAGrBl+B,WAAGi+B;AAHkB,OAAD,EAInB;AACD;AACAl+B,WAAGi+B,UAFF;AAGDh+B,WAAGi+B,YAAYE,eAAe;AAH7B,OAJmB,EAQnB;AACD;AACAp+B,WAAGi+B,aAAaE,cAAc,CAF7B;AAGDl+B,WAAGi+B,YAAYE;AAHd,OARmB,EAYnB;AACD;AACAp+B,WAAGi+B,aAAaE,WAFf;AAGDl+B,WAAGi+B,YAAYE,eAAe;AAH7B,OAZmB,CAAtB;;AAkBA;AACA;AACA7C,WAAK3oB,KAAL,GAAa,0BAASnX,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDwD,aAAhD,EAA+D1D,KAAKt4B,GAApE,CAAb;;AAEA;AACA,UAAMy4B,oBAAoB,CAAC;AACzB;AACA17B,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFjB;AAGzBQ,WAAGuB,YAAYI;AAHU,OAAD,EAIvB;AACD;AACA5B,WAAGwB,YAAYG,IAFd;AAGD1B,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,OAJuB,EAQvB;AACD;AACAzB,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFzC;AAGDQ,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC;AAHhC,OARuB,EAYvB;AACD;AACAzB,WAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAFjC;AAGDQ,WAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,OAZuB,CAA1B;;AAkBA;AACA;AACA85B,WAAKt4B,GAAL,GAAW,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDC,iBAAhD,EAAmEH,KAAK3oB,KAAxE,CAAX;;AAEA;AACA9S,cAAQoF,SAAR;AACApF,cAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,cAAQqF,SAAR,GAAoBA,SAApB;AACArF,cAAQ67B,WAAR,CAAoB,CAAC,CAAD,EAAI,CAAJ,CAApB;AACA77B,cAAQuZ,MAAR,CAAekiB,KAAK3oB,KAAL,CAAW5S,CAA1B,EAA6Bu7B,KAAK3oB,KAAL,CAAW3S,CAAxC;AACAH,cAAQwZ,MAAR,CAAeiiB,KAAKt4B,GAAL,CAASjD,CAAxB,EAA2Bu7B,KAAKt4B,GAAL,CAAShD,CAApC;AACAH,cAAQ4F,MAAR;AACD;;AAED5F,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,IAAMmiB,eAAe,+BAAgB;AACnC9hB,4CADmC;AAEnC8B,kCAFmC;AAGnCV,8BAHmC;AAInCpH;AAJmC,CAAhB,CAArB;;AAOA,IAAM+nB,oBAAoB,yBAAU;AAClC/hB,4CADkC;AAElC8B,kCAFkC;AAGlCV,8BAHkC;AAIlCpH;AAJkC,CAAV,CAA1B;;QAQE8nB,Y,GAAAA,Y;QACAC,iB,GAAAA,iB;;;;;;;;;;;;;;AC9aF;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA;AACA,SAASwY,eAAT,CAA0BngC,SAA1B,EAAqC;AACnC;AACA,MAAMmU,OAAOnU,UAAUV,OAAV,CAAkB8nC,qBAAlB,CAAwCpnC,UAAUV,OAAlD,CAAb;;AAEA,MAAMgb,SAAS;AACbhX,OAAGtD,UAAU8G,aAAV,CAAwB0T,MAAxB,CAA+BlX,CADrB;AAEbC,OAAGvD,UAAU8G,aAAV,CAAwB0T,MAAxB,CAA+BjX;AAFrB,GAAf;;AAKA,MAAMR,QAAQ/C,UAAUV,OAAV,CAAkBykC,WAAhC;AACA,MAAMh/B,SAAS/E,UAAUV,OAAV,CAAkB0kC,YAAjC;;AAEA,MAAMqD,mBAAmB;AACvB/jC,OAAGgX,OAAOhX,CAAP,GAAW6Q,KAAKlP,IAAhB,GAAuBlC,QAAQ,CADX;AAEvB;AACAQ,OAAG,CAAC,CAAD,IAAM+W,OAAO/W,CAAP,GAAW4Q,KAAKjP,GAAhB,GAAsBH,SAAS,CAArC;AAHoB,GAAzB;;AAMA,MAAMuiC,kBAAkB3iC,KAAKgb,KAAL,CAAW0nB,iBAAiB9jC,CAA5B,EAA+B8jC,iBAAiB/jC,CAAhD,CAAxB;AACA,MAAMikC,kBAAkBD,mBAAmB,MAAM3iC,KAAKmE,EAA9B,CAAxB;AACA,MAAM6xB,WAAW,CAAC,CAAD,GAAK4M,eAAL,GAAuB,EAAxC;;AAEAvnC,YAAUwb,QAAV,CAAmBmf,QAAnB,GAA8BA,QAA9B;AACA,4BAAS97B,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;AACD;;AAED,SAASgsB,kBAAT,CAA6BxnC,SAA7B,EAAwC;AACtCA,YAAUwb,QAAV,CAAmBmf,QAAnB,IAAgC36B,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BrP,CAA3B,GAA+BtD,UAAUwb,QAAV,CAAmB2B,KAAlF;AACA,4BAASte,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;AACD;;AAED,SAASisB,gBAAT,CAA2BznC,SAA3B,EAAsC;AACpCA,YAAUwb,QAAV,CAAmBmf,QAAnB,IAAgC36B,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA3B,GAA+BvD,UAAUwb,QAAV,CAAmB2B,KAAlF;AACA,4BAASte,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;AACD;;AAED;AACA,SAAStJ,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,4BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,8BAAS7B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqX,YAA9D;AACA,8BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;;AAEA,WAAO,KAAP,CALiE,CAKnD;AACf;AACF;;AAED,SAAS4L,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC4nB,SAAOoY,QAAP,CAAgBhgC,SAAhB;AACA,4BAASnB,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;;AAEA,SAAO,KAAP,CAJmC,CAIrB;AACf;;AAED,IAAMoM,SAAS,qCAAsB7hB,iBAAtB,CAAf;;AAEA6hB,OAAOqY,UAAP,GAAoB;AAClBtwB,WAASwwB,eADS;AAElBuH,cAAYF,kBAFM;AAGlBG,YAAUF;AAHQ,CAApB;;AAMA7f,OAAOoY,QAAP,GAAkBG,eAAlB;;AAEA,IAAMtY,kBAAkB,6BAAc/J,YAAd,CAAxB;;QAGE8J,M,GAAAA,M;QACAC,e,GAAAA,e;;;;;;;;;;;;;AChFF;;;;;;AAEA,SAAS+f,mBAAT,CAA8BlhC,CAA9B,EAAiC1G,SAAjC,EAA4C;AAC1CA,YAAUwb,QAAV,CAAmBmf,QAAnB,IAA+B36B,UAAU26B,QAAzC;AACA,4BAAS97B,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;;AAEA,SAAO,KAAP;AACD;;AAED,SAAShU,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,6BAAxB,EAAuD+hC,mBAAvD;AACD;;AAED,SAAS//B,QAAT,CAAmBvI,OAAnB,EAA4B;AAC1B,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,6BAAxB,EAAuD+hC,mBAAvD;AACA,4BAAS5oC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,6BAAvB,EAAsDmhC,mBAAtD;AACD;;AAED,IAAMC,cAAc;AAClBhgC,oBADkB;AAElBL;AAFkB,CAApB;;kBAKeqgC,W;;;;;;;;;;;;;kBCrBA,UAAUvoC,OAAV,EAAmBwoC,QAAnB,EAA6BC,QAA7B,EAAuC;AACpD;AACAA,aAAWA,YAAY,WAAvB;AACA,MAAMhhC,SAAS,0BAAS/H,CAAT,CAAWM,OAAX,EAAoBwlC,IAApB,CAAyB,QAAzB,EAAmC5kC,GAAnC,CAAuC,CAAvC,CAAf;;AAEA;AACA;AACA,MAAM8nC,MAAMzmC,SAASwkC,aAAT,CAAuB,GAAvB,CAAZ;;AAEA;AACAiC,MAAIC,QAAJ,GAAeH,QAAf;;AAEA;AACA;AACA;AACAE,MAAIE,IAAJ,GAAWnhC,OAAOohC,SAAP,CAAiBJ,QAAjB,EAA2B,CAA3B,CAAX;;AAEA;AACA,MAAIxmC,SAASC,WAAb,EAA0B;;AAExB,QAAMkF,IAAInF,SAASC,WAAT,CAAqB,aAArB,CAAV;;AAEAkF,MAAE0hC,cAAF,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,IAAhC,EAAsCtpC,MAAtC,EAA8C,CAA9C,EAAiD,CAAjD,EAAoD,CAApD,EAAuD,CAAvD,EAA0D,CAA1D,EAA6D,KAA7D,EAAoE,KAApE,EAA2E,KAA3E,EAAkF,KAAlF,EAAyF,CAAzF,EAA4F,IAA5F;;AAEAkpC,QAAIlmC,aAAJ,CAAkB4E,CAAlB;AAED,GARD,MAQO,IAAIshC,IAAI9Z,SAAR,EAAmB;;AAExB8Z,QAAI9Z,SAAJ,CAAc,SAAd;AACD;AACF,C;;AAhCD;;;;;;;;;;;;;;;;;;ACCA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAdA;AAgBA,IAAMtuB,WAAW,cAAjB;;AAEA;AACA;AACA,SAASi+B,eAAT,CAA0BwK,mBAA1B,EAA+C;AAC7CA,sBAAoBtK,OAAO,wBAAP,CAApB;AACD;;AAED,SAASC,kBAAT,CAA6B59B,IAA7B,EAAmCJ,SAAnC,EAA8C89B,wBAA9C,EAAwE;AACtEA,2BAAyBC,OAAO,yBAAP,CAAzB;AACD;;AAED,IAAMt4B,gBAAgB;AACpBo4B,kCADoB;AAEpBG,wCAFoB;AAGpBC,eAAa,KAHO;AAIpBC,sBAAoB,IAJA;AAKpBoK,iBAAe,GALK;AAMpBC,iBAAe,CANK;AAOpBC,mBAAiB,IAPG;AAQpBC,WAAS;AARW,CAAtB;AAUA;;AAEA;AACA,SAAS/iC,iBAAT,CAA4BC,cAA5B,EAA4C;AAC1C,MAAM9G,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUqG,eAAerG,OAA/B;AACA,MAAM4I,SAAS4f,aAAa9f,gBAAb,EAAf;AACA,MAAMnI,kBAAkB+F,qBAAqBD,cAArB,CAAxB;;AAEA,WAAS0iC,mBAAT,CAA8B5jC,IAA9B,EAAoC;AAClC,QAAIA,SAAS,IAAb,EAAmB;AACjB,sCAAgBnF,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD,KAFD,MAEO;AACLA,sBAAgB4E,IAAhB,GAAuBA,IAAvB;AACD;;AAED5E,oBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;;AAED;AACA,+BAAaA,OAAb,EAAsBM,QAAtB,EAAgCC,eAAhC;;AAEAhB,cAAYqH,WAAZ,CAAwB5G,OAAxB;AACA,4BAAWqG,cAAX,EAA2B/F,QAA3B,EAAqCC,eAArC,EAAsDA,gBAAgBwG,OAAhB,CAAwBE,GAA9E,EAAmF,YAAY;AAC7F,QAAI,sCAAuBZ,cAAvB,EAAuC9F,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD;;AAED,QAAIA,gBAAgB4E,IAAhB,KAAyB/E,SAA7B,EAAwC;AACtCwI,aAAO21B,eAAP,CAAuBwK,mBAAvB;AACD;;AAEDxpC,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,GAXD;AAYD;;AAED,SAASsG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM9F,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB2D,aAAS;AACPE,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OADE;AAOP07B,eAAS;AACP17B,gBAAQ,KADD;AAEPqP,kBAAU,KAFH;AAGPgJ,4BAAoB,KAHb;AAIPzS,4BAAoB,IAJb;AAKPgD,6BAAqB,IALd;AAMPiE,wBAAgB;AANT;AAPF;AAHa,GAAxB;;AAsBA,SAAO1P,eAAP;AACD;AACD;;AAEA,SAASmH,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAI,CAACzG,KAAKiG,OAAL,CAAaE,GAAlB,EAAuB;AACrB;AACD;;AAED,MAAMmiC,aAAa,0BAAS7pC,WAAT,CAAqB8J,aAArB,CAAmCrJ,OAAnC,EAA4Cc,KAAKiG,OAAL,CAAaE,GAAzD,CAAnB;AACA,MAAMo2B,kBAAkB,0BAAS59B,eAAT,CAAyBwM,KAAzB,CAA+BnE,QAA/B,CAAwCshC,UAAxC,EAAoD7hC,MAApD,CAAxB;;AAGA,SAAQ81B,kBAAkB,EAA1B;AACD;;AAED;AACA,SAASj1B,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMxB,cAAc,0BAASA,WAA7B;AACA,MAAM8a,iBAAiB3Z,UAAU2Z,cAAjC;;AAEA;AACA,MAAMvW,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACA,MAAMisB,cAAc3oC,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BhE,KAAnD;;AAEA,MAAIZ,cAAJ;AACA,MAAMsG,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMc,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMmE,SAAS4f,aAAa9f,gBAAb,EAAf;;AAEA,OAAK,IAAIzH,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA,QAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,QAAM38B,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,QAAIH,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACD,KAFD,MAEO;AACLL,cAAQ,qBAAWG,YAAX,EAAR;AACD;;AAED;AACA,QAAMkN,eAAe3Q,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAaE,GAA1D,CAArB;;AAEA;AACA,8BAAWnD,OAAX,EAAoBoM,YAApB,EAAkCrN,KAAlC,EAAyCsG,SAAzC;;AAEA,QAAM41B,gBAAgB;AACpB91B,2BAAsBL,UAAUA,OAAOg2B;AADnB,KAAtB;;AAIA,QAAIh2B,OAAO+1B,WAAX,EAAwB;AACtB,iCAAY76B,OAAZ,EAAqBpD,SAArB,EAAgCwP,YAAhC,EAA8CrN,KAA9C,EAAqDk8B,aAArD;AACD;;AAED;AACA,QAAIj+B,KAAKqE,IAAL,IAAarE,KAAKqE,IAAL,KAAc,EAA/B,EAAmC;AACjCrB,cAAQU,IAAR,GAAeA,IAAf;;AAEA,UAAI8kC,iBAAiB,EAArB;;AAEA,UAAI1gC,OAAOsgC,eAAX,EAA4B;AAC1BI,yBAAoBxoC,KAAKqE,IAAzB,YAAoCE,KAAKqU,KAAL,CAAW5Y,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAA5B,CAApC,YACOqB,KAAKqU,KAAL,CAAW5Y,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA5B,CADP;AAED,OAHD,MAGO;AACLqlC,yBAAiBxoC,KAAKqE,IAAtB;AACD;;AAED;AACA,UAAM65B,YAAYl7B,QAAQsB,WAAR,CAAoBkkC,cAApB,EAAoC7lC,KAApC,GAA4C,EAA9D;AACA,UAAMw7B,aAAa,oBAAUt6B,WAAV,KAA0B,EAA7C;;AAEA,UAAImD,WAAWzC,KAAKC,GAAL,CAAS05B,SAAT,EAAoBC,UAApB,IAAkC,CAAlC,GAAsC,CAArD;;AAEA,UAAI/uB,aAAalM,CAAb,GAAkBqlC,cAAc,CAApC,EAAwC;AACtCvhC,mBAAW,CAACA,QAAZ;AACD;;AAED,UAAIo3B,mBAAJ;;AAEA,UAAI,CAACp+B,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAA1B,EAAoC;AAClCysB,qBAAa;AACXl7B,aAAGkM,aAAalM,CAAb,GAAiBg7B,YAAY,CAA7B,GAAiCl3B,QADzB;AAEX7D,aAAGiM,aAAajM,CAAb,GAAiBg7B,aAAa;AAFtB,SAAb;;AAKA,YAAME,YAAY5/B,YAAY6/B,QAAZ,CAAqBC,YAArB,CAAkChlB,cAAlC,CAAlB;;AAEA8kB,kBAAUpa,MAAV;;AAEA,YAAMxd,SAAS43B,UAAUG,cAAV,CAAyBJ,WAAWl7B,CAApC,EAAuCk7B,WAAWj7B,CAAlD,CAAf;;AAEAnD,aAAKiG,OAAL,CAAa+3B,OAAb,CAAqB96B,CAArB,GAAyBuD,OAAOvD,CAAhC;AACAlD,aAAKiG,OAAL,CAAa+3B,OAAb,CAAqB76B,CAArB,GAAyBsD,OAAOtD,CAAhC;AACD;;AAEDi7B,mBAAa3/B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa+3B,OAA1D,CAAb;;AAEA,UAAMt5B,cAAc,2BAAY1B,OAAZ,EAAqBwlC,cAArB,EAAqCpK,WAAWl7B,CAAhD,EAAmDk7B,WAAWj7B,CAA9D,EAAiEpB,KAAjE,CAApB;;AAEA/B,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqBt5B,WAArB,GAAmCA,WAAnC;;AAEA,UAAI1E,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjC;AACA,YAAM8sB,OAAO;AACX3oB,iBAAO,EADI;AAEX3P,eAAK;AAFM,SAAb;;AAKAs4B,aAAKt4B,GAAL,CAASjD,CAAT,GAAak7B,WAAWl7B,CAAxB;AACAu7B,aAAKt4B,GAAL,CAAShD,CAAT,GAAai7B,WAAWj7B,CAAxB;;AAEAs7B,aAAK3oB,KAAL,GAAa1G,YAAb;;AAEA,YAAMwvB,oBAAoB,CACxB;AACE;AACA17B,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAF5C;AAGEQ,aAAGuB,YAAYI;AAHjB,SADwB,EAKrB;AACD;AACA5B,aAAGwB,YAAYG,IAFd;AAGD1B,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,SALqB,EASrB;AACD;AACAzB,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFzC;AAGDQ,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC;AAHhC,SATqB,EAarB;AACD;AACAzB,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAFjC;AAGDQ,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,SAbqB,CAA1B;;AAoBA85B,aAAKt4B,GAAL,GAAW,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDC,iBAAhD,EAAmEH,KAAK3oB,KAAxE,CAAX;;AAEA9S,gBAAQoF,SAAR;AACApF,gBAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,gBAAQqF,SAAR,GAAoBA,SAApB;AACArF,gBAAQ67B,WAAR,CAAoB,CAAC,CAAD,EAAI,CAAJ,CAApB;AACA77B,gBAAQuZ,MAAR,CAAekiB,KAAK3oB,KAAL,CAAW5S,CAA1B,EAA6Bu7B,KAAK3oB,KAAL,CAAW3S,CAAxC;AACAH,gBAAQwZ,MAAR,CAAeiiB,KAAKt4B,GAAL,CAASjD,CAAxB,EAA2Bu7B,KAAKt4B,GAAL,CAAShD,CAApC;AACAH,gBAAQ4F,MAAR;AACD;AACF;;AAED5F,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,SAAS25B,sBAAT,CAAiC71B,cAAjC,EAAiD;AAC/C,MAAMxK,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAU+J,eAAe/J,OAA/B;AACA,MAAM4I,SAAS4f,aAAa9f,gBAAb,EAAf;AACA,MAAMnI,kBAAkB+F,qBAAqByD,cAArB,CAAxB;;AAEA,WAASg/B,mBAAT,CAA8B5jC,IAA9B,EAAoC;AAClC,QAAIA,SAAS,IAAb,EAAmB;AACjB,sCAAgBnF,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD,KAFD,MAEO;AACLA,sBAAgB4E,IAAhB,GAAuBA,IAAvB;AACD;;AAED5E,oBAAgB6C,MAAhB,GAAyB,KAAzB;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;;AAED;AACA,+BAAaA,OAAb,EAAsBM,QAAtB,EAAgCC,eAAhC;;AAEAhB,cAAYqH,WAAZ,CAAwB5G,OAAxB;AACA,4BAAW+J,cAAX,EAA2BzJ,QAA3B,EAAqCC,eAArC,EAAsDA,gBAAgBwG,OAAhB,CAAwBE,GAA9E,EAAmF,YAAY;AAC7F,QAAI,sCAAuB8C,cAAvB,EAAuCxJ,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD;;AAED,QAAIA,gBAAgB4E,IAAhB,KAAyB/E,SAA7B,EAAwC;AACtCwI,aAAO21B,eAAP,CAAuBwK,mBAAvB;AACD;;AAEDxpC,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,GAXD;AAYD;;AAED,SAAS6/B,mBAAT,CAA8Bz4B,CAA9B,EAAiC1G,SAAjC,EAA4C;AAC1C,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;AACA,MAAIc,aAAJ;;AAEA,WAAS09B,wBAAT,CAAmC19B,IAAnC,EAAyCg/B,WAAzC,EAAsDC,UAAtD,EAAkE;AAChE,QAAIA,eAAe,IAAnB,EAAyB;AACvB,sCAAgB//B,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD,KAFD,MAEO;AACLA,WAAKqE,IAAL,GAAY26B,WAAZ;AACD;;AAEDh/B,SAAKsC,MAAL,GAAc,KAAd;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;;AAED,MAAIoH,EAAEtG,IAAF,IAAUsG,EAAEtG,IAAF,CAAOS,eAAjB,IAAoC,CAAC,oCAAqBb,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAzC,EAAwG;AACtG;AACD;;AAED,MAAMqH,SAAS4f,aAAa9f,gBAAb,EAAf;;AAEA,MAAMnB,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,MAAM1G,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA;AACA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,OAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7CH,WAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,QAAIyG,cAAc1H,OAAd,EAAuBc,IAAvB,EAA6ByG,MAA7B,KACI,sCAAuBzG,KAAKiG,OAAL,CAAa+3B,OAApC,EAA6Cv3B,MAA7C,CADR,EAC8D;;AAE5DzG,WAAKsC,MAAL,GAAc,IAAd;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACA;AACA4I,aAAO81B,kBAAP,CAA0B59B,IAA1B,EAAgCJ,SAAhC,EAA2C89B,wBAA3C;;AAEAp3B,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;AACF;;AAED,SAAO,KAAP,CA9C0C,CA8C5B;AACf;;AAED,SAASyC,aAAT,CAAwBrD,CAAxB,EAA2B1G,SAA3B,EAAsC;AACpC,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;AACA,MAAIc,aAAJ;;AAEA,WAAS09B,wBAAT,CAAmC19B,IAAnC,EAAyCg/B,WAAzC,EAAsDC,UAAtD,EAAkE;AAChEhe,YAAQrS,GAAR,CAAY,wCAAZ;AACA,QAAIqwB,eAAe,IAAnB,EAAyB;AACvB,sCAAgB//B,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD,KAFD,MAEO;AACLA,WAAKqE,IAAL,GAAY26B,WAAZ;AACD;;AAEDh/B,SAAKsC,MAAL,GAAc,KAAd;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,8BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDshB,kBAAkBte,kBAAvE;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DshB,kBAAkBxe,yBAA7E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8CshB,kBAAkBve,WAAhE;AACD;;AAED,MAAI9C,EAAEtG,IAAF,IAAUsG,EAAEtG,IAAF,CAAOS,eAAjB,IAAoC,CAAC,oCAAqBb,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAzC,EAAwG;AACtG,WAAO,KAAP;AACD;;AAED,MAAMqH,SAAS4f,aAAa9f,gBAAb,EAAf;;AAEA,MAAMnB,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,MAAM1G,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA;AACA,MAAI,CAACS,QAAL,EAAe;AACb,WAAO,KAAP;AACD;;AAED,MAAIL,UAAUghB,aAAd,EAA6B;AAC3B,8BAAShiB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDkiB,kBAAkBte,kBAAxE;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DkiB,kBAAkBxe,yBAA9E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CkiB,kBAAkBve,WAAjE;;AAEA;AACAtB,WAAO81B,kBAAP,CAA0Bh+B,UAAUghB,aAApC,EAAmDhhB,SAAnD,EAA8D89B,wBAA9D;;AAEAp3B,MAAEY,wBAAF;;AAEA,WAAO,KAAP;AACD;;AAED,OAAK,IAAI/G,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7CH,WAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,QAAIyG,cAAc1H,OAAd,EAAuBc,IAAvB,EAA6ByG,MAA7B,KACE,sCAAuBzG,KAAKiG,OAAL,CAAa+3B,OAApC,EAA6Cv3B,MAA7C,CADN,EAC4D;AAC1DzG,WAAKsC,MAAL,GAAc,IAAd;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDkiB,kBAAkBte,kBAAxE;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DkiB,kBAAkBxe,yBAA9E;AACA,gCAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CkiB,kBAAkBve,WAAjE;;AAEA;AACAtB,aAAO81B,kBAAP,CAA0B59B,IAA1B,EAAgCJ,SAAhC,EAA2C89B,wBAA3C;;AAEAp3B,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;AACF;;AAED,SAAO,KAAP,CApEoC,CAoEtB;AACf;;AAED,IAAMwgB,eAAe,+BAAgB;AACnCpiB,sCADmC;AAEnCE,4CAFmC;AAGnC8B,kCAHmC;AAInCV,8BAJmC;AAKnCpH,oBALmC;AAMnCqG,4BAA0Bk5B;AANS,CAAhB,CAArB;;AASArX,aAAa7f,gBAAb,CAA8BxC,aAA9B;;AAEA,IAAMsiB,oBAAoB,yBAAU;AAClCriB,qBAAmBw5B,sBADe;AAElCt5B,4CAFkC;AAGlC8B,kCAHkC;AAIlCV,8BAJkC;AAKlCpH,oBALkC;AAMlCmK;AANkC,CAAV,CAA1B;;QAUE+d,Y,GAAAA,Y;QACAC,iB,GAAAA,iB;;;;;;;;;;;;;;AC9bF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAGA,IAAMnoB,WAAW,aAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C;AACA,MAAM42B,YAAY;AAChB3R,aAAS,IADO;AAEhBloB,YAAQ,IAFQ;AAGhB2D,aAAS;AACP6P,aAAO;AACL5S,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADjC;AAELC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFjC;AAGL+F,mBAAW,IAHN;AAIL5G,gBAAQ;AAJH,OADA;AAOPmmC,cAAQ;AACNvlC,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADhC;AAENC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFhC;AAGN+F,mBAAW,IAHL;AAIN5G,gBAAQ;AAJF,OAPD;AAaP6D,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ;AAJL,OAbE;AAmBP07B,eAAS;AACP17B,gBAAQ,KADD;AAEPqP,kBAAU,KAFH;AAGPgJ,4BAAoB,KAHb;AAIPzS,4BAAoB,IAJb;AAKPgD,6BAAqB,IALd;AAMPiE,wBAAgB;AANT;AAnBF;AAHO,GAAlB;;AAiCA,SAAOgtB,SAAP;AACD;AACD;;AAEA,SAASv1B,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAMhI,cAAc,0BAASA,WAA7B;AACA,MAAM69B,cAAc;AAClBxmB,WAAOrX,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAa6P,KAAhD,CADW;AAElB3P,SAAK1H,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAawiC,MAAhD;AAFa,GAApB;;AAKA,MAAIlM,kBAAkB,0BAAS59B,eAAT,CAAyB29B,WAAzB,CAAqCC,eAArC,CAAqDD,WAArD,EAAkE71B,MAAlE,CAAtB;;AAEA,MAAI81B,kBAAkB,EAAtB,EAA0B;AACxB,WAAO,IAAP;AACD;;AAEDD,cAAYxmB,KAAZ,GAAoBrX,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAawiC,MAAhD,CAApB;AACAnM,cAAYn2B,GAAZ,GAAkB1H,YAAY8J,aAAZ,CAA0BrJ,OAA1B,EAAmCc,KAAKiG,OAAL,CAAaE,GAAhD,CAAlB;;AAEAo2B,oBAAkB,0BAAS59B,eAAT,CAAyB29B,WAAzB,CAAqCC,eAArC,CAAqDD,WAArD,EAAkE71B,MAAlE,CAAlB;;AAEA,SAAQ81B,kBAAkB,EAA1B;AACD;;AAED,SAASn8B,MAAT,CAAiBipB,MAAjB,EAAyB;AACvB,SAAO9kB,KAAK0b,IAAL,CAAU1b,KAAKoU,GAAL,CAAS0Q,OAAOnmB,CAAhB,EAAmB,CAAnB,IAAwBqB,KAAKoU,GAAL,CAAS0Q,OAAOlmB,CAAhB,EAAmB,CAAnB,CAAlC,CAAP;AACD;;AAED;AACA,SAASmE,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaqG,EAAES,aAAf,EAA8BvH,QAA9B,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,MAAMxB,cAAc,0BAASA,WAA7B;AACA,MAAM8a,iBAAiB3Z,UAAU2Z,cAAjC;;AAEA;AACA,MAAMvW,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACA,MAAIva,cAAJ;AACA,MAAMsG,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMc,OAAO,oBAAUC,OAAV,EAAb;AACA,MAAMmE,SAAS8f,YAAYhgB,gBAAZ,EAAf;;AAEA,OAAK,IAAIzH,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C6C,YAAQgB,IAAR;;AAEA,QAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED,QAAM38B,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA;AACA,QAAIH,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACD,KAFD,MAEO;AACLL,cAAQ,qBAAWG,YAAX,EAAR;AACD;;AAED,QAAM06B,oBAAoBn+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa6P,KAA1D,CAA1B;AACA,QAAM4yB,qBAAqBjqC,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAawiC,MAA1D,CAA3B;AACA,QAAM5L,kBAAkBp+B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAaE,GAA1D,CAAxB;;AAEA;AACAnD,YAAQoF,SAAR;AACApF,YAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,YAAQqF,SAAR,GAAoBA,SAApB;AACArF,YAAQuZ,MAAR,CAAeqgB,kBAAkB15B,CAAjC,EAAoC05B,kBAAkBz5B,CAAtD;AACAH,YAAQwZ,MAAR,CAAeksB,mBAAmBxlC,CAAlC,EAAqCwlC,mBAAmBvlC,CAAxD;AACAH,YAAQwZ,MAAR,CAAeqgB,gBAAgB35B,CAA/B,EAAkC25B,gBAAgB15B,CAAlD;AACAH,YAAQ4F,MAAR;;AAEA;AACA,QAAMq1B,gBAAgB;AACpB91B,2BAAsBL,UAAUA,OAAOg2B;AADnB,KAAtB;;AAIA,+BAAY96B,OAAZ,EAAqBpD,SAArB,EAAgCI,KAAKiG,OAArC,EAA8ClE,KAA9C,EAAqDk8B,aAArD;;AAEA;AACAj7B,YAAQyB,SAAR,GAAoB1C,KAApB;;AAEA;AACA,QAAMqR,qBAAqBxT,UAAUmL,KAAV,CAAgBqI,kBAAhB,IAAsC,CAAjE;AACA,QAAMC,kBAAkBzT,UAAUmL,KAAV,CAAgBsI,eAAhB,IAAmC,CAA3D;AACA,QAAI4uB,SAAS,EAAb;;AAEA,QAAI,CAACriC,UAAUmL,KAAV,CAAgBsI,eAAjB,IAAoC,CAACzT,UAAUmL,KAAV,CAAgBqI,kBAAzD,EAA6E;AAC3E6uB,eAAS,cAAT;AACD;;AAED,QAAM0G,QAAQ;AACZzlC,SAAG,CAACqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAawiC,MAAb,CAAoBvlC,CAA9B,IAAmCqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA7B,CAApC,IAAuEkQ,kBAD9D;AAEZjQ,SAAG,CAACoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAawiC,MAAb,CAAoBtlC,CAA9B,IAAmCoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAA7B,CAApC,IAAuEkQ;AAF9D,KAAd;;AAKA,QAAMu1B,QAAQ;AACZ1lC,SAAG,CAACqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAA3B,IAAgCqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAawiC,MAAb,CAAoBvlC,CAA9B,CAAjC,IAAqEkQ,kBAD5D;AAEZjQ,SAAG,CAACoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA3B,IAAgCoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAawiC,MAAb,CAAoBtlC,CAA9B,CAAjC,IAAqEkQ;AAF5D,KAAd;;AAKA,QAAMw1B,QAAQ;AACZ3lC,SAAG,CAACqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBjD,CAA3B,IAAgCqB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB5S,CAA7B,CAAjC,IAAoEkQ,kBAD3D;AAEZjQ,SAAG,CAACoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBhD,CAA3B,IAAgCoB,KAAKw4B,IAAL,CAAU/8B,KAAKiG,OAAL,CAAa6P,KAAb,CAAmB3S,CAA7B,CAAjC,IAAoEkQ;AAF3D,KAAd;;AAKA,QAAMy1B,cAAc1oC,OAAOuoC,KAAP,CAApB;AACA,QAAMI,cAAc3oC,OAAOwoC,KAAP,CAApB;AACA,QAAMI,cAAc5oC,OAAOyoC,KAAP,CAApB;;AAEA;AACA,QAAIvpB,QAAQ/a,KAAK44B,IAAL,CAAU,CAAC54B,KAAKoU,GAAL,CAASmwB,WAAT,EAAsB,CAAtB,IAA2BvkC,KAAKoU,GAAL,CAASowB,WAAT,EAAsB,CAAtB,CAA3B,GAAsDxkC,KAAKoU,GAAL,CAASqwB,WAAT,EAAsB,CAAtB,CAAvD,KAAoF,IAAIF,WAAJ,GAAkBC,WAAtG,CAAV,CAAZ;;AAEAzpB,aAAU,MAAM/a,KAAKmE,EAArB;;AAEA,QAAM00B,SAAS,8BAAe9d,KAAf,EAAsB,CAAtB,CAAf;;AAEA,QAAI8d,MAAJ,EAAY;AACV,UAAMC,MAAM,MAAZ,CADU,CACU;AACpB,UAAMh5B,OAAO+4B,OAAO75B,QAAP,KAAoB+5B,OAAOC,YAAP,CAAoBC,SAASH,GAAT,EAAc,EAAd,CAApB,CAApB,GAA6D4E,MAA1E;;AAEA,UAAMj7B,WAAW,EAAjB;;AAEA,UAAIo3B,mBAAJ;;AAEA,UAAIp+B,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjCysB,qBAAa3/B,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6Cc,KAAKiG,OAAL,CAAa+3B,OAA1D,CAAb;AACD,OAFD,MAEO;AACLI,qBAAa;AACXl7B,aAAGwlC,mBAAmBxlC,CADX;AAEXC,aAAGulC,mBAAmBvlC;AAFX,SAAb;;AAKAH,gBAAQU,IAAR,GAAeA,IAAf;AACA,YAAMw6B,YAAYl7B,QAAQsB,WAAR,CAAoBD,IAApB,EAA0B1B,KAA5C;;AAEA,YAAI+lC,mBAAmBxlC,CAAnB,GAAuB05B,kBAAkB15B,CAA7C,EAAgD;AAC9Ck7B,qBAAWl7B,CAAX,IAAgB8D,WAAWk3B,SAAX,GAAuB,EAAvC;AACD,SAFD,MAEO;AACLE,qBAAWl7B,CAAX,IAAgB8D,QAAhB;AACD;;AAED,YAAMq3B,YAAY5/B,YAAY6/B,QAAZ,CAAqBC,YAArB,CAAkChlB,cAAlC,CAAlB;;AAEA8kB,kBAAUpa,MAAV;;AAEA,YAAMxd,SAAS43B,UAAUG,cAAV,CAAyBJ,WAAWl7B,CAApC,EAAuCk7B,WAAWj7B,CAAlD,CAAf;;AAEAnD,aAAKiG,OAAL,CAAa+3B,OAAb,CAAqB96B,CAArB,GAAyBuD,OAAOvD,CAAhC;AACAlD,aAAKiG,OAAL,CAAa+3B,OAAb,CAAqB76B,CAArB,GAAyBsD,OAAOtD,CAAhC;AACD;;AAED,UAAMC,UAAU;AACdwB,mBAAW;AACT1B,aAAG,KADM;AAETC,aAAG;AAFM;AADG,OAAhB;;AAOA,UAAMuB,cAAc,2BAAY1B,OAAZ,EAAqBqB,IAArB,EAA2B+5B,WAAWl7B,CAAtC,EAAyCk7B,WAAWj7B,CAApD,EAAuDpB,KAAvD,EAA8DqB,OAA9D,CAApB;;AAEApD,WAAKiG,OAAL,CAAa+3B,OAAb,CAAqBt5B,WAArB,GAAmCA,WAAnC;;AAEA,UAAI1E,KAAKiG,OAAL,CAAa+3B,OAAb,CAAqBrsB,QAAzB,EAAmC;AACjC;AACA,YAAM8sB,OAAO;AACX3oB,iBAAO,EADI;AAEX3P,eAAK;AAFM,SAAb;;AAKA,YAAM+T,SAAS,CAAC0iB,iBAAD,EAAoBC,eAApB,EAAqC6L,kBAArC,CAAf;;AAEAjK,aAAKt4B,GAAL,CAASjD,CAAT,GAAak7B,WAAWl7B,CAAxB;AACAu7B,aAAKt4B,GAAL,CAAShD,CAAT,GAAai7B,WAAWj7B,CAAxB;;AAEAs7B,aAAK3oB,KAAL,GAAa,0BAASnX,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDzkB,MAAhD,EAAwDukB,KAAKt4B,GAA7D,CAAb;;AAEA,YAAMy4B,oBAAoB,CAAC;AACzB;AACA17B,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFjB;AAGzBQ,aAAGuB,YAAYI;AAHU,SAAD,EAIvB;AACD;AACA5B,aAAGwB,YAAYG,IAFd;AAGD1B,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,SAJuB,EAQvB;AACD;AACAzB,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAAZ,GAAoB,CAFzC;AAGDQ,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC;AAHhC,SARuB,EAYvB;AACD;AACAzB,aAAGwB,YAAYG,IAAZ,GAAmBH,YAAY/B,KAFjC;AAGDQ,aAAGuB,YAAYI,GAAZ,GAAkBJ,YAAYC,MAAZ,GAAqB;AAHzC,SAZuB,CAA1B;;AAmBA85B,aAAKt4B,GAAL,GAAW,0BAASxH,eAAT,CAAyBwM,KAAzB,CAA+BwzB,gBAA/B,CAAgDC,iBAAhD,EAAmEH,KAAK3oB,KAAxE,CAAX;;AAEA9S,gBAAQoF,SAAR;AACApF,gBAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,gBAAQqF,SAAR,GAAoBA,SAApB;AACArF,gBAAQ67B,WAAR,CAAoB,CAAC,CAAD,EAAI,CAAJ,CAApB;AACA77B,gBAAQuZ,MAAR,CAAekiB,KAAK3oB,KAAL,CAAW5S,CAA1B,EAA6Bu7B,KAAK3oB,KAAL,CAAW3S,CAAxC;AACAH,gBAAQwZ,MAAR,CAAeiiB,KAAKt4B,GAAL,CAASjD,CAAxB,EAA2Bu7B,KAAKt4B,GAAL,CAAShD,CAApC;AACAH,gBAAQ4F,MAAR;AACD;AACF;;AAED5F,YAAQmC,OAAR;AACD;AACF;AACD;;AAEA;AACA,SAASG,iBAAT,CAA4BC,cAA5B,EAA4C;AAC1C,MAAM9G,cAAc,0BAASA,WAA7B;AACA,MAAMgB,kBAAkB+F,qBAAqBD,cAArB,CAAxB;AACA,MAAMrG,UAAUqG,eAAerG,OAA/B;;AAEA,MAAMU,YAAY;AAChBa,qBAAiB8E,eAAe/E;AADhB,GAAlB;;AAIE;AACF,+BAAatB,OAAb,EAAsBM,QAAtB,EAAgCC,eAAhC;;AAEA;AACA;AACA,4BAASb,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmiB,YAAYliB,iBAAjE;AACA,4BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmiB,YAAYliB,iBAAjE;AACA,4BAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDmiB,YAAYjiB,iBAAjE;AACA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DmiB,YAAYhiB,yBAAzE;AACAnH,cAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,+BAAcqG,cAAd,EAA8B/F,QAA9B,EAAwCC,eAAxC,EAAyDA,gBAAgBwG,OAAhB,CAAwBwiC,MAAjF,EAAyF,YAAY;AACnGhpC,oBAAgB6C,MAAhB,GAAyB,KAAzB;AACA,QAAI,sCAAuBiD,cAAvB,EAAuC9F,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;;AAEA,gCAASb,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDuhB,YAAYliB,iBAAhE;AACA,gCAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDuhB,YAAYliB,iBAAhE;AACA,gCAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DgoB,YAAYjiB,iBAA3E;AACA,gCAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuEgoB,YAAYhiB,yBAAnF;AACAnH,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA;AACD;;AAEDO,oBAAgBwG,OAAhB,CAAwBE,GAAxB,CAA4B7D,MAA5B,GAAqC,IAArC;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,iCAAcqG,cAAd,EAA8B/F,QAA9B,EAAwCC,eAAxC,EAAyDA,gBAAgBwG,OAAhB,CAAwBE,GAAjF,EAAsF,YAAY;AAChG1G,sBAAgB6C,MAAhB,GAAyB,KAAzB;AACA,UAAI,sCAAuBiD,cAAvB,EAAuC9F,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,wCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACD;;AAED,gCAASb,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDuhB,YAAYliB,iBAAhE;AACA,gCAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDuhB,YAAYliB,iBAAhE;AACA,gCAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+DgoB,YAAYjiB,iBAA3E;AACA,gCAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DzG,SAA5D,EAAuEgoB,YAAYhiB,yBAAnF;AACAnH,kBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD,KAZD;AAaD,GA/BD;AAgCD;;AAED,SAAS4/B,sBAAT,CAAiC71B,cAAjC,EAAiD;AAC/C,MAAMxK,cAAc,0BAASA,WAA7B;AACA,MAAMgB,kBAAkB+F,qBAAqByD,cAArB,CAAxB;AACA,MAAM/J,UAAU+J,eAAe/J,OAA/B;;AAEA;AACA,+BAAaA,OAAb,EAAsBM,QAAtB,EAAgCC,eAAhC;;AAEA;AACA;AACA,4BAASb,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDoiB,iBAAiBohB,iBAAtE;AACA,4BAASrqC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DoiB,iBAAiB1e,yBAA7E;AACA,4BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDoiB,iBAAiBxe,kBAAvE;AACA,4BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CoiB,iBAAiBze,WAAhE;AACA3K,cAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,oCAAmB+J,cAAnB,EAAmCzJ,QAAnC,EAA6CC,eAA7C,EAA8DA,gBAAgBwG,OAAhB,CAAwBwiC,MAAtF,EAA8F,YAAY;AACxG,QAAI,sCAAuBx/B,cAAvB,EAAuCxJ,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,sCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACA,gCAASb,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDwhB,iBAAiBohB,iBAArE;AACA,gCAASrqC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDwhB,iBAAiBxe,kBAAtE;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DwhB,iBAAiB1e,yBAA5E;AACA,gCAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8CwhB,iBAAiBze,WAA/D;AACA3K,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA;AACD;;AAED,sCAAmB+J,cAAnB,EAAmCzJ,QAAnC,EAA6CC,eAA7C,EAA8DA,gBAAgBwG,OAAhB,CAAwBE,GAAtF,EAA2F,YAAY;AACrG,UAAI,sCAAuB8C,cAAvB,EAAuCxJ,gBAAgBwG,OAAvD,CAAJ,EAAqE;AACnE;AACA,wCAAgB/G,OAAhB,EAAyBM,QAAzB,EAAmCC,eAAnC;AACAhB,oBAAYqH,WAAZ,CAAwB5G,OAAxB;AACD;;AAED,gCAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDwhB,iBAAiBohB,iBAArE;AACA,gCAASrqC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDwhB,iBAAiBxe,kBAAtE;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DwhB,iBAAiB1e,yBAA5E;AACA,gCAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8CwhB,iBAAiBze,WAA/D;AACD,KAXD;AAYD,GAzBD;AA0BD;;AAED,IAAMwe,cAAc,+BAAgB;AAClCpiB,4CADkC;AAElCF,sCAFkC;AAGlCgC,kCAHkC;AAIlCV,8BAJkC;AAKlCpH;AALkC,CAAhB,CAApB;;AAQA,IAAMqoB,mBAAmB,yBAAU;AACjCriB,4CADiC;AAEjCF,qBAAmBw5B,sBAFc;AAGjCx3B,kCAHiC;AAIjCV,8BAJiC;AAKjCpH;AALiC,CAAV,CAAzB;;QASEooB,W,GAAAA,W;QACAC,gB,GAAAA,gB;;;;;;;;;;;;;;AC1YF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA,IAAMroB,WAAW,YAAjB;;AAEA;AACA,SAASgG,oBAAT,CAA+BD,cAA/B,EAA+C;AAC7C,MAAMuC,SAASggB,WAAWlgB,gBAAX,EAAf;;AAEA,MAAI,CAACE,OAAOohC,OAAZ,EAAqB;AACnB;AACD;;AAED;AACA,MAAMzpC,kBAAkB;AACtB+qB,aAAS,IADa;AAEtBloB,YAAQ,IAFc;AAGtB+B,UAAMyD,OAAOohC,OAHS;AAItBjjC,aAAS;AACPE,WAAK;AACHjD,WAAGqC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC7H,CADnC;AAEHC,WAAGoC,eAAemB,aAAf,CAA6BqE,KAA7B,CAAmC5H,CAFnC;AAGH+F,mBAAW,IAHR;AAIH5G,gBAAQ,IAJL;AAKH6M,wBAAgB;AALb;AADE;AAJa,GAAxB;;AAeE;AACF,MAAMnE,YAAY;AAChBnG,UAAM,CADU;AAEhBC,SAAK,CAFW;AAGhBnC,WAAO4C,eAAewF,KAAf,CAAqBpI,KAHZ;AAIhBgC,YAAQY,eAAewF,KAAf,CAAqBpG;AAJb,GAAlB;;AAOE;AACA;AACF,MAAI,CAAC,0BAAShG,eAAT,CAAyBwM,KAAzB,CAA+BC,UAA/B,CAA0C3L,gBAAgBwG,OAAhB,CAAwBE,GAAlE,EAAuE6E,SAAvE,CAAL,EAAwF;AACtF;AACD;;AAED;AACA,MAAIwoB,eAAe1rB,OAAOy+B,OAAP,CAAevY,OAAf,CAAuBlmB,OAAOohC,OAA9B,CAAnB;;AAEA,MAAIphC,OAAOqhC,SAAX,EAAsB;AACpB3V,oBAAgB,CAAhB;AACA,QAAIA,gBAAgB1rB,OAAOy+B,OAAP,CAAenmC,MAAnC,EAA2C;AACzC,UAAI0H,OAAOoQ,IAAX,EAAiB;AACfsb,wBAAgB1rB,OAAOy+B,OAAP,CAAenmC,MAA/B;AACD,OAFD,MAEO;AACLozB,uBAAe,CAAC,CAAhB;AACD;AACF;AACF,GATD,MASO;AACLA,oBAAgB,CAAhB;AACA,QAAIA,eAAe,CAAnB,EAAsB;AACpB,UAAI1rB,OAAOoQ,IAAX,EAAiB;AACfsb,wBAAgB1rB,OAAOy+B,OAAP,CAAenmC,MAA/B;AACD,OAFD,MAEO;AACLozB,uBAAe,CAAC,CAAhB;AACD;AACF;AACF;;AAED1rB,SAAOohC,OAAP,GAAiBphC,OAAOy+B,OAAP,CAAe/S,YAAf,CAAjB;;AAEA,SAAO/zB,eAAP;AACD;AACD;;AAEA;AACA,SAASmH,aAAT,CAAwB1H,OAAxB,EAAiCc,IAAjC,EAAuCyG,MAAvC,EAA+C;AAC7C,MAAI,CAACzG,KAAKiG,OAAL,CAAaE,GAAb,CAAiBzB,WAAtB,EAAmC;AACjC;AACD;;AAED,MAAM63B,kBAAkB,0BAAS59B,eAAT,CAAyBoV,IAAzB,CAA8BwoB,eAA9B,CAA8Cv8B,KAAKiG,OAAL,CAAaE,GAAb,CAAiBzB,WAA/D,EAA4E+B,MAA5E,CAAxB;AACA,MAAM2iC,oBAAoB,sCAAuBppC,KAAKiG,OAAL,CAAaE,GAApC,EAAyCM,MAAzC,CAA1B;;AAGA,SAAQ81B,kBAAkB,EAAnB,IAA0B6M,iBAAjC;AACD;;AAED,SAAS9hC,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC;AACA,MAAMK,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED;AACA,MAAM+C,UAAUpD,UAAUslB,aAAV,CAAwBve,MAAxB,CAA+BwiB,UAA/B,CAA0C,IAA1C,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMxU,SAASggB,WAAWlgB,gBAAX,EAAf;;AAEA,OAAK,IAAIzH,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7C,QAAMH,OAAOC,SAASD,IAAT,CAAcG,CAAd,CAAb;;AAEA,QAAI4B,QAAQ,qBAAWG,YAAX,EAAZ;;AAEA,QAAIlC,KAAKsC,MAAT,EAAiB;AACfP,cAAQ,qBAAWK,cAAX,EAAR;AACD;;AAEDY,YAAQgB,IAAR;;AAEA,QAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,cAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,cAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,cAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED;AACA35B,YAAQyB,SAAR,GAAoB1C,KAApB;AACA,QAAMuC,cAActB,QAAQsB,WAAR,CAAoBtE,KAAKqE,IAAzB,CAApB;;AAEArE,SAAKk+B,SAAL,GAAiB55B,YAAY3B,KAAZ,GAAoB,EAArC;;AAEA,QAAMy7B,aAAa,0BAAS3/B,WAAT,CAAqB8J,aAArB,CAAmC3I,UAAUV,OAA7C,EAAsDc,KAAKiG,OAAL,CAAaE,GAAnE,CAAnB;;AAEA,QAAM/C,UAAU;AACdwB,iBAAW;AACT1B,WAAG,IADM;AAETC,WAAG;AAFM;AADG,KAAhB;;AAOA,QAAMuB,cAAc,2BAAY1B,OAAZ,EAAqBhD,KAAKqE,IAA1B,EAAgC+5B,WAAWl7B,CAA3C,EAA8Ck7B,WAAWj7B,CAAX,GAAe,EAA7D,EAAiEpB,KAAjE,EAAwEqB,OAAxE,CAApB;;AAEApD,SAAKiG,OAAL,CAAaE,GAAb,CAAiBzB,WAAjB,GAA+BA,WAA/B;;AAEA1B,YAAQmC,OAAR;AACD;AACF;;AAED,SAAS45B,mBAAT,CAA8Bz4B,CAA9B,EAAiC1G,SAAjC,EAA4C;AAC1C,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;AACA,MAAIc,aAAJ;;AAEA,WAAS09B,wBAAT,CAAmC19B,IAAnC,EAAyCg/B,WAAzC,EAAsDC,UAAtD,EAAkE;AAChE,QAAIA,eAAe,IAAnB,EAAyB;AACvB,sCAAgB//B,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD,KAFD,MAEO;AACLA,WAAKqE,IAAL,GAAY26B,WAAZ;AACD;;AAEDh/B,SAAKsC,MAAL,GAAc,KAAd;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,QAAMmqC,kBAAkB;AACtB5oC,uBAAiB6F,EAAEtG,IAAF,CAAOS;AADF,KAAxB;;AAIA,8BAAS7B,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDgjC,eAApD,EAAqEvhB,WAAWpiB,iBAAhF;AACA,8BAAS9G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDgjC,eAApD,EAAqEvhB,WAAWniB,iBAAhF;AACA,8BAAS/G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,mCAAvB,EAA4DgjC,eAA5D,EAA6EvhB,WAAWliB,yBAAxF;AACA,8BAAShH,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2DgjC,eAA3D,EAA4EvhB,WAAWjiB,wBAAvF;AACD;;AAED,MAAIS,EAAEtG,IAAF,IAAUsG,EAAEtG,IAAF,CAAOS,eAAjB,IAAoC,CAAC,oCAAqBb,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAzC,EAAwG;AACtG;AACD;;AAED,MAAMqH,SAASggB,WAAWlgB,gBAAX,EAAf;;AAEA,MAAMnB,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,MAAM1G,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA;AACA,MAAI,CAACS,QAAL,EAAe;AACb;AACD;;AAED,OAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7CH,WAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,QAAIyG,cAAc1H,OAAd,EAAuBc,IAAvB,EAA6ByG,MAA7B,CAAJ,EAA0C;AACxCzG,WAAKsC,MAAL,GAAc,IAAd;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDqiB,WAAWpiB,iBAAhE;AACA,gCAAS9G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDqiB,WAAWniB,iBAAhE;AACA,gCAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,mCAAxB,EAA6DqiB,WAAWliB,yBAAxE;AACA,gCAAShH,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DqiB,WAAWjiB,wBAAvE;AACA;AACAiC,aAAO81B,kBAAP,CAA0B59B,IAA1B,EAAgCJ,SAAhC,EAA2C89B,wBAA3C;;AAEAp3B,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;AACF;;AAED,SAAO,KAAP,CA1D0C,CA0D5B;AACf;;AAED,SAASoiC,kBAAT,CAA6BhjC,CAA7B,EAAgC1G,SAAhC,EAA2C;AACzC,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;AACA,MAAIc,aAAJ;;AAEA,WAAS09B,wBAAT,CAAmC19B,IAAnC,EAAyCg/B,WAAzC,EAAsDC,UAAtD,EAAkE;AAChE,QAAIA,eAAe,IAAnB,EAAyB;AACvB,sCAAgB//B,OAAhB,EAAyBM,QAAzB,EAAmCQ,IAAnC;AACD,KAFD,MAEO;AACLA,WAAKqE,IAAL,GAAY26B,WAAZ;AACD;;AAEDh/B,SAAKsC,MAAL,GAAc,KAAd;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,8BAASN,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoD0hB,gBAAgBkhB,iBAApE;AACA,8BAASrqC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,kCAAvB,EAA2D0hB,gBAAgB5e,yBAA3E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD0hB,gBAAgB1e,kBAArE;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,qBAAvB,EAA8C0hB,gBAAgB3e,WAA9D;AACA,8BAASxK,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqD0hB,gBAAgBpe,aAArE;AACD;;AAED,MAAM7B,SAASggB,WAAWlgB,gBAAX,EAAf;;AAEA,MAAMnB,SAAS7G,UAAU8G,aAAV,CAAwBC,MAAvC;AACA,MAAM1G,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA;AACA,MAAI,CAACS,QAAL,EAAe;AACb,WAAO,KAAP;AACD;;AAED,MAAIL,UAAUghB,aAAd,EAA6B;AAC3BhhB,cAAUghB,aAAV,CAAwBte,MAAxB,GAAiC,IAAjC;AACA7D,gBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,8BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsiB,gBAAgBkhB,iBAArE;AACA,8BAASrqC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DsiB,gBAAgB5e,yBAA5E;AACA,8BAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDsiB,gBAAgB1e,kBAAtE;AACA,8BAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CsiB,gBAAgB3e,WAA/D;AACA,8BAASxK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDsiB,gBAAgBpe,aAAtE;;AAEA;AACA7B,WAAO81B,kBAAP,CAA0Bh+B,UAAUghB,aAApC,EAAmDhhB,SAAnD,EAA8D89B,wBAA9D;;AAEAp3B,MAAEY,wBAAF;;AAEA,WAAO,KAAP;AACD;;AAED,OAAK,IAAI/G,IAAI,CAAb,EAAgBA,IAAIF,SAASD,IAAT,CAAcI,MAAlC,EAA0CD,GAA1C,EAA+C;AAC7CH,WAAOC,SAASD,IAAT,CAAcG,CAAd,CAAP;AACA,QAAIyG,cAAc1H,OAAd,EAAuBc,IAAvB,EAA6ByG,MAA7B,CAAJ,EAA0C;AACxCzG,WAAKsC,MAAL,GAAc,IAAd;AACA7D,kBAAYqH,WAAZ,CAAwB5G,OAAxB;;AAEA,gCAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDsiB,gBAAgBkhB,iBAArE;AACA,gCAASrqC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,kCAAxB,EAA4DsiB,gBAAgB5e,yBAA5E;AACA,gCAASvK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDsiB,gBAAgB1e,kBAAtE;AACA,gCAASzK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,qBAAxB,EAA+CsiB,gBAAgB3e,WAA/D;AACA,gCAASxK,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDsiB,gBAAgBpe,aAAtE;AACA;AACA7B,aAAO81B,kBAAP,CAA0B59B,IAA1B,EAAgCJ,SAAhC,EAA2C89B,wBAA3C;;AAEAp3B,QAAEY,wBAAF;;AAEA,aAAO,KAAP;AACD;AACF;;AAED,SAAO,KAAP,CAtEyC,CAsE3B;AACf;;AAED,IAAM4gB,aAAa,+BAAgB;AACjCtiB,4CADiC;AAEjC8B,kCAFiC;AAGjCV,8BAHiC;AAIjCpH,oBAJiC;AAKjCqG,4BAA0Bk5B;AALO,CAAhB,CAAnB;;AAQA,IAAMhX,kBAAkB,yBAAU;AAChCviB,4CADgC;AAEhC8B,kCAFgC;AAGhCV,8BAHgC;AAIhCpH,oBAJgC;AAKhCmK,iBAAe2/B;AALiB,CAAV,CAAxB;;QASExhB,U,GAAAA,U;QACAC,e,GAAAA,e;;;;;;;;;;;;;;AC1SF;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAASjW,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiM,iBAA/D;AACA,4BAAS9S,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,4BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,8BAAS7B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqL,iBAA9D;AACA,8BAAS9S,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;;AAEA,WAAO,KAAP,CALiE,CAKnD;AACf;AACF;;AAED,SAASiuB,eAAT,CAA0BngC,SAA1B,EAAqC;AACnC;AACA;AACA;AACA;AACA,MAAM2pC,SAAS3pC,UAAUmL,KAAV,CAAgB+Y,aAAhB,GAAgClkB,UAAUmL,KAAV,CAAgBsC,KAAhD,GAAwDzN,UAAUmL,KAAV,CAAgBuC,SAAvF;AACA,MAAMk8B,SAAS5pC,UAAUmL,KAAV,CAAgB8Y,aAAhB,GAAgCjkB,UAAUmL,KAAV,CAAgBsC,KAAhD,GAAwDzN,UAAUmL,KAAV,CAAgBuC,SAAvF;AACA,MAAMm8B,oBAAoBF,SAASC,MAAnC;AACA,MAAM9wB,aAAa+wB,oBAAoB,IAAvC;;AAEA,MAAM7O,SAASh7B,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BrP,CAA3B,GAA+BwV,UAA9C;AACA,MAAMkF,SAAShe,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA3B,GAA+BuV,UAA9C;;AAEA9Y,YAAUwb,QAAV,CAAmBqR,GAAnB,CAAuBC,WAAvB,IAAuCkO,MAAvC;AACAh7B,YAAUwb,QAAV,CAAmBqR,GAAnB,CAAuBE,YAAvB,IAAwC/O,MAAxC;AACD;;AAED,SAASlM,iBAAT,CAA4BpL,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxCooB,OAAK4X,QAAL,CAAchgC,SAAd;AACA,4BAASnB,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDU,UAAUwb,QAA9D;;AAEA,SAAO,KAAP,CAJwC,CAI1B;AACf;;AAED,SAAS5Q,iBAAT,CAA4BlE,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC0G,IAAEY,wBAAF,GADwC,CACV;AAC9B,MAAMwiC,WAAW9pC,SAAjB;;AAEA,MAAM2pC,SAASG,SAAS3+B,KAAT,CAAe+Y,aAAf,GAA+B4lB,SAAS3+B,KAAT,CAAesC,KAA9C,GAAsDq8B,SAAS3+B,KAAT,CAAeuC,SAApF;AACA,MAAMk8B,SAASE,SAAS3+B,KAAT,CAAe8Y,aAAf,GAA+B6lB,SAAS3+B,KAAT,CAAesC,KAA9C,GAAsDq8B,SAAS3+B,KAAT,CAAeuC,SAApF;AACA,MAAMm8B,oBAAoBF,SAASC,MAAnC;AACA,MAAM9wB,aAAa+wB,oBAAoB,IAAvC;AACA,MAAM7O,SAAS8O,SAAS9uB,WAAT,CAAqBrI,IAArB,CAA0BrP,CAA1B,GAA8BwV,UAA7C;AACA,MAAMkF,SAAS8rB,SAAS9uB,WAAT,CAAqBrI,IAArB,CAA0BpP,CAA1B,GAA8BuV,UAA7C;;AAEA,MAAM5Q,SAASkgB,KAAKpgB,gBAAL,EAAf;;AAEA,MAAIE,OAAO2U,WAAX,EAAwB;AACtB,QAAI3U,OAAO2U,WAAP,KAAuB,CAA3B,EAA8B;AAC5BitB,eAAStuB,QAAT,CAAkBqR,GAAlB,CAAsBC,WAAtB,IAAsCkO,MAAtC;AACA8O,eAAStuB,QAAT,CAAkBqR,GAAlB,CAAsBE,YAAtB,IAAuC/O,MAAvC;AACD,KAHD,MAGO;AACL8rB,eAAStuB,QAAT,CAAkBqR,GAAlB,CAAsBC,WAAtB,IAAsC9O,MAAtC;AACA8rB,eAAStuB,QAAT,CAAkBqR,GAAlB,CAAsBE,YAAtB,IAAuCiO,MAAvC;AACD;AACF,GARD,MAQO;AACL8O,aAAStuB,QAAT,CAAkBqR,GAAlB,CAAsBC,WAAtB,IAAsCkO,MAAtC;AACA8O,aAAStuB,QAAT,CAAkBqR,GAAlB,CAAsBE,YAAtB,IAAuC/O,MAAvC;AACD;;AAED,4BAASnf,WAAT,CAAqBmuB,WAArB,CAAiC8c,SAASxqC,OAA1C,EAAmDwqC,SAAStuB,QAA5D;AACD;;AAED,IAAM4M,OAAO,qCAAsBriB,iBAAtB,CAAb;;AAEAqiB,KAAK6X,UAAL,GAAkB;AAChBtwB,WAASwwB;AADO,CAAlB;;AAIA/X,KAAK4X,QAAL,GAAgBG,eAAhB;;AAEA,IAAM9X,gBAAgB,6BAAczd,iBAAd,CAAtB;;QAGEwd,I,GAAAA,I;QACAC,a,GAAAA,a;;;;;;;;;;;;;;ACtFF;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;AACA;;;;;;AAEA,IAAMzoB,WAAW,YAAjB;;AAEA,IAAI6F,gBAAgB;AAClBskC,kBAAgB;AADE,CAApB;;AAIA,IAAIC,+BAAJ;;AAEA;AACA,SAASC,mBAAT,CAA8BC,wBAA9B,EAAwDC,SAAxD,EAAmEC,SAAnE,EAA8E;AAC5E,MAAMC,YAAYH,yBAAyB1pC,MAA3C;;AAEA,MAAI6pC,YAAY,CAAhB,EAAmB;AACjB,WAAO;AACLr4B,WAAKm4B,SADA;AAELvlC,WAAKwlC,SAFA;AAGLlqB,YAAM,CAACiqB,YAAYC,SAAb,IAA0B;AAH3B,KAAP;AAKD;;AAED,MAAIp4B,MAAMo4B,SAAV;AACA,MAAIxlC,MAAMulC,SAAV;AACA,MAAIpqB,MAAM,CAAV;;AAEA,OAAK,IAAI1a,QAAQ,CAAjB,EAAoBA,QAAQglC,SAA5B,EAAuChlC,OAAvC,EAAgD;AAC9C,QAAMilC,MAAMJ,yBAAyB7kC,KAAzB,CAAZ;;AAEA2M,UAAMrN,KAAKqN,GAAL,CAASA,GAAT,EAAcs4B,GAAd,CAAN;AACA1lC,UAAMD,KAAKC,GAAL,CAASA,GAAT,EAAc0lC,GAAd,CAAN;AACAvqB,WAAOuqB,GAAP;AACD;;AAED,SAAO;AACLt4B,YADK;AAELpN,YAFK;AAGLsb,UAAMH,MAAMsqB;AAHP,GAAP;AAKD;;AAED;AACA,SAASzF,gBAAT,CAA2Bl+B,CAA3B,EAA8B;AAC5B,MAAM1G,YAAY0G,EAAExF,MAApB;AACA,MAAMb,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAIS,YAAYA,SAASD,IAAzB,EAA+B;AAC7BC,aAASD,IAAT,GAAgB,EAAhB;AACD;;AAED,4BAASpB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;;AAEA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6D45B,eAA7D;AACA,4BAASzgC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgE45B,eAAhE;;AAEA,MAAM8K,YAAY;AAChB1pC,qBAAiBmpC;AADD,GAAlB;;AAIA,4BAAShrC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8D8jC,SAA9D,EAAyExkC,iBAAzE;AACD;;AAED;AACA,SAAS05B,eAAT,CAA0B/4B,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;;AAEA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6D45B,eAA7D;AACA,4BAASzgC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgE45B,eAAhE;;AAEA,MAAM8K,YAAY;AAChB1pC,qBAAiBmpC;AADD,GAAlB;;AAIA,4BAAShrC,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8D8jC,SAA9D,EAAyExkC,iBAAzE;;AAEA,MAAM1F,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED;AACAH,WAASD,IAAT,CAAc,CAAd,EAAiBoqC,QAAjB,GAA4B;AAC1BlnC,OAAGtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CADP;AAE1BC,OAAGvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H;AAFP,GAA5B;;AAKAknC,kBAAgBzqC,SAAhB;AACD;;AAED;AACA,SAASyqC,eAAT,CAA0BzqC,SAA1B,EAAqC;AACnC,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMwB,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED,MAAMkqC,aAAarqC,SAASD,IAAT,CAAc,CAAd,EAAiBsqC,UAApC;AACA,MAAMF,WAAWnqC,SAASD,IAAT,CAAc,CAAd,EAAiBoqC,QAAlC;;AAEA;AACA,MAAIznC,QAAQ4B,KAAK2X,GAAL,CAASouB,WAAWpnC,CAAX,GAAeknC,SAASlnC,CAAjC,CAAZ;AACA,MAAIyB,SAASJ,KAAK2X,GAAL,CAASouB,WAAWnnC,CAAX,GAAeinC,SAASjnC,CAAjC,CAAb;;AAEA,MAAI0B,OAAON,KAAKqN,GAAL,CAAS04B,WAAWpnC,CAApB,EAAuBknC,SAASlnC,CAAhC,CAAX;AACA,MAAI4B,MAAMP,KAAKqN,GAAL,CAAS04B,WAAWnnC,CAApB,EAAuBinC,SAASjnC,CAAhC,CAAV;;AAEA;AACA0B,SAAON,KAAKC,GAAL,CAASK,IAAT,EAAe,CAAf,CAAP;AACAA,SAAON,KAAKqN,GAAL,CAAS/M,IAAT,EAAejF,UAAUmL,KAAV,CAAgBpI,KAA/B,CAAP;AACAmC,QAAMP,KAAKC,GAAL,CAASM,GAAT,EAAc,CAAd,CAAN;AACAA,QAAMP,KAAKqN,GAAL,CAAS9M,GAAT,EAAclF,UAAUmL,KAAV,CAAgBpG,MAA9B,CAAN;AACAhC,UAAQ4B,KAAKgmC,KAAL,CAAWhmC,KAAKqN,GAAL,CAASjP,KAAT,EAAgB4B,KAAK2X,GAAL,CAAStc,UAAUmL,KAAV,CAAgBpI,KAAhB,GAAwBkC,IAAjC,CAAhB,CAAX,CAAR;AACAF,WAASJ,KAAKgmC,KAAL,CAAWhmC,KAAKqN,GAAL,CAASjN,MAAT,EAAiBJ,KAAK2X,GAAL,CAAStc,UAAUmL,KAAV,CAAgBpG,MAAhB,GAAyBG,GAAlC,CAAjB,CAAX,CAAT;;AAEA;AACA,MAAM0lC,qBAAqB,4BAAa5qC,UAAUV,OAAvB,EAAgC2F,IAAhC,EAAsCC,GAAtC,EAA2CnC,KAA3C,EAAkDgC,MAAlD,CAA3B;;AAEA;AACA,MAAM8lC,aAAaZ,oBAAoBW,kBAApB,EAAwC5qC,UAAUmL,KAAV,CAAgB8Y,aAAxD,EAAuEjkB,UAAUmL,KAAV,CAAgB+Y,aAAvF,CAAnB;;AAEA;AACA,MAAMhc,SAASogB,WAAWtgB,gBAAX,EAAf;AACA,MAAMwT,WAAW3c,YAAY4c,WAAZ,CAAwBzb,UAAUV,OAAlC,CAAjB;;AAEA,MAAI4I,OAAO6hC,cAAP,KAA0BrqC,SAA9B,EAAyC;AACvCwI,WAAO6hC,cAAP,GAAwB,EAAxB;AACD;;AAEDvuB,WAASqR,GAAT,CAAaC,WAAb,GAA2BnoB,KAAKC,GAAL,CAASD,KAAK2X,GAAL,CAASuuB,WAAWjmC,GAAX,GAAiBimC,WAAW74B,GAArC,CAAT,EAAoD9J,OAAO6hC,cAA3D,CAA3B;AACAvuB,WAASqR,GAAT,CAAaE,YAAb,GAA4B8d,WAAW3qB,IAAvC;AACArhB,cAAYmuB,WAAZ,CAAwBhtB,UAAUV,OAAlC,EAA2Ckc,QAA3C;;AAEA;AACAnb,WAASD,IAAT,GAAgB,EAAhB;;AAEAvB,cAAYqH,WAAZ,CAAwBlG,UAAUV,OAAlC;AACD;;AAED,SAAS8S,aAAT,CAAwB1L,CAAxB,EAA2B1G,SAA3B,EAAsC;AACpC,MAAMV,UAAUU,UAAUV,OAA1B;;AAEA,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB;AACA,4BAAS7G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB;;AAEA,4BAAS7G,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDqX,YAApD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDqX,YAApD;;AAEA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDg5B,eAArD;AACA,MAAI/4B,EAAEzF,IAAF,KAAW,2BAAf,EAA4C;AAC1C,8BAASjC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkDg5B,eAAlD;AACD;AACF;;AAED;AACA,SAAS15B,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjE,8BAAS7B,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DzG,SAA9D,EAAyEoS,aAAzE;AACA,8BAASpT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DzG,SAA9D,EAAyEoS,aAAzE;;AAEA,8BAASpT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DE,iBAA/D;AACA+kC,qBAAiB9qC,SAAjB;;AAEA,WAAO,KAAP;AACD;AACF;;AAED;AACA,SAAS8qC,gBAAT,CAA2B9qC,SAA3B,EAAsC;AACpC,MAAMK,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAIS,YAAYA,SAASD,IAAzB,EAA+B;AAC7BC,aAASD,IAAT,GAAgB,EAAhB;AACD;;AAED,MAAMP,kBAAkB;AACtB6qC,gBAAY;AACVpnC,SAAGtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CADvB;AAEVC,SAAGvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H;AAFvB;AADU,GAAxB;;AAOA,+BAAavD,UAAUV,OAAvB,EAAgCM,QAAhC,EAA0CC,eAA1C;AACD;;AAED;AACA,SAASie,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC;AACA,MAAMK,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED;AACA,MAAMgqC,WAAW;AACflnC,OAAGtD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B7H,CADlB;AAEfC,OAAGvD,UAAU8G,aAAV,CAAwBqE,KAAxB,CAA8B5H;AAFlB,GAAjB;;AAKAlD,WAASD,IAAT,CAAc,CAAd,EAAiBoqC,QAAjB,GAA4BA,QAA5B;AACA,4BAAS3rC,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAASoI,eAAT,CAA0BhB,CAA1B,EAA6B;AAC3B,MAAM1G,YAAY0G,EAAExF,MAApB;AACA,MAAMrC,cAAc,0BAASA,WAA7B;AACA,MAAMwB,WAAW,6BAAaL,UAAUV,OAAvB,EAAgCM,QAAhC,CAAjB;;AAEA,MAAI,CAACS,QAAD,IAAa,CAACA,SAASD,IAAvB,IAA+B,CAACC,SAASD,IAAT,CAAcI,MAAlD,EAA0D;AACxD;AACD;;AAED,MAAMkqC,aAAarqC,SAASD,IAAT,CAAc,CAAd,EAAiBsqC,UAApC;AACA,MAAMF,WAAWnqC,SAASD,IAAT,CAAc,CAAd,EAAiBoqC,QAAlC;;AAEA,MAAI,CAACE,UAAD,IAAe,CAACF,QAApB,EAA8B;AAC5B;AACD;;AAED;AACA,MAAMzjC,SAAS,0BAAS/H,CAAT,CAAWgB,UAAUV,OAArB,EAA8BwlC,IAA9B,CAAmC,QAAnC,EAA6C5kC,GAA7C,CAAiD,CAAjD,CAAf;AACA,MAAMkD,UAAU2D,OAAOwiB,UAAP,CAAkB,IAAlB,CAAhB;;AAEAnmB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACA,MAAMva,QAAQ,qBAAWK,cAAX,EAAd;;AAEA;AACA,MAAMuoC,mBAAmBlsC,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6CorC,UAA7C,CAAzB;AACA,MAAMM,iBAAiBnsC,YAAY8J,aAAZ,CAA0B3I,UAAUV,OAApC,EAA6CkrC,QAA7C,CAAvB;;AAEA,MAAMvlC,OAAON,KAAKqN,GAAL,CAAS+4B,iBAAiBznC,CAA1B,EAA6B0nC,eAAe1nC,CAA5C,CAAb;AACA,MAAM4B,MAAMP,KAAKqN,GAAL,CAAS+4B,iBAAiBxnC,CAA1B,EAA6BynC,eAAeznC,CAA5C,CAAZ;AACA,MAAMR,QAAQ4B,KAAK2X,GAAL,CAASyuB,iBAAiBznC,CAAjB,GAAqB0nC,eAAe1nC,CAA7C,CAAd;AACA,MAAMyB,SAASJ,KAAK2X,GAAL,CAASyuB,iBAAiBxnC,CAAjB,GAAqBynC,eAAeznC,CAA7C,CAAf;;AAEA,MAAMkF,YAAY,oBAAUzF,YAAV,EAAlB;AACA,MAAMkF,SAASogB,WAAWtgB,gBAAX,EAAf;;AAEA;AACA5E,UAAQgB,IAAR;;AAEA,MAAI8D,UAAUA,OAAO00B,MAArB,EAA6B;AAC3Bx5B,YAAQy5B,WAAR,GAAsB30B,OAAO20B,WAAP,IAAsB,SAA5C;AACAz5B,YAAQ05B,aAAR,GAAwB50B,OAAO40B,aAAP,IAAwB,CAAhD;AACA15B,YAAQ25B,aAAR,GAAwB70B,OAAO60B,aAAP,IAAwB,CAAhD;AACD;;AAED35B,UAAQoF,SAAR;AACApF,UAAQkB,WAAR,GAAsBnC,KAAtB;AACAiB,UAAQqF,SAAR,GAAoBA,SAApB;AACArF,UAAQ+Q,IAAR,CAAalP,IAAb,EAAmBC,GAAnB,EAAwBnC,KAAxB,EAA+BgC,MAA/B;AACA3B,UAAQ4F,MAAR;;AAEA5F,UAAQmC,OAAR;AACD;;AAED;AACA,SAASiC,OAAT,CAAkBlI,OAAlB,EAA2B;AACzB,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;;AAEA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmD45B,eAAnD;AACA,4BAASzgC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD45B,eAAtD;;AAEA,4BAASzgC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;;AAEAxe,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACApI,UAAQmI,mBAAR,CAA4B,qBAA5B,EAAmDm9B,gBAAnD;;AAEA,4BAAS/lC,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,SAASuI,QAAT,CAAmBvI,OAAnB,EAA4BuB,eAA5B,EAA6C;AAC3C,MAAMb,YAAY;AAChBa;AADgB,GAAlB;;AAIAmpC,2BAAyBnpC,eAAzB;;AAEA,MAAMR,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb,QAAMD,OAAO,EAAb;;AAEA,iCAAad,OAAb,EAAsBM,QAAtB,EAAgCQ,IAAhC;AACD;;AAED,4BAASpB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDE,iBAArD;;AAEA,4BAAS/G,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmD45B,eAAnD;AACA,4BAASzgC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsD45B,eAAtD;;AAEA,4BAASzgC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;;AAEAxe,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACApI,UAAQmI,mBAAR,CAA4B,qBAA5B,EAAmDm9B,gBAAnD;;AAEA,4BAAS5lC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDzG,SAApD,EAA+D+F,iBAA/D;AACAzG,UAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;;AAEA;AACA;AACApI,UAAQsI,gBAAR,CAAyB,qBAAzB,EAAgDg9B,gBAAhD;;AAEA,4BAAS/lC,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED;AACA,SAAS2rC,gBAAT,CAA2B3rC,OAA3B,EAAoC;AAClC,4BAASN,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDilC,gBAAtD;AACA,4BAAS9rC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmD4kC,eAAnD;AACAnrC,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;AACD;;AAED,SAASwjC,iBAAT,CAA4B5rC,OAA5B,EAAqC;AACnC,MAAMe,WAAW,6BAAaf,OAAb,EAAsBM,QAAtB,CAAjB;;AAEA,MAAI,CAACS,QAAL,EAAe;AACb,QAAMD,OAAO,EAAb;;AAEA,iCAAad,OAAb,EAAsBM,QAAtB,EAAgCQ,IAAhC;AACD;;AAED,4BAASpB,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,2BAAxB,EAAqDiY,YAArD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,4BAAxB,EAAsDilC,gBAAtD;AACA,4BAAS9rC,CAAT,CAAWM,OAAX,EAAoBuG,GAApB,CAAwB,yBAAxB,EAAmD4kC,eAAnD;AACAnrC,UAAQmI,mBAAR,CAA4B,0BAA5B,EAAwDC,eAAxD;;AAEA,4BAAS1I,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,2BAAvB,EAAoDqX,YAApD;AACA,4BAAS9e,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,4BAAvB,EAAqDqkC,gBAArD;AACA,4BAAS9rC,CAAT,CAAWM,OAAX,EAAoBmH,EAApB,CAAuB,yBAAvB,EAAkDgkC,eAAlD;AACAnrC,UAAQsI,gBAAR,CAAyB,0BAAzB,EAAqDF,eAArD;AACD;;AAED,SAASM,gBAAT,GAA6B;AAC3B,SAAOvC,aAAP;AACD;;AAED,SAASwC,gBAAT,CAA2BC,MAA3B,EAAmC;AACjCzC,kBAAgByC,MAAhB;AACD;;AAED;AACA,IAAMogB,aAAa;AACjBzgB,oBADiB;AAEjBC,cAAYN,OAFK;AAGjBA,kBAHiB;AAIjBS,oCAJiB;AAKjBD;AALiB,CAAnB;;AAQA,IAAMugB,kBAAkB;AACtB1gB,YAAUqjC,iBADY;AAEtBpjC,cAAYmjC,gBAFU;AAGtBzjC,WAASyjC;AAHa,CAAxB;;QAOE3iB,U,GAAAA,U;QACAC,e,GAAAA,e;;;;;;;;;;;;;;ACrXF;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAGA,IAAIrhB,oBAAJ;;AAEA,SAASikC,mBAAT,CAA8B3vB,QAA9B,EAAwC4vB,KAAxC,EAA+C;AAC7C,MAAMljC,SAASsgB,KAAKxgB,gBAAL,EAAf;AACA,MAAM+Q,MAAM,GAAZ;;AAEA,MAAMsyB,YAAY1mC,KAAKqK,GAAL,CAASwM,SAAS2B,KAAlB,IAA2BxY,KAAKqK,GAAL,CAAS+J,GAAT,CAA7C;AACA,MAAMuyB,SAASD,YAAYD,KAA3B;;AAEA,MAAMjuB,QAAQxY,KAAKoU,GAAL,CAASA,GAAT,EAAcuyB,MAAd,CAAd;;AAEA,MAAIpjC,OAAOqjC,QAAP,IAAmBpuB,QAAQjV,OAAOqjC,QAAtC,EAAgD;AAC9C/vB,aAAS2B,KAAT,GAAiBjV,OAAOqjC,QAAxB;AACD,GAFD,MAEO,IAAIrjC,OAAOsjC,QAAP,IAAmBruB,QAAQjV,OAAOsjC,QAAtC,EAAgD;AACrDhwB,aAAS2B,KAAT,GAAiBjV,OAAOsjC,QAAxB;AACD,GAFM,MAEA;AACLhwB,aAAS2B,KAAT,GAAiBA,KAAjB;AACD;;AAED,SAAO3B,QAAP;AACD;;AAED,SAASiwB,aAAT,CAAwBxF,QAAxB,EAAkCljC,KAAlC,EAAyCgC,MAAzC,EAAiD;AAC/CkhC,WAAS3iC,CAAT,GAAaqB,KAAKC,GAAL,CAASqhC,SAAS3iC,CAAlB,EAAqB,CAArB,CAAb;AACA2iC,WAAS1iC,CAAT,GAAaoB,KAAKC,GAAL,CAASqhC,SAAS1iC,CAAlB,EAAqB,CAArB,CAAb;AACA0iC,WAAS3iC,CAAT,GAAaqB,KAAKqN,GAAL,CAASi0B,SAAS3iC,CAAlB,EAAqBP,KAArB,CAAb;AACAkjC,WAAS1iC,CAAT,GAAaoB,KAAKqN,GAAL,CAASi0B,SAAS1iC,CAAlB,EAAqBwB,MAArB,CAAb;;AAEA,SAAOkhC,QAAP;AACD;;AAED,SAASyF,YAAT,CAAuBvzB,KAAvB,EAA8BqD,QAA9B,EAAwC;AACtC;AACA,MAAIA,SAASmwB,KAAb,EAAoB;AAClBxzB,UAAM7U,CAAN,IAAW,CAAC,CAAZ;AACD;;AAED,MAAIkY,SAASowB,KAAb,EAAoB;AAClBzzB,UAAM5U,CAAN,IAAW,CAAC,CAAZ;AACD;;AAED;AACA,MAAIiY,SAASmf,QAAT,KAAsB,CAA1B,EAA6B;AAC3B,QAAMjb,QAAQlE,SAASmf,QAAT,GAAoBh2B,KAAKmE,EAAzB,GAA8B,GAA5C;;AAEA,QAAM+iC,OAAOlnC,KAAKib,GAAL,CAASF,KAAT,CAAb;AACA,QAAMosB,OAAOnnC,KAAKkb,GAAL,CAASH,KAAT,CAAb;;AAEA,QAAMqsB,OAAO5zB,MAAM7U,CAAN,GAAUuoC,IAAV,GAAiB1zB,MAAM5U,CAAN,GAAUuoC,IAAxC;AACA,QAAME,OAAO7zB,MAAM7U,CAAN,GAAUwoC,IAAV,GAAiB3zB,MAAM5U,CAAN,GAAUsoC,IAAxC;;AAEA1zB,UAAM7U,CAAN,GAAUyoC,IAAV;AACA5zB,UAAM5U,CAAN,GAAUyoC,IAAV;AACD;;AAED,SAAO7zB,KAAP;AACD;;AAED,SAASgoB,eAAT,CAA0BngC,SAA1B,EAAqCorC,KAArC,EAA4C;AAC1C,MAAMvsC,cAAc,0BAASA,WAA7B;AACA,MAAMS,UAAUU,UAAUV,OAA1B;;AAEA;AACA,MAAMkc,WAAW2vB,oBAAoBnrC,UAAUwb,QAA9B,EAAwC4vB,KAAxC,CAAjB;;AAEAvsC,cAAYmuB,WAAZ,CAAwB1tB,OAAxB,EAAiCkc,QAAjC;;AAEA;AACA;AACA,MAAMywB,YAAYptC,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCU,UAAUkH,WAAV,CAAsByL,IAAtB,CAA2BrP,CAA5D,EAA+DtD,UAAUkH,WAAV,CAAsByL,IAAtB,CAA2BpP,CAA1F,CAAlB;;AAEA;AACA;AACA;AACA,MAAI4U,QAAQ;AACV7U,OAAGtD,UAAUkH,WAAV,CAAsBiE,KAAtB,CAA4B7H,CAA5B,GAAgC2oC,UAAU3oC,CADnC;AAEVC,OAAGvD,UAAUkH,WAAV,CAAsBiE,KAAtB,CAA4B5H,CAA5B,GAAgC0oC,UAAU1oC;AAFnC,GAAZ;;AAKE;AACF4U,UAAQuzB,aAAavzB,KAAb,EAAoBqD,QAApB,CAAR;;AAEA;AACAA,WAASuU,WAAT,CAAqBzsB,CAArB,IAA0B6U,MAAM7U,CAAhC;AACAkY,WAASuU,WAAT,CAAqBxsB,CAArB,IAA0B4U,MAAM5U,CAAhC;;AAEA;AACA1E,cAAYmuB,WAAZ,CAAwB1tB,OAAxB,EAAiCkc,QAAjC;AACD;;AAED,SAAS0wB,iBAAT,CAA4BlsC,SAA5B,EAAuCorC,KAAvC,EAA8C;AAC5C,MAAM9rC,UAAUU,UAAUV,OAA1B;AACA,MAAM6L,QAAQnL,UAAUmL,KAAxB;AACA,MAAMjD,SAASsgB,KAAKxgB,gBAAL,EAAf;;AAEA;AACA;AACA;AACA;AACA,MAAMwT,WAAW2vB,oBAAoBnrC,UAAUwb,QAA9B,EAAwC4vB,KAAxC,CAAjB;;AAEA;AACA,MAAMjzB,QAAQ;AACZ7U,OAAG,CADS;AAEZC,OAAG;AAFS,GAAd;;AAKE;AACF,MAAM4oC,iBAAiB,CAAvB;AACA,MAAMC,8BAA8B,CAApC;AACA,MAAMC,iBAAiB,IAAvB;;AAEA,MAAIjB,QAAQ,CAAZ,EAAe;AACb;AACA,QAAI5vB,SAAS2B,KAAT,GAAiBivB,2BAArB,EAAkD;AAChD;AACA;AACA,UAAIznC,KAAK2X,GAAL,CAASd,SAASuU,WAAT,CAAqBzsB,CAA9B,IAAmC+oC,cAAvC,EAAuD;AACrD7wB,iBAASuU,WAAT,CAAqBzsB,CAArB,GAAyB,CAAzB;AACD,OAFD,MAEO;AACL6U,cAAM7U,CAAN,GAAUkY,SAASuU,WAAT,CAAqBzsB,CAArB,GAAyB6oC,cAAnC;AACD;;AAED;AACA;AACA,UAAIxnC,KAAK2X,GAAL,CAASd,SAASuU,WAAT,CAAqBxsB,CAA9B,IAAmC8oC,cAAvC,EAAuD;AACrD7wB,iBAASuU,WAAT,CAAqBxsB,CAArB,GAAyB,CAAzB;AACD,OAFD,MAEO;AACL4U,cAAM5U,CAAN,GAAUiY,SAASuU,WAAT,CAAqBxsB,CAArB,GAAyB4oC,cAAnC;AACD;AACF;AACF,GAnBD,MAmBO;AACL;;AAEA;AACA;AACA;AACA,QAAIjkC,UAAUA,OAAOokC,uBAArB,EAA8C;AAC5CplC,kBAAYiE,KAAZ,GAAoBsgC,cAAcvkC,YAAYiE,KAA1B,EAAiCA,MAAMpI,KAAvC,EAA8CoI,MAAMpG,MAApD,CAApB;AACD;;AAED;AACA;AACA,QAAIwnC,qBAAqB;AACvBjpC,SAAG6H,MAAMpI,KAAN,GAAc,CAAd,GAAkBmE,YAAYiE,KAAZ,CAAkB7H,CADhB;AAEvBC,SAAG4H,MAAMpG,MAAN,GAAe,CAAf,GAAmBmC,YAAYiE,KAAZ,CAAkB5H;AAFjB,KAAzB;;AAKA;AACAgpC,yBAAqBb,aAAaa,kBAAb,EAAiC/wB,QAAjC,CAArB;;AAEA;AACA;AACA,QAAMgxB,oBAAoB;AACxBlpC,SAAGkY,SAASuU,WAAT,CAAqBzsB,CAArB,GAAyBipC,mBAAmBjpC,CADvB;AAExBC,SAAGiY,SAASuU,WAAT,CAAqBxsB,CAArB,GAAyBgpC,mBAAmBhpC;AAFvB,KAA1B;;AAKA;AACA;AACA,QAAIoB,KAAK2X,GAAL,CAASkwB,kBAAkBlpC,CAA3B,IAAgC+oC,cAApC,EAAoD;AAClD7wB,eAASuU,WAAT,CAAqBzsB,CAArB,GAAyBipC,mBAAmBjpC,CAA5C;AACD,KAFD,MAEO;AACL;AACA6U,YAAM7U,CAAN,GAAUkpC,kBAAkBlpC,CAAlB,GAAsB6oC,cAAhC;AACD;;AAED;AACA;AACA,QAAIxnC,KAAK2X,GAAL,CAASkwB,kBAAkBjpC,CAA3B,IAAgC8oC,cAApC,EAAoD;AAClD7wB,eAASuU,WAAT,CAAqBxsB,CAArB,GAAyBgpC,mBAAmBhpC,CAA5C;AACD,KAFD,MAEO;AACL;AACA4U,YAAM5U,CAAN,GAAUipC,kBAAkBjpC,CAAlB,GAAsB4oC,cAAhC;AACD;AACF;;AAED;AACA3wB,WAASuU,WAAT,CAAqBzsB,CAArB,IAA0B6U,MAAM7U,CAAhC;AACAkY,WAASuU,WAAT,CAAqBxsB,CAArB,IAA0B4U,MAAM5U,CAAhC;;AAEA;AACA,4BAAS1E,WAAT,CAAqBmuB,WAArB,CAAiC1tB,OAAjC,EAA0Ckc,QAA1C;AACD;;AAED,SAASixB,oBAAT,CAA+BzsC,SAA/B,EAA0CorC,KAA1C,EAAiD;AAC/C,MAAM9rC,UAAUU,UAAUV,OAA1B;;AAEA;AACA,MAAMkc,WAAW2vB,oBAAoBnrC,UAAUwb,QAA9B,EAAwC4vB,KAAxC,CAAjB;;AAEA,4BAASvsC,WAAT,CAAqBmuB,WAArB,CAAiC1tB,OAAjC,EAA0Ckc,QAA1C;AACD;;AAED,SAAStJ,eAAT,CAA0BxL,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,4BAAShB,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,2BAAlC,EAA+DiY,YAA/D;AACA,4BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,yBAAlC,EAA6DqM,eAA7D;AACA,4BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BuG,GAA9B,CAAkC,4BAAlC,EAAgEqM,eAAhE;AACD;;AAED,SAASnM,iBAAT,CAA4BW,CAA5B,EAA+B1G,SAA/B,EAA0C;AACxC,MAAI,oCAAqBA,UAAUY,KAA/B,EAAsC8F,EAAEtG,IAAF,CAAOS,eAA7C,CAAJ,EAAmE;AACjEqG,kBAAclH,UAAUkH,WAAxB,CADiE,CAC5B;AACrC,8BAASlI,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,2BAAjC,EAA8DqX,YAA9D;AACA,8BAAS9e,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,yBAAjC,EAA4DyL,eAA5D;AACA,8BAASlT,CAAT,CAAWgB,UAAUV,OAArB,EAA8BmH,EAA9B,CAAiC,4BAAjC,EAA+DyL,eAA/D;;AAEA,WAAO,KAAP,CANiE,CAMnD;AACf;AACF;;AAED,SAAS4L,YAAT,CAAuBpX,CAAvB,EAA0B1G,SAA1B,EAAqC;AACnC,MAAI,CAACA,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAAhC,EAAmC;AACjC,WAAO,KAAP;AACD;;AAED,MAAM6nC,QAAQprC,UAAUgb,WAAV,CAAsBrI,IAAtB,CAA2BpP,CAA3B,GAA+B,GAA7C;;AAEAilB,OAAKwX,QAAL,CAAchgC,SAAd,EAAyBorC,KAAzB;;AAEA,SAAO,KAAP,CATmC,CASrB;AACf;;AAED,SAASx5B,kBAAT,CAA6BlL,CAA7B,EAAgC1G,SAAhC,EAA2C;AACzC,MAAIorC,QAAQ,CAACprC,UAAUgW,SAAX,GAAuB,CAAnC;;AAEA;AACA,MAAM9N,SAASsgB,KAAKxgB,gBAAL,EAAf;;AAEA,MAAIE,UAAUA,OAAOmc,MAArB,EAA6B;AAC3B+mB,aAAS,CAAC,CAAV;AACD;;AAED,MAAM5vB,WAAW2vB,oBAAoBnrC,UAAUwb,QAA9B,EAAwC4vB,KAAxC,CAAjB;;AAEA,4BAASvsC,WAAT,CAAqBmuB,WAArB,CAAiChtB,UAAUV,OAA3C,EAAoDkc,QAApD;AACD;;AAED,SAASoH,kBAAT,CAA6Blc,CAA7B,EAAgC1G,SAAhC,EAA2C;AACzC,MAAMnB,cAAc,0BAASA,WAA7B;AACA,MAAMqJ,SAASsgB,KAAKxgB,gBAAL,EAAf;AACA,MAAMwT,WAAWxb,UAAUwb,QAA3B;AACA,MAAMlc,UAAUU,UAAUV,OAA1B;;AAEA;AACAkc,WAAS2B,KAAT,IAAkBnd,UAAUw6B,WAAV,GAAwBhf,SAAS2B,KAAnD;AACA,MAAIjV,OAAOqjC,QAAP,IAAmB/vB,SAAS2B,KAAT,GAAiBjV,OAAOqjC,QAA/C,EAAyD;AACvD/vB,aAAS2B,KAAT,GAAiBjV,OAAOqjC,QAAxB;AACD,GAFD,MAEO,IAAIrjC,OAAOsjC,QAAP,IAAmBhwB,SAAS2B,KAAT,GAAiBjV,OAAOsjC,QAA/C,EAAyD;AAC9DhwB,aAAS2B,KAAT,GAAiBjV,OAAOsjC,QAAxB;AACD;;AAED3sC,cAAYmuB,WAAZ,CAAwB1tB,OAAxB,EAAiCkc,QAAjC;;AAEA;AACA;AACA,MAAMywB,YAAYptC,YAAY6T,WAAZ,CAAwBpT,OAAxB,EAAiCU,UAAUkH,WAAV,CAAsByL,IAAtB,CAA2BrP,CAA5D,EAA+DtD,UAAUkH,WAAV,CAAsByL,IAAtB,CAA2BpP,CAA1F,CAAlB;AACA,MAAI4U,QAAQ;AACV7U,OAAGtD,UAAUkH,WAAV,CAAsBiE,KAAtB,CAA4B7H,CAA5B,GAAgC2oC,UAAU3oC,CADnC;AAEVC,OAAGvD,UAAUkH,WAAV,CAAsBiE,KAAtB,CAA4B5H,CAA5B,GAAgC0oC,UAAU1oC;AAFnC,GAAZ;;AAKA4U,UAAQuzB,aAAavzB,KAAb,EAAoBqD,QAApB,CAAR;AACAA,WAASuU,WAAT,CAAqBzsB,CAArB,IAA0B6U,MAAM7U,CAAhC;AACAkY,WAASuU,WAAT,CAAqBxsB,CAArB,IAA0B4U,MAAM5U,CAAhC;AACA1E,cAAYmuB,WAAZ,CAAwB1tB,OAAxB,EAAiCkc,QAAjC;AACD;;AAED,IAAMgN,OAAO,qCAAsBziB,iBAAtB,CAAb;;AAEAyiB,KAAKyX,UAAL,GAAkB;AAChBtwB,WAASwwB,eADO;AAEhBuM,aAAWR,iBAFK;AAGhBS,gBAAcF;AAHE,CAAlB;;AAMAjkB,KAAKwX,QAAL,GAAgBG,eAAhB;;AAEA,IAAM1X,YAAY,8BAAe7W,kBAAf,CAAlB;AACA,IAAM8W,iBAAiB,8BAAe9F,kBAAf,CAAvB;AACA,IAAM+F,gBAAgB,6BAAc7K,YAAd,CAAtB;;QAGE0K,I,GAAAA,I;QACAC,S,GAAAA,S;QACAC,c,GAAAA,c;QACAC,a,GAAAA,a;;;;;;;;;;;;;;ACtSF;;;;AACA;;AACA;;;;AACA;;;;AACA;;;;AAEA;AACA,IAAMzF,uBAAuB,OAA7B;AACA,IAAMtjB,WAAW,OAAjB;AACA,IAAM6F,gBAAgB;AACpBmnC,QAAM,CADc;AAEpBloB,UAAQ,CAFY;AAGpBmoB,cAAY,OAHQ;AAIpBC,aAAW;AAJS,CAAtB;;AAOA,IAAIC,wBAAJ;AACA,IAAIC,WAAW,KAAf;;AAEA,SAASC,KAAT,CAAgBjtC,SAAhB,EAA2B;AACzB,MAAMyF,gBAAgBmjB,MAAM5gB,gBAAN,EAAtB;AACA,MAAM1I,UAAUU,UAAUV,OAA1B;AACA,MAAM8jB,QAAQ,0BAASvkB,WAAT,CAAqBwkB,QAArB,CAA8B/jB,OAA9B,EAAuCmG,cAAc6d,YAArD,CAAd;AAHyB,qBAICF,MAAMjY,KAJP;AAAA,MAIjB8I,IAJiB,gBAIjBA,IAJiB;AAAA,MAIXF,OAJW,gBAIXA,OAJW;AAAA,8BAKR/T,UAAU8G,aAAV,CAAwBqE,KALhB;AAAA,MAKjB7H,CALiB,yBAKjBA,CALiB;AAAA,MAKdC,CALc,yBAKdA,CALc;;AAMzB,MAAMlD,WAAW,6BAAaf,OAAb,EAAsB4jB,oBAAtB,CAAjB;AACA,MAAMrJ,YAAYxZ,SAASD,IAAT,CAAc,CAAd,EAAiByZ,SAAnC;AACA,MAAMsL,kBAAkB1f,cAAcmnC,IAAtC;AACA,MAAMloB,SAASjf,cAAcif,MAA7B;;AAEA,MAAIphB,IAAI,CAAJ,IAASA,IAAIyQ,OAAb,IACFxQ,IAAI,CADF,IACOA,IAAI0Q,IADf,EACqB;AACnB;AACD;;AAED,MAAMgR,eAAe,yBAAUP,MAAV,EAAkBzQ,IAAlB,EAAwBF,OAAxB,EAAiCzQ,CAAjC,EAAoCC,CAApC,CAArB;;AAEA,kCAAgB0hB,YAAhB,EAA8BpL,SAA9B,EAAyCsL,eAAzC,EAA0DpR,OAA1D;;AAEAqP,QAAMI,OAAN,GAAgB,IAAhB;;AAEA,4BAAS3kB,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,SAASyjB,SAAT,CAAoBrc,CAApB,EAAuB1G,SAAvB,EAAkC;AAChC+sC,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACA6hC,aAAW,KAAX;AACD;;AAED,SAAS/pB,WAAT,CAAsBvc,CAAtB,EAAyB1G,SAAzB,EAAoC;AAClCitC,QAAMjtC,SAAN;AACAgtC,aAAW,IAAX;AACAD,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACD;;AAED,SAAS2X,WAAT,CAAsBpc,CAAtB,EAAyB1G,SAAzB,EAAoC;AAClC+sC,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACA,4BAAStM,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAAS0jB,MAAT,CAAiBtc,CAAjB,EAAoB1G,SAApB,EAA+B;AAC7BitC,QAAMjtC,SAAN;AACAgtC,aAAW,IAAX;AACAD,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACD;;AAED,SAASzD,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAI,CAAC+sC,eAAL,EAAsB;AACpB;AACD;;AAHqC,yBAKZ/sC,UAAUmL,KALE;AAAA,MAK9B8I,IAL8B,oBAK9BA,IAL8B;AAAA,MAKxBF,OALwB,oBAKxBA,OALwB;AAAA,yBAMrBg5B,eANqB;AAAA,MAM9BzpC,CAN8B,oBAM9BA,CAN8B;AAAA,MAM3BC,CAN2B,oBAM3BA,CAN2B;;;AAQtC,MAAID,IAAI,CAAJ,IAASA,IAAIyQ,OAAb,IACFxQ,IAAI,CADF,IACOA,IAAI0Q,IADf,EACqB;AACnB;AACD;;AAED;AACA,MAAMxO,gBAAgBmjB,MAAM5gB,gBAAN,EAAtB;AACA,MAAM0c,SAASjf,cAAcif,MAA7B;AACA,MAAMthB,UAAUpD,UAAUslB,aAA1B;AACA,MAAMnjB,QAAQ6qC,WAAWvnC,cAAcqnC,SAAzB,GAAqCrnC,cAAconC,UAAjE;AACA,MAAMvtC,UAAUU,UAAUV,OAA1B;;AAEA8D,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;AACA,MAAMuI,eAAe,yBAAUP,MAAV,EAAkBzQ,IAAlB,EAAwBF,OAAxB,EAAiCzQ,CAAjC,EAAoCC,CAApC,CAArB;;AAEA,oCAAkB0hB,YAAlB,EAAgC7hB,OAAhC,EAAyCjB,KAAzC,EAAgD7C,OAAhD;AACD;;AAED,IAAMspB,QAAQ,yBAAU;AACtB9F,0BADsB;AAEtBG,0BAFsB;AAGtBF,sBAHsB;AAItBC,gBAJsB;AAKtBpjB,oBALsB;AAMtB8H;AANsB,CAAV,CAAd;;AASAkhB,MAAM3gB,gBAAN,CAAuBxC,aAAvB;;QAESmjB,K,GAAAA,K;;;;;;;;;;;;;;ACvGT;;;;AACA;;AACA;;;;AACA;;;;AACA;;;;AAEA;AACA,IAAM1F,uBAAuB,OAA7B;AACA,IAAMtjB,WAAW,eAAjB;AACA,IAAM6F,gBAAgB;AACpBmnC,QAAM,CADc;AAEpBloB,UAAQ,CAFY;AAGpBwoB,aAAW,CAHS;AAIpBC,aAAW,CAJS;AAKpBN,cAAY,OALQ;AAMpBC,aAAW;AANS,CAAtB;;AASA,IAAIC,wBAAJ;AACA,IAAIK,eAAJ;AACA,IAAIC,eAAJ;AACA,IAAIC,sBAAJ;AACA,IAAIN,iBAAJ;;AAEA,SAASO,aAAT,CAAwBtoB,YAAxB,EAAsCpL,SAAtC,EAAiD2zB,YAAjD,EAA+D;AAC7D,MAAM/nC,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;AACA,MAAMklC,YAAYznC,cAAcynC,SAAhC;AACA,MAAIO,WAAWne,OAAOC,SAAtB;AACA,MAAIme,WAAW,CAACpe,OAAOC,SAAvB;;AAEAtK,eAAazgB,OAAb,CAAqB,UAAC+G,KAAD,EAAW;AAC9B,QAAMoiC,aAAapiC,MAAM,CAAN,IAAWiiC,YAAX,GAA0BjiC,MAAM,CAAN,CAA7C;AACA,QAAMqiC,YAAY/zB,UAAU8zB,UAAV,CAAlB;;AAEAF,eAAW9oC,KAAKqN,GAAL,CAAS47B,SAAT,EAAoBH,QAApB,CAAX;AACAC,eAAW/oC,KAAKC,GAAL,CAASgpC,SAAT,EAAoBF,QAApB,CAAX;AACD,GAND;;AAQAL,WAASI,WAAWP,SAApB;AACAE,WAASM,WAAWR,SAApB;AACD;;AAED;AACA,SAASW,kBAAT,CAA6BC,cAA7B,EAA6CC,cAA7C,EAA6D95B,IAA7D,EAAmEF,OAAnE,EAA4E;AAC1E,MAAMtO,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;AACA,MAAMmd,kBAAkB1f,cAAcmnC,IAAtC;AACA,MAAM3V,SAAStyB,KAAKqU,KAAL,CAAW+zB,gBAAgBzpC,CAA3B,CAAf;AACA,MAAM4zB,SAASvyB,KAAKqU,KAAL,CAAW+zB,gBAAgBxpC,CAA3B,CAAf;AACA,MAAIyqC,kCAAkC,IAAtC;AACA,MAAI/oB,eAAe,EAAnB;AACA,MAAIP,SAASjf,cAAcif,MAA3B;;AAEA;;;;AAIA,SAAOspB,oCAAoC,CAApC,IAAyCtpB,SAASjf,cAAc0nC,SAAvE,EAAkF;AAChFa,sCAAkC,CAAlC;AACA/oB,mBAAe,yBAAUP,MAAV,EAAkBzQ,IAAlB,EAAwBF,OAAxB,EAAiCkjB,MAAjC,EAAyCC,MAAzC,CAAf;;AAEA;AACA,SAAK,IAAIuM,IAAI,CAAb,EAAgBA,IAAIxe,aAAazkB,MAAjC,EAAyCijC,GAAzC,EAA8C;AAC5C;AACA,UAAM9e,SAASM,aAAawe,CAAb,EAAgB,CAAhB,CAAf;AACA,UAAM7e,SAASK,aAAawe,CAAb,EAAgB,CAAhB,CAAf;;AAEA;AACA,UAAMkK,aAAa/oB,SAAS7Q,OAAT,GAAmB4Q,MAAtC;AACA,UAAMspB,aAAaH,eAAeH,UAAf,CAAnB;;AAEA;;;;AAIA,UAAIM,aAAab,MAAb,IAAuBa,aAAaZ,MAAxC,EAAgD;AAC9CW;AACA;AACD;AACF;;AAEDtpB;AACD;;AAED,MAAIspB,oCAAoC,CAAxC,EAA2C;AACzC,oCAAgB/oB,YAAhB,EAA8B8oB,cAA9B,EAA8C5oB,eAA9C,EAA+DpR,OAA/D;AACD;;AAED,SAAO2Q,MAAP;AACD;;AAED,SAASuoB,KAAT,CAAgBjtC,SAAhB,EAA2B;AACzB,MAAMyF,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;AACA,MAAM1I,UAAUU,UAAUV,OAA1B;AACA,MAAM8jB,QAAQ,0BAASvkB,WAAT,CAAqBwkB,QAArB,CAA8B/jB,OAA9B,EAAuCmG,cAAc6d,YAArD,CAAd;AACA,MAAM4qB,YAAY,0BAASrvC,WAAT,CAAqBsvC,SAArB,CAA+B7uC,OAA/B,EAAwC,CAAxC,CAAlB;AAJyB,qBAKC8jB,MAAMjY,KALP;AAAA,MAKjB8I,IALiB,gBAKjBA,IALiB;AAAA,MAKXF,OALW,gBAKXA,OALW;;AAMzB,MAAM1T,WAAW,6BAAaf,OAAb,EAAsB4jB,oBAAtB,CAAjB;AACA,MAAMkrB,YAAY/tC,SAASD,IAAT,CAAc,CAAd,CAAlB;;AAEAktC,kBAAgBO,mBAAmBK,UAAU/iC,KAAV,CAAgB2O,YAAhB,EAAnB,EAAmDs0B,UAAUv0B,SAA7D,EAAwE5F,IAAxE,EAA8EF,OAA9E,CAAhB;AACAqP,QAAMI,OAAN,GAAgB,IAAhB;;AAEA,4BAAS3kB,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,SAAS+uC,KAAT,CAAgBruC,SAAhB,EAA2B;AACzB,MAAMyF,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;AACA,MAAM1I,UAAUU,UAAUV,OAA1B;AACA,MAAM8jB,QAAQ,0BAASvkB,WAAT,CAAqBwkB,QAArB,CAA8B/jB,OAA9B,EAAuCmG,cAAc6d,YAArD,CAAd;AAHyB,sBAICF,MAAMjY,KAJP;AAAA,MAIjB8I,IAJiB,iBAIjBA,IAJiB;AAAA,MAIXF,OAJW,iBAIXA,OAJW;AAAA,8BAKR/T,UAAU8G,aAAV,CAAwBqE,KALhB;AAAA,MAKjB7H,CALiB,yBAKjBA,CALiB;AAAA,MAKdC,CALc,yBAKdA,CALc;;AAMzB,MAAMlD,WAAW,6BAAaf,OAAb,EAAsB4jB,oBAAtB,CAAjB;AACA,MAAMrJ,YAAYxZ,SAASD,IAAT,CAAc,CAAd,EAAiByZ,SAAnC;AACA,MAAMsL,kBAAkB1f,cAAcmnC,IAAtC;AACA,MAAMloB,SAASjf,cAAcif,MAA7B;;AAEA,MAAIphB,IAAI,CAAJ,IAASA,IAAIyQ,OAAb,IACFxQ,IAAI,CADF,IACOA,IAAI0Q,IADf,EACqB;AACnB;AACD;;AAED,MAAMgR,eAAe,yBAAUP,MAAV,EAAkBzQ,IAAlB,EAAwBF,OAAxB,EAAiCzQ,CAAjC,EAAoCC,CAApC,CAArB;;AAEA,kCAAgB0hB,YAAhB,EAA8BpL,SAA9B,EAAyCsL,eAAzC,EAA0DpR,OAA1D;;AAEAqP,QAAMI,OAAN,GAAgB,IAAhB;;AAEA,4BAAS3kB,WAAT,CAAqBqH,WAArB,CAAiC5G,OAAjC;AACD;;AAED,SAASyjB,SAAT,CAAoBrc,CAApB,EAAuB1G,SAAvB,EAAkC;AAChC+sC,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACA,MAAM1F,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;;AAEAglC,aAAW,KAAX;AACAM,kBAAgB7nC,cAAcif,MAA9B;AACA,4BAAS7lB,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAAS2jB,WAAT,CAAsBvc,CAAtB,EAAyB1G,SAAzB,EAAoC;AAClC,MAAMV,UAAUU,UAAUV,OAA1B;AACA,MAAMmG,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;AACA,MAAMob,QAAQ,0BAASvkB,WAAT,CAAqBwkB,QAArB,CAA8B/jB,OAA9B,EAAuCmG,cAAc6d,YAArD,CAAd;AACA,MAAM4qB,YAAY,0BAASrvC,WAAT,CAAqBsvC,SAArB,CAA+B7uC,OAA/B,EAAwC,CAAxC,CAAlB;AAJkC,+BAKjBU,UAAU8G,aAAV,CAAwBqE,KALP;AAAA,MAK1B7H,CAL0B,0BAK1BA,CAL0B;AAAA,MAKvBC,CALuB,0BAKvBA,CALuB;AAAA,sBAMR6f,MAAMjY,KANE;AAAA,MAM1B8I,IAN0B,iBAM1BA,IAN0B;AAAA,MAMpBF,OANoB,iBAMpBA,OANoB;;AAOlC,MAAMkR,eAAe,yBAAUxf,cAAcif,MAAxB,EAAgCzQ,IAAhC,EAAsCF,OAAtC,EAA+CzQ,CAA/C,EAAkDC,CAAlD,CAArB;;AAEA,MAAIkC,cAAcmnC,IAAd,KAAuB,CAA3B,EAA8B;AAC5ByB,UAAMruC,SAAN;AACD,GAFD,MAEO;AACLutC,kBAActoB,YAAd,EAA4BipB,UAAU/iC,KAAV,CAAgB2O,YAAhB,EAA5B,EAA4D/F,OAA5D;AACAk5B,UAAMjtC,SAAN;AACD;;AAEDgtC,aAAW,IAAX;AACAD,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACD;;AAED,SAAS2X,WAAT,CAAsBpc,CAAtB,EAAyB1G,SAAzB,EAAoC;AAClC+sC,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACA,4BAAStM,WAAT,CAAqBqH,WAArB,CAAiClG,UAAUV,OAA3C;AACD;;AAED,SAAS0jB,MAAT,CAAiBtc,CAAjB,EAAoB1G,SAApB,EAA+B;AAC7B,MAAIyF,cAAcmnC,IAAd,KAAuB,CAA3B,EAA8B;AAC5ByB,UAAMruC,SAAN;AACD,GAFD,MAEO;AACLitC,UAAMjtC,SAAN;AACD;;AAEDgtC,aAAW,IAAX;AACAD,oBAAkB/sC,UAAU8G,aAAV,CAAwBqE,KAA1C;AACD;;AAED,SAASzD,eAAT,CAA0BhB,CAA1B,EAA6B1G,SAA7B,EAAwC;AACtC,MAAI,CAAC+sC,eAAL,EAAsB;AACpB;AACD;;AAHqC,yBAKZ/sC,UAAUmL,KALE;AAAA,MAK9B8I,IAL8B,oBAK9BA,IAL8B;AAAA,MAKxBF,OALwB,oBAKxBA,OALwB;AAAA,yBAMrBg5B,eANqB;AAAA,MAM9BzpC,CAN8B,oBAM9BA,CAN8B;AAAA,MAM3BC,CAN2B,oBAM3BA,CAN2B;;;AAQtC,MAAID,IAAI,CAAJ,IAASA,IAAIyQ,OAAb,IACFxQ,IAAI,CADF,IACOA,IAAI0Q,IADf,EACqB;AACnB;AACD;;AAED;AACA,MAAMxO,gBAAgBojB,cAAc7gB,gBAAd,EAAtB;AACA,MAAM5E,UAAUpD,UAAUslB,aAA1B;AACA,MAAMnjB,QAAQ6qC,WAAWvnC,cAAcqnC,SAAzB,GAAqCrnC,cAAconC,UAAjE;AACA,MAAMvtC,UAAUU,UAAUV,OAA1B;;AAEAguC,kBAAgBA,iBAAiB7nC,cAAcif,MAA/C;;AAEAthB,UAAQsZ,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA,MAAMuI,eAAe,yBAAUqoB,aAAV,EAAyBr5B,IAAzB,EAA+BF,OAA/B,EAAwCzQ,CAAxC,EAA2CC,CAA3C,CAArB;;AAEA,oCAAkB0hB,YAAlB,EAAgC7hB,OAAhC,EAAyCjB,KAAzC,EAAgD7C,OAAhD;AACD;;AAED,IAAMupB,gBAAgB,yBAAU;AAC9B/F,0BAD8B;AAE9BG,0BAF8B;AAG9BF,sBAH8B;AAI9BC,gBAJ8B;AAK9BpjB,oBAL8B;AAM9B8H;AAN8B,CAAV,CAAtB;;AASAmhB,cAAc5gB,gBAAd,CAA+BxC,aAA/B;;QAESojB,a,GAAAA,a;;;;;;;;;;;;kBCtNM,O","file":"cornerstoneTools.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 60);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7cdeb7029b01093072ab","let cornerstone = window.cornerstone;\nlet cornerstoneMath = window.cornerstoneMath;\nlet $ = window.$;\nlet Hammer = window.Hammer;\n\nexport default {\n set cornerstone (cs) {\n cornerstone = cs;\n },\n get cornerstone () {\n return cornerstone;\n },\n set cornerstoneMath (cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath () {\n return cornerstoneMath;\n },\n set $ (module) {\n $ = module;\n },\n get $ () {\n return $;\n },\n set Hammer (module) {\n Hammer = module;\n },\n get Hammer () {\n return Hammer;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction getElementToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState (element, toolType, measurementData) {\n const toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n const eventType = 'CornerstoneToolsMeasurementAdded';\n const eventData = {\n toolType,\n element,\n measurementData\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState (element, toolType, data) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n const eventType = 'CornerstoneToolsMeasurementRemoved';\n const eventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, eventData);\n }\n}\n\nfunction clearToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager (element, toolStateManager) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexport {\n addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolState.js","/* eslint no-bitwise:0 */\n\nexport default function (which, mouseButtonMask) {\n const mouseButton = (1 << (which - 1));\n\n\n return ((mouseButtonMask & mouseButton) !== 0);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/isMouseButtonEnabled.js","import external from '../externalModules.js';\n\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type.toLocaleLowerCase(), {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail);\n }\n\n // TODO: remove jQuery event triggers\n const jqEvent = external.$.Event(type, detail);\n\n external.$(el).trigger(jqEvent, detail);\n if (jqEvent.isImmediatePropagationStopped()) {\n return false;\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/triggerEvent.js","\nlet defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor (color) {\n fillColor = color;\n}\n\nfunction getFillColor () {\n return fillColor;\n}\n\nfunction setToolColor (color) {\n defaultColor = color;\n}\n\nfunction getToolColor () {\n return defaultColor;\n}\n\nfunction setActiveColor (color) {\n activeColor = color;\n}\n\nfunction getActiveColor () {\n return activeColor;\n}\n\nfunction getColorIfActive (active) {\n return active ? activeColor : defaultColor;\n}\n\nconst toolColors = {\n setFillColor,\n getFillColor,\n setToolColor,\n getToolColor,\n setActiveColor,\n getActiveColor,\n getColorIfActive\n};\n\nexport default toolColors;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolColors.js","let defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth (width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth () {\n return defaultWidth;\n}\n\nfunction setActiveWidth (width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth () {\n return activeWidth;\n}\n\nconst toolStyle = {\n setToolWidth,\n getToolWidth,\n setActiveWidth,\n getActiveWidth\n};\n\nexport default toolStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolStyle.js","import textStyle from '../stateManagement/textStyle.js';\n\nexport default function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n const padding = 5;\n const font = textStyle.getFont();\n const fontSize = textStyle.getFontSize();\n const backgroundColor = textStyle.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n let maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n const width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n const boundingBox = {\n width: maxWidth + (padding * 2),\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawTextBox.js","import external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseToolInterface) {\n let configuration = {};\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n const eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n cornerstone.updateImage(element);\n\n let handleMover;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = moveHandle;\n } else {\n handleMover = moveNewHandle;\n }\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, mouseToolInterface.toolType, measurementData);\n }\n\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e, eventData) {\n toolCoordinates.setCoords(eventData);\n // If a mouse button is down, do nothing\n if (eventData.which !== 0) {\n return;\n }\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, mouseToolInterface.toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n const coords = eventData.currentPoints.canvas;\n\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e, eventData) {\n let data;\n const element = eventData.element;\n\n function handleDoneMove () {\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, mouseToolInterface.toolType, data);\n }\n\n external.cornerstone.updateImage(element);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n }\n\n if (!isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, mouseToolInterface.toolType);\n\n if (!toolData) {\n return;\n }\n\n let i;\n\n // Now check to see if there is a handle we can move\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distance = 6;\n const handle = getHandleNearImagePoint(element, data.handles, coords, distance);\n\n if (handle) {\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n const options = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n moveAllHandles(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered (e) {\n mouseToolInterface.onImageRendered(e, e.detail);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n const eventType = 'CornerstoneToolsToolDeactivated';\n const statusChangeEventData = {\n mouseButtonMask,\n toolType: mouseToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n function getConfiguration () {\n return configuration;\n }\n\n function setConfiguration (config) {\n configuration = config;\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration,\n mouseDownCallback,\n mouseMoveCallback,\n mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n toolInterface.mouseDoubleClickCallback = mouseToolInterface.mouseDoubleClickCallback;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonTool.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\n\nconst handleRadius = 6;\n\nexport default function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = toolStyle.getActiveWidth();\n } else {\n context.lineWidth = toolStyle.getToolWidth();\n }\n\n const handleCanvasCoords = external.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/drawHandles.js","import external from '../externalModules.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport touchMoveHandle from '../manipulators/touchMoveHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport touchMoveAllHandles from '../manipulators/touchMoveAllHandles.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction deactivateAllHandles (handles) {\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances (toolData) {\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool (touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n\n const measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n addToolState(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === 'CornerstoneToolsTap') {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n moveNewHandleTouch(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n external.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback (e, eventData) {\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback (e, eventData) {\n // Console.log('touchTool tapCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let data;\n let i;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback () {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distanceSq = 25; // Should probably make this a settable property later\n const handle = getHandleNearImagePoint(element, data.handles, coords, distanceSq);\n\n if (handle) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e, eventData);\n } else {\n touchDownActivateCallback(e, eventData);\n }\n\n return false;\n }\n\n function touchStartCallback (e, eventData) {\n // Console.log('touchTool touchStartCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.startPoints.canvas;\n let data;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let i;\n\n function doneMovingCallback (lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n external.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') {\n triggerEvent(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n data.active = true;\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n external.$(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n external.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of touchTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered (e) {\n touchToolInterface.onImageRendered(e, e.detail);\n }\n\n // Visible, interactive\n function deactivate (element) {\n const eventType = 'CornerstoneToolsToolDeactivated';\n const statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexport default touchTool;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchTool.js","let defaultStartLoadHandler;\nlet defaultEndLoadHandler;\nlet defaultErrorLoadingHandler;\n\nfunction setStartLoadHandler (handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler () {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler (handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler () {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler (handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler () {\n return defaultErrorLoadingHandler;\n}\n\nconst loadHandlerManager = {\n setStartLoadHandler,\n getStartLoadHandler,\n setEndLoadHandler,\n getEndLoadHandler,\n setErrorLoadingHandler,\n getErrorLoadingHandler\n};\n\nexport default loadHandlerManager;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/loadHandlerManager.js","import external from '../externalModules.js';\n\nexport default function (touchDragCallback, options) {\n let events = 'CornerstoneToolsTouchDrag';\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsTouchStart';\n }\n\n const toolInterface = {\n activate (element) {\n external.$(element).off(events, touchDragCallback);\n\n if (options && options.eventData) {\n external.$(element).on(events, options.eventData, touchDragCallback);\n } else {\n external.$(element).on(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchDragTool.js","import external from '../externalModules.js';\n\nexport default function (renderData, handles) {\n const image = renderData.image;\n const imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n let handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (external.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/anyHandlesOutsideImage.js","import external from '../externalModules.js';\n\nexport default function (mouseDownCallback) {\n let configuration = {};\n\n const toolInterface = {\n activate (element, mouseButtonMask, options) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n const eventData = {\n mouseButtonMask,\n options\n };\n\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleMouseButtonTool.js","let defaultFontSize = 15,\n defaultFont = `${defaultFontSize}px Arial`,\n defaultBackgroundColor = 'transparent';\n\nfunction setFont (font) {\n defaultFont = font;\n}\n\nfunction getFont () {\n return defaultFont;\n}\n\nfunction setFontSize (fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize () {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor (backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor () {\n return defaultBackgroundColor;\n}\n\nconst textStyle = {\n setFont,\n getFont,\n setFontSize,\n getFontSize,\n setBackgroundColor,\n getBackgroundColor\n};\n\nexport default textStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/textStyle.js","import external from '../externalModules.js';\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nexport default function convertToVector3 (arrayOrVector3) {\n const cornerstoneMath = external.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/convertToVector3.js","import external from '../externalModules.js';\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager () {\n let toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState (imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState (imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState (element, toolType, data) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState (element, toolType) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = imageIdToolState[toolType];\n\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState,\n restoreImageIdToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nconst globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexport {\n newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/imageIdSpecificStateManager.js","import external from '../externalModules.js';\n\nexport default function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return external.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInsideBoundingBox.js","import external from '../externalModules.js';\n\n// Returns a decimal value given a fractional value\nfunction fracToDec (fractionalValue) {\n return parseFloat(`.${fractionalValue}`);\n}\n\nexport default function (image, storedPixelValue) {\n const cornerstone = external.cornerstone;\n const patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n const modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n const modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n const patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n const petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n const startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n const totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n const halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n const seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n const acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n const injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n const durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n const correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n const suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateSUV.js","import external from '../externalModules.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\n\nexport default function (element, handles, coords, distanceThreshold) {\n let nearbyHandle;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if (pointInsideBoundingBox(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n const handleCanvas = external.cornerstone.pixelToCanvas(element, handle);\n const distance = external.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/getHandleNearImagePoint.js","let configMaxSimultaneousRequests;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nconst maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo () {\n const ua = navigator.userAgent;\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n let tem;\n\n if (/trident/i.test(M[1])) {\n tem = (/\\brv[ :]+(\\d+)/g).exec(ua) || [];\n\n return `IE ${tem[1] || ''}`;\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests (newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests () {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests () {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n const browserName = info[0];\n const browserVersion = info[1];\n const browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice () {\n const pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n\n return pattern.test(navigator.userAgent);\n}\n\nexport {\n getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n setMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice\n};\n\n\n\n// WEBPACK FOOTER //\n// ./util/getMaxSimultaneousRequests.js","import external from '../externalModules.js';\n\nexport default function (mouseWheelCallback) {\n const toolInterface = {\n activate (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n const eventData = {\n };\n\n external.$(element).on('CornerstoneToolsMouseWheel', eventData, mouseWheelCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseWheelTool.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback (e, eventData) {\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n external.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n\n function mouseUpCallback () {\n handle.active = false;\n external.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveHandle.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function moveCallback (e, eventData) {\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function whichMovement (e) {\n external.$(element).off('CornerstoneToolsMouseMove', whichMovement);\n external.$(element).off('CornerstoneToolsMouseDrag', whichMovement);\n\n external.$(element).on('CornerstoneToolsMouseMove', moveCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', moveCallback);\n\n external.$(element).on('CornerstoneToolsMouseClick', moveEndCallback);\n if (e.type === 'CornerstoneToolsMouseDrag') {\n external.$(element).on('CornerstoneToolsMouseUp', moveEndCallback);\n }\n }\n\n function measurementRemovedCallback (e, eventData) {\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback (e, eventData) {\n if (eventData.toolType === toolType) {\n external.$(element).off('CornerstoneToolsMouseMove', moveCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', moveCallback);\n external.$(element).off('CornerstoneToolsMouseClick', moveEndCallback);\n external.$(element).off('CornerstoneToolsMouseUp', moveEndCallback);\n external.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n external.$(element).on('CornerstoneToolsMouseDrag', whichMovement);\n external.$(element).on('CornerstoneToolsMouseMove', whichMovement);\n external.$(element).on('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n external.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n function moveEndCallback () {\n external.$(element).off('CornerstoneToolsMouseMove', moveCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', moveCallback);\n external.$(element).off('CornerstoneToolsMouseClick', moveEndCallback);\n external.$(element).off('CornerstoneToolsMouseUp', moveEndCallback);\n external.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandle.js","import external from '../externalModules.js';\n\nexport default function (onImageRendered) {\n let configuration = {};\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonRectangleTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function customEventOnImageRendered (e) {\n onImageRendered(e, e.detail);\n }\n\n const toolInterface = {\n disable (element) {\n element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n },\n enable (element) {\n element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n element.addEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n external.cornerstone.updateImage(element);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/displayTool.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n const distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback (e, eventData) {\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback (e, eventData) {\n external.$(element).off('CornerstoneToolsTouchDrag', moveCallback);\n external.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback);\n external.$(element).off('CornerstoneToolsTap', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n if (e.type === 'CornerstoneToolsTouchPinch' || e.type === 'CornerstoneToolsTouchPress') {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation (e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', moveCallback);\n external.$(element).on('CornerstoneToolsTouchPinch', moveEndCallback);\n external.$(element).on('CornerstoneToolsTouchEnd', moveEndCallback);\n external.$(element).on('CornerstoneToolsTap', moveEndCallback);\n external.$(element).on('CornerstoneToolsTouchStart', stopImmediatePropagation);\n\n function toolDeactivatedCallback () {\n external.$(element).off('CornerstoneToolsTouchDrag', moveCallback);\n external.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback);\n external.$(element).off('CornerstoneToolsTap', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n external.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandleTouch.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Projects a patient point to an image point\nexport function projectPatientPointToImagePlane (patientPoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n const point = patientPoint.clone().sub(imagePositionPatient);\n const x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n const y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n\n return {\n x,\n y\n };\n}\n\n// Projects an image point to a patient point\nexport function imagePointToPatientPoint (imagePoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n\n const x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n const y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n const patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane (imagePlane) {\n // Get the points\n const topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n const topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n const bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n const bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n const rect = {\n top: new external.cornerstoneMath.Line3(topLeft, topRight),\n left: new external.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new external.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new external.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n\n return rect;\n}\n\nfunction lineRectangleIntersection (line, rect) {\n const intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n const segment = rect[side];\n const intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nexport function planePlaneIntersection (targetImagePlane, referenceImagePlane) {\n const targetRowCosines = convertToVector3(targetImagePlane.rowCosines);\n const targetColumnCosines = convertToVector3(targetImagePlane.columnCosines);\n const targetImagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n const referenceRowCosines = convertToVector3(referenceImagePlane.rowCosines);\n const referenceColumnCosines = convertToVector3(referenceImagePlane.columnCosines);\n const referenceImagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n const targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n const targetPlane = new external.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n const referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n const referencePlane = new external.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n const originDirection = referencePlane.clone().intersectPlane(targetPlane);\n const origin = originDirection.origin;\n const direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n const bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n const distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n const line = new external.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n const rect = getRectangleFromImagePlane(referenceImagePlane);\n const intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointProjector.js","import external from '../externalModules.js';\nimport { getMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nconst numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nlet maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nlet awake = false;\nconst grabDelay = 20;\n\nfunction addRequest (element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n const requestDetails = {\n type,\n imageId,\n preventCache,\n doneCallback,\n failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n const imagePromise = external.cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise) {\n imagePromise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack (type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain () {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest (requestDetails) {\n const cornerstone = external.cornerstone;\n // Increment the number of current requests of this type\n const type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n const imageId = requestDetails.imageId;\n const doneCallback = requestDetails.doneCallback;\n const failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n const imagePromise = cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imagePromise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority (requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n const priority = requestTypeToLoadPriority(requestDetails);\n\n let loader;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing () {\n // Begin by grabbing X images\n const maxSimultaneousRequests = getMaxSimultaneousRequests();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n const currentRequests = numRequests.interaction +\n numRequests.thumbnail +\n numRequests.prefetch;\n const requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest () {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length &&\n !requestPool.thumbnail.length &&\n !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool () {\n return requestPool;\n}\n\nexport default {\n addRequest,\n clearRequestStack,\n startGrabbing,\n getRequestPool\n};\n\n\n\n// WEBPACK FOOTER //\n// ./requestPool/requestPoolManager.js","import external from '../externalModules.js';\n\nexport default function (touchDragCallback, options) {\n let configuration = {};\n let events = 'CornerstoneToolsMultiTouchDrag';\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsMultiTouchStart';\n }\n\n const toolInterface = {\n activate (element) {\n external.$(element).off(events, touchDragCallback);\n\n if (options && options.eventData) {\n external.$(element).on(events, options.eventData, touchDragCallback);\n } else {\n external.$(element).on(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/multiTouchDragTool.js","import scrollToIndex from './scrollToIndex.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default function (element, images, loop = false) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n let newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n const nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n scrollToIndex(element, newImageIdIndex);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scroll.js","export default function (value, precision) {\n const multiplier = Math.pow(10, precision);\n\n\n return (Math.round(value * multiplier) / multiplier);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/roundToDecimal.js","export default function (ellipse, location) {\n const xRadius = ellipse.width / 2;\n const yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n const center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n const normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n const inEllipse = ((normalized.x * normalized.x) / (xRadius * xRadius)) + ((normalized.y * normalized.y) / (yRadius * yRadius)) <= 1.0;\n\n\n return inEllipse;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInEllipse.js","/**\n * This function is used to prevent selection from occuring when left click dragging on the image\n * @param e the event that is provided to your event handler\n * Based on: http://stackoverflow.com/questions/5429827/how-can-i-prevent-text-element-selection-with-cursor-drag\n * @returns {boolean}\n */\nexport default function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pauseEvent.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const storedPixelData = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * enabledElement.image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n const alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getRGBPixels.js","import external from '../externalModules.js';\n\nexport default function (points) {\n const page = external.cornerstoneMath.point.copy(points.page);\n const image = external.cornerstoneMath.point.copy(points.image);\n const client = external.cornerstoneMath.point.copy(points.client);\n const canvas = external.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page,\n image,\n client,\n canvas\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/copyPoints.js","let coordsData;\n\nfunction setCoords (eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords () {\n return coordsData;\n}\n\nconst toolCoordinates = {\n setCoords,\n getCoords\n};\n\nexport default toolCoordinates;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolCoordinates.js","import getHandleNearImagePoint from './getHandleNearImagePoint.js';\n\nfunction getActiveHandle (handles) {\n let activeHandle;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\nexport default function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n const activeHandle = getActiveHandle(handles);\n const nearbyHandle = getHandleNearImagePoint(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/handleActivator.js","import external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, data, toolData, toolType, options, doneMovingCallback) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function mouseDragCallback (e, eventData) {\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n\n external.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n\n function mouseUpCallback (e, eventData) {\n data.invalidated = true;\n\n external.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveAllHandles.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\nexport default function (element, timePoints, wrap) {\n const toolData = getToolState(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const timeSeriesData = toolData.data[0];\n const currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n const currentImageIdIndex = currentStack.currentImageIdIndex;\n let newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n const viewport = cornerstone.getViewport(element);\n const newStack = timeSeriesData.stacks[newStackIndex];\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n let loader;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n const imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/incrementTimePoint.js","import { planePlaneIntersection, projectPatientPointToImagePlane } from '../util/pointProjector.js';\n\n// Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner\n// Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but\n// That requires a bit more math and this works fine for most cases\nexport default function (targetImagePlane, referenceImagePlane) {\n const points = planePlaneIntersection(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: projectPatientPointToImagePlane(points.start, targetImagePlane),\n end: projectPatientPointToImagePlane(points.end, targetImagePlane)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/calculateReferenceLine.js","import external from '../externalModules.js';\nimport calculateReferenceLine from './calculateReferenceLine.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Renders the active reference line\nexport default function (context, eventData, targetElement, referenceElement) {\n const cornerstone = external.cornerstone;\n const targetImage = cornerstone.getEnabledElement(targetElement).image;\n const referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n const referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane ||\n !referenceImagePlane ||\n !targetImagePlane.rowCosines ||\n !targetImagePlane.columnCosines ||\n !targetImagePlane.imagePositionPatient ||\n !referenceImagePlane.rowCosines ||\n !referenceImagePlane.columnCosines ||\n !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = convertToVector3(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = convertToVector3(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = convertToVector3(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = convertToVector3(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n const targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n const referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n let angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) { // 0.5 radians = ~30 degrees\n return;\n }\n\n const referenceLine = calculateReferenceLine(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n const refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n const refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n const color = toolColors.getActiveColor();\n const lineWidth = toolStyle.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/renderActiveReferenceLine.js","import getOrientationString from './getOrientationString.js';\nimport invertOrientationString from './invertOrientationString.js';\n\nconst orientation = {\n getOrientationString,\n invertOrientationString\n};\n\nexport default orientation;\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/index.js","import external from '../externalModules.js';\n\n/**\n * Sets the canvas context transformation matrix so it is scaled to show text\n * more cleanly even if the image is scaled up. See\n * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText\n * for more information\n *\n * @param enabledElement\n * @param context\n * @param fontSize\n * @returns {{fontSize: number, lineHeight: number, fontScale: number}}\n */\nexport default function (enabledElement, context, fontSize) {\n const fontScale = 0.1;\n\n external.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n const scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n const lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n\n return {\n fontSize: scaledFontSize,\n lineHeight,\n fontScale\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/setContextToDisplayFontSize.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { stackScroll } from '../stackTools/stackScroll.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (element, newImageIdIndex) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (toolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function doneCallback (image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch(error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n const eventData = {\n newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n const newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n const config = stackScroll.getConfiguration();\n\n if (config && config.retryLoadOnScroll === true) {\n const newImagePromise = cornerstone.imageCache.getImagePromise(newImageId);\n\n if (newImagePromise && newImagePromise.state() === 'rejected') {\n cornerstone.imageCache.removeImagePromise(newImageId);\n }\n }\n\n // Convert the preventCache value in stack data to a boolean\n const preventCache = Boolean(stackData.preventCache);\n\n let imagePromise;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n requestPoolManager.startGrabbing();\n\n triggerEvent(element, 'CornerstoneStackScroll', eventData);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scrollToIndex.js","import external from '../externalModules.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport multiTouchDragTool from '../imageTools/multiTouchDragTool.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport scroll from '../util/scroll.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n const mouseDragEventData = {\n deltaY: 0\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback (e, eventData) {\n const images = -eventData.direction;\n\n const config = stackScroll.getConfiguration();\n\n let loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n scroll(eventData.element, images, loop);\n}\n\nfunction dragCallback (e, eventData) {\n const element = eventData.element;\n\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n const config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n let pixelsPerImage = Math.max(2, external.$(element).height() / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n e.data.deltaY = e.data.deltaY || 0;\n e.data.deltaY += eventData.deltaPoints.page.y;\n if (Math.abs(e.data.deltaY) >= pixelsPerImage) {\n const imageDelta = e.data.deltaY / pixelsPerImage;\n const imageIdIndexOffset = Math.round(imageDelta);\n const imageDeltaMod = e.data.deltaY % pixelsPerImage;\n\n e.data.deltaY = imageDeltaMod;\n scroll(element, imageIdIndexOffset);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nconst stackScroll = simpleMouseButtonTool(mouseDownCallback);\nconst stackScrollWheel = mouseWheelTool(mouseWheelCallback);\n\nconst options = {\n eventData: {\n deltaY: 0\n }\n};\nconst stackScrollTouchDrag = touchDragTool(dragCallback, options);\n\nfunction multiTouchDragCallback (e, eventData) {\n const config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e, eventData);\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 3);\n }\n};\n\nconst stackScrollMultiTouch = multiTouchDragTool(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexport {\n stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScroll.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n const luminance = [];\n let index = 0;\n const pixelData = image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns) + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getLuminance.js","// http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\nexport default function (context, x, y, w, h) {\n const kappa = 0.5522848,\n ox = (w / 2) * kappa, // Control point offset horizontal\n oy = (h / 2) * kappa, // Control point offset vertical\n xe = x + w, // X-end\n ye = y + h, // Y-end\n xm = x + w / 2, // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawEllipse.js","export default function (context, start, color, lineWidth) {\n const handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawCircle.js","export default function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n const headLength = 10;\n\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawArrow.js","import pointInEllipse from './pointInEllipse.js';\n\nexport default function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n const point = {\n x,\n y\n };\n\n if (pointInEllipse(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateEllipseStatistics.js","import external from '../externalModules.js';\n\nexport default function (keyDownCallback) {\n let configuration = {};\n\n const toolInterface = {\n activate (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n external.$(element).on('CornerstoneToolsKeyDown', keyDownCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/keyboardTool.js","import external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (touchEventData, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n const element = touchEventData.element;\n const cornerstone = external.cornerstone;\n\n function touchDragCallback (e, eventData) {\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback);\n\n function touchEndCallback (e, eventData) {\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n external.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback);\n external.$(element).off('CornerstoneToolsTouchPinch', touchEndCallback);\n external.$(element).off('CornerstoneToolsTouchPress', touchEndCallback);\n external.$(element).off('CornerstoneToolsTouchEnd', touchEndCallback);\n external.$(element).off('CornerstoneToolsDragEnd', touchEndCallback);\n external.$(element).off('CornerstoneToolsTap', touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n if (deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e, eventData);\n }\n }\n\n external.$(element).on('CornerstoneToolsTouchPinch', touchEndCallback);\n external.$(element).on('CornerstoneToolsTouchPress', touchEndCallback);\n external.$(element).on('CornerstoneToolsTouchEnd', touchEndCallback);\n external.$(element).on('CornerstoneToolsDragEnd', touchEndCallback);\n external.$(element).on('CornerstoneToolsTap', touchEndCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveAllHandles.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nconst runAnimation = {\n value: false\n};\n\nconst touchEndEvents = ['CornerstoneToolsTouchEnd',\n 'CornerstoneToolsDragEnd',\n 'CornerstoneToolsTouchPinch',\n 'CornerstoneToolsTouchPress',\n 'CornerstoneToolsTap'\n].join(' ');\n\nfunction animate (lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Update\n const time = (new Date()).getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n const distanceRemaining = Math.abs(handle.y - targetLocation.y);\n const linearDistEachFrame = distanceRemaining / 10;\n\n console.log(`distanceRemaining: ${distanceRemaining}`);\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\nexport default function (touchEventData, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n\n const time = (new Date()).getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const fingerDistance = -57;\n\n const aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n let targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback (e, eventData) {\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n const currentPoints = eventData.currentPoints;\n const aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback);\n\n function touchEndCallback (e, eventData) {\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n runAnimation.value = false;\n\n handle.active = false;\n external.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback);\n external.$(element).off(touchEndEvents, touchEndCallback);\n\n cornerstone.updateImage(element);\n\n if (e.type === 'CornerstoneToolsTouchPress') {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e, eventData);\n }\n }\n\n external.$(element).on(touchEndEvents, touchEndCallback);\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveHandle.js","import external from '../externalModules.js';\n\n// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nconst antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n };\n\nlet lastInteractionType,\n lastInteractionTime;\n\nfunction handleTap (type, e) {\n const now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nconst handleTapMouse = handleTap.bind(null, pointerType.mouse);\nconst handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n external.$(element).on(eventName, tapHandler);\n });\n}\n\nfunction removeEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n external.$(element).off(eventName, tapHandler);\n });\n}\n\nconst mouseEvents = ['mousedown', 'mouseup'];\nconst touchEvents = ['touchstart', 'touchend'];\n\nfunction disable (element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable (element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nconst preventGhostClick = {\n enable,\n disable\n};\n\nexport default preventGhostClick;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/preventGhostClick.js","import external from '../externalModules.js';\n\nexport default function (doubleTapCallback) {\n return {\n activate (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n const eventData = {};\n\n external.$(element).on('CornerstoneToolsDoubleTap', eventData, doubleTapCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapTool.js","import external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nexport default function (mouseToolInterface, preventHandleOutsideImage) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(mouseEventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n moveHandle(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n }\n\n external.$(mouseEventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e, eventData) {\n toolCoordinates.setCoords(eventData);\n // If a mouse button is down, do nothing\n if (eventData.which !== 0) {\n return;\n }\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, mouseToolInterface.toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n const coords = eventData.currentPoints.canvas;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n let data;\n\n function handleDoneMove () {\n data.active = false;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, mouseToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n }\n\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, mouseToolInterface.toolType);\n\n let i;\n\n // Now check to see if there is a handle we can move\n const distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n const options = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n moveAllHandles(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove);\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonRectangleTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered (e) {\n mouseToolInterface.onImageRendered(e, e.detail);\n }\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonRectangleTool.js","import external from '../externalModules.js';\n\nexport default function (touchPinchCallback) {\n const toolInterface = {\n activate (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n const eventData = {\n };\n\n external.$(element).on('CornerstoneToolsTouchPinch', eventData, touchPinchCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchPinchTool.js","import external from '../externalModules.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nlet brushLayerId;\n\nexport default function (brushToolInterface) {\n function mouseMoveCallback (e, eventData) {\n brushToolInterface.onMouseMove(e, eventData);\n }\n\n function mouseUpCallback (e, eventData) {\n brushToolInterface.onMouseUp(e, eventData);\n\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseMoveCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n }\n\n function dragCallback (e, eventData) {\n brushToolInterface.onDrag(e, eventData);\n\n return false;\n }\n\n function mouseDownActivateCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n brushToolInterface.onMouseDown(e, eventData);\n\n return false;\n }\n\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseMoveCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n }\n\n function onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n let pixelData;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n }\n\n const layer = external.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n\n // Note: This is to maintain compatibility with jQuery event handlers.\n // On our next migration this should just be onImageRendered(e)\n brushToolInterface.onImageRendered(e, eventData);\n }\n\n function activate (element, mouseButtonMask) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n const eventData = {\n mouseButtonMask\n };\n\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback);\n\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const { width, height } = enabledElement.image;\n let pixelData = new Uint8ClampedArray(width * height);\n\n const configuration = brushTool.getConfiguration();\n let colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n const colormap = external.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n const labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: () => pixelData,\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height,\n width,\n pixelData,\n setPixelData: (data) => {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n let layer;\n const options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = external.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = external.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n external.cornerstone.updateImage(element);\n }\n\n function deactivate (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n }\n\n const brushTool = mouseButtonTool({\n mouseMoveCallback,\n mouseDownActivateCallback,\n onImageRendered,\n deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brushTool.js","export default function getCircle (radius, rows, columns, xCoord = 0, yCoord = 0) {\n const x0 = Math.round(xCoord);\n const y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n const circleArray = [];\n let index = 0;\n\n for(let y = -radius; y <= radius; y++) {\n const yCoord = y0 + y;\n\n if (yCoord > rows || yCoord < 0) {\n continue;\n }\n\n for(let x = -radius; x <= radius; x++) {\n const xCoord = x0 + x;\n\n if (xCoord > columns || xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/getCircle.js","import external from '../externalModules.js';\n\nfunction drawBrushPixels (pointerArray, storedPixels, brushPixelValue, columns) {\n const getPixelIndex = (x, y) => (y * columns) + x;\n\n pointerArray.forEach((point) => {\n const spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas (pointerArray, canvasContext, color, element) {\n const canvasPtTL = external.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n const canvasPtBR = external.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n const sizeX = canvasPtBR.x - canvasPtTL.x;\n const sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach((point) => {\n const canvasPt = external.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexport { drawBrushPixels, drawBrushOnCanvas };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/drawBrush.js","export { default as external } from './externalModules.js';\n\nexport { default as referenceLines } from './referenceLines/index.js';\nexport { default as orientation } from './orientation/index.js';\n\nexport { default as requestPoolManager } from './requestPool/requestPoolManager.js';\n\nexport { default as setContextToDisplayFontSize } from './util/setContextToDisplayFontSize.js';\nexport { default as scrollToIndex } from './util/scrollToIndex.js';\nexport { default as scroll } from './util/scroll.js';\nexport { default as roundToDecimal } from './util/roundToDecimal.js';\nexport { projectPatientPointToImagePlane,\n imagePointToPatientPoint,\n planePlaneIntersection } from './util/pointProjector.js';\n\nexport { default as pointInsideBoundingBox } from './util/pointInsideBoundingBox.js';\nexport { default as pointInEllipse } from './util/pointInEllipse.js';\nexport { default as pauseEvent } from './util/pauseEvent.js';\nexport { default as isMouseButtonEnabled } from './util/isMouseButtonEnabled.js';\nexport { default as getRGBPixels } from './util/getRGBPixels.js';\nexport { getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice } from './util/getMaxSimultaneousRequests.js';\n\nexport { default as getLuminance } from './util/getLuminance.js';\nexport { default as drawTextBox } from './util/drawTextBox.js';\nexport { default as drawEllipse } from './util/drawEllipse.js';\nexport { default as drawCircle } from './util/drawCircle.js';\nexport { default as drawArrow } from './util/drawArrow.js';\nexport { default as copyPoints } from './util/copyPoints.js';\nexport { default as calculateSUV } from './util/calculateSUV.js';\nexport { default as calculateEllipseStatistics } from './util/calculateEllipseStatistics.js';\n\nexport { default as probeTool4D } from './timeSeriesTools/probeTool4D.js';\nexport { default as incrementTimePoint } from './timeSeriesTools/incrementTimePoint.js';\nexport { default as timeSeriesPlayer } from './timeSeriesTools/timeSeriesPlayer.js';\nexport { timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag } from './timeSeriesTools/timeSeriesScroll.js';\n\nexport { default as wwwcSynchronizer } from './synchronization/wwwcSynchronizer.js';\nexport { default as updateImageSynchronizer } from './synchronization/updateImageSynchronizer.js';\nexport { default as Synchronizer } from './synchronization/Synchronizer.js';\nexport { default as stackScrollSynchronizer } from './synchronization/stackScrollSynchronizer.js';\nexport { default as stackImagePositionSynchronizer } from './synchronization/stackImagePositionSynchronizer.js';\nexport { default as stackImagePositionOffsetSynchronizer } from './synchronization/stackImagePositionOffsetSynchronizer.js';\nexport { default as stackImageIndexSynchronizer } from './synchronization/stackImageIndexSynchronizer.js';\nexport { default as panZoomSynchronizer } from './synchronization/panZoomSynchronizer.js';\n\nexport { default as toolStyle } from './stateManagement/toolStyle.js';\nexport { addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager } from './stateManagement/toolState.js';\nexport { default as toolCoordinates } from './stateManagement/toolCoordinates.js';\nexport { default as toolColors } from './stateManagement/toolColors.js';\nexport { addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager } from './stateManagement/timeSeriesSpecificStateManager.js';\nexport { default as textStyle } from './stateManagement/textStyle.js';\n\nexport { stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager } from './stateManagement/stackSpecificStateManager.js';\n\nexport { default as loadHandlerManager } from './stateManagement/loadHandlerManager.js';\n\nexport { newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager } from './stateManagement/imageIdSpecificStateManager.js';\n\nexport { newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager } from './stateManagement/frameOfReferenceStateManager.js';\n\nexport { default as appState } from './stateManagement/appState.js';\n\nexport { default as stackScrollKeyboard } from './stackTools/stackScrollKeyboard.js';\n\nexport { stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch } from './stackTools/stackScroll.js';\n\nexport { default as stackPrefetch } from './stackTools/stackPrefetch.js';\nexport { default as scrollIndicator } from './stackTools/scrollIndicator.js';\nexport { default as stackRenderers } from './stackTools/stackRenderers.js';\nexport { playClip, stopClip } from './stackTools/playClip.js';\n\nexport { default as anyHandlesOutsideImage } from './manipulators/anyHandlesOutsideImage.js';\nexport { default as drawHandles } from './manipulators/drawHandles.js';\nexport { default as getHandleNearImagePoint } from './manipulators/getHandleNearImagePoint.js';\nexport { default as handleActivator } from './manipulators/handleActivator.js';\nexport { default as moveAllHandles } from './manipulators/moveAllHandles.js';\nexport { default as moveHandle } from './manipulators/moveHandle.js';\nexport { default as moveNewHandle } from './manipulators/moveNewHandle.js';\nexport { default as moveNewHandleTouch } from './manipulators/moveNewHandleTouch.js';\nexport { default as touchMoveAllHandles } from './manipulators/touchMoveAllHandles.js';\nexport { default as touchMoveHandle } from './manipulators/touchMoveHandle.js';\n\nexport { default as keyboardInput } from './inputSources/keyboardInput.js';\nexport { default as mouseInput } from './inputSources/mouseInput.js';\nexport { default as mouseWheelInput } from './inputSources/mouseWheelInput.js';\nexport { default as preventGhostClick } from './inputSources/preventGhostClick.js';\nexport { default as touchInput } from './inputSources/touchInput.js';\n\n\nexport { angle, angleTouch } from './imageTools/angleTool.js';\nexport { arrowAnnotate, arrowAnnotateTouch } from './imageTools/arrowAnnotate.js';\nexport { crosshairs, crosshairsTouch } from './imageTools/crosshairs.js';\nexport { default as displayTool } from './imageTools/displayTool.js';\nexport { default as doubleTapTool } from './imageTools/doubleTapTool.js';\nexport { default as doubleTapZoom } from './imageTools/doubleTapZoom.js';\nexport { dragProbe, dragProbeTouch } from './imageTools/dragProbe.js';\n\nexport { ellipticalRoi, ellipticalRoiTouch } from './imageTools/ellipticalRoi.js';\nexport { freehand } from './imageTools/freehand.js';\n\nexport { highlight, highlightTouch } from './imageTools/highlight.js';\nexport { default as imageStats } from './imageTools/imageStats.js';\nexport { default as keyboardTool } from './imageTools/keyboardTool.js';\nexport { length, lengthTouch } from './imageTools/length.js';\nexport { magnify, magnifyTouchDrag } from './imageTools/magnify.js';\nexport { default as mouseButtonRectangleTool } from './imageTools/mouseButtonRectangleTool.js';\nexport { default as mouseButtonTool } from './imageTools/mouseButtonTool.js';\nexport { default as mouseWheelTool } from './imageTools/mouseWheelTool.js';\nexport { default as multiTouchDragTool } from './imageTools/multiTouchDragTool.js';\nexport { default as orientationMarkers } from './imageTools/orientationMarkers.js';\n\nexport { pan, panTouchDrag } from './imageTools/pan.js';\nexport { default as panMultiTouch } from './imageTools/panMultiTouch.js';\nexport { probe, probeTouch } from './imageTools/probe.js';\nexport { rectangleRoi, rectangleRoiTouch } from './imageTools/rectangleRoi.js';\nexport { rotate, rotateTouchDrag } from './imageTools/rotate.js';\nexport { default as rotateTouch } from './imageTools/rotateTouch.js';\nexport { default as saveAs } from './imageTools/saveAs.js';\nexport { seedAnnotate, seedAnnotateTouch } from './imageTools/seedAnnotate.js';\nexport { simpleAngle, simpleAngleTouch } from './imageTools/simpleAngle.js';\nexport { default as simpleMouseButtonTool } from './imageTools/simpleMouseButtonTool.js';\nexport { textMarker, textMarkerTouch } from './imageTools/textMarker.js';\n\nexport { default as touchDragTool } from './imageTools/touchDragTool.js';\nexport { default as touchPinchTool } from './imageTools/touchPinchTool.js';\nexport { default as touchTool } from './imageTools/touchTool.js';\nexport { wwwc, wwwcTouchDrag } from './imageTools/wwwc.js';\nexport { wwwcRegion, wwwcRegionTouch } from './imageTools/wwwcRegion.js';\nexport { zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag } from './imageTools/zoom.js';\nexport { brush } from './paintingTools/brush.js';\nexport { adaptiveBrush } from './paintingTools/adaptiveBrush.js';\nexport { default as version } from './version.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import calculateReferenceLine from './calculateReferenceLine.js';\nimport tool from './referenceLinesTool.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst referenceLines = {\n calculateReferenceLine,\n tool,\n renderActiveReferenceLine\n};\n\nexport default referenceLines;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/index.js","import external from '../externalModules.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst toolType = 'referenceLines';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n const renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach((referenceEnabledElement) => {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable (element, synchronizationContext, renderer) {\n renderer = renderer || renderActiveReferenceLine;\n\n addToolState(element, toolType, {\n synchronizationContext,\n renderer\n });\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nconst tool = {\n enable,\n disable\n};\n\nexport default tool;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/referenceLinesTool.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nexport default function (vector) {\n const vec3 = convertToVector3(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n let orientation = '';\n const orientationX = vec3.x < 0 ? 'R' : 'L';\n const orientationY = vec3.y < 0 ? 'A' : 'P';\n const orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n const abs = new external.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (let i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/getOrientationString.js","export default function (string) {\n let inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/invertOrientationString.js","import external from '../externalModules.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport setContextToDisplayFontSize from '../util/setContextToDisplayFontSize.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport MeasurementManager from '../measurementManager/measurementManager.js';\nimport LineSampleMeasurement from '../measurementManager/lineSampleMeasurement.js';\n\nconst toolType = 'probe4D';\n\nfunction updateLineSample (measurementData) {\n const cornerstone = external.cornerstone;\n const samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n let loader;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n const offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n const sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const timeSeriestoolData = getToolState(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n const timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n timeSeries,\n lineSample: new LineSampleMeasurement(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n MeasurementManager.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n const color = 'white';\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n const data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n drawHandles(context, eventData, data.handles, color);\n context.stroke();\n\n // Draw text\n const fontParameters = setContextToDisplayFontSize(eventData.enabledElement, eventData.canvasContext, 15);\n\n context.font = `${fontParameters.fontSize}px Arial`;\n\n // Translate the x/y away from the cursor\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n const textX = data.handles.end.x + 3;\n const textY = data.handles.end.y - 3;\n\n context.fillStyle = color;\n\n context.fillText(`${x},${y}`, textX, textY);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probeTool4D = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n toolType\n});\n\nexport default probeTool4D;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/probeTool4D.js","import triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nfunction MeasurementManager () {\n const that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n const index = that.measurements.push(measurement);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(that, 'CornerstoneMeasurementAdded', eventDetail);\n };\n\n this.remove = function (index) {\n const measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(that, 'CornerstoneMeasurementRemoved', eventDetail);\n };\n\n}\n\n// Module/private exports\nconst manager = new MeasurementManager();\n\nexport default manager;\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/measurementManager.js","import triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nexport default function () {\n\n const that = this;\n\n that.samples = [];\n\n // Adds an element as both a source and a target\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n triggerEvent(that, 'CornerstoneLineSampleUpdated');\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/lineSampleMeasurement.js","import { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport incrementTimePoint from './incrementTimePoint.js';\n\nconst toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n const timeSeriesToolData = getToolState(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n const playClipToolData = getToolState(element, toolType);\n let playClipData;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n incrementTimePoint(element, 1, true);\n } else {\n incrementTimePoint(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n const playClipData = playClipToolData.data[0];\n\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nconst timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexport default timeSeriesPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesPlayer.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport incrementTimePoint from './incrementTimePoint.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n\n const mouseDragEventData = {\n deltaY: 0,\n options: e.data.options\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, mouseDragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback (e, eventData) {\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n const toolData = getToolState(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n const timeSeriesData = toolData.data[0];\n\n let pixelsPerTimeSeries = external.$(eventData.element).height() / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n const timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n const timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback (e, eventData) {\n const images = -eventData.direction;\n\n incrementTimePoint(eventData.element, images);\n}\n\nfunction onDrag (e) {\n const mouseMoveData = e.originalEvent.detail;\n const eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n const toolData = getToolState(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n const timeSeriesDelta = eventData.deltaY / 3;\n const timeSeriesDeltaMod = eventData.deltaY % 3;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nconst timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback);\nconst timeSeriesScrollWheel = mouseWheelTool(mouseWheelCallback);\nconst timeSeriesScrollTouchDrag = touchDragTool(onDrag);\n\nexport {\n timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesScroll.js","import external from '../externalModules.js';\n\n// This function synchronizes the target element ww/wc to match the source element\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/wwwcSynchronizer.js","import external from '../externalModules.js';\n\n// This function causes the target image to be drawn immediately\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n external.cornerstone.updateImage(targetElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/updateImageSynchronizer.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer (event, handler) {\n const cornerstone = external.cornerstone;\n const that = this;\n const sourceElements = []; // Source elements fire the events we want to synchronize to\n const targetElements = []; // Target elements we want to synchronize to source elements\n\n let ignoreFiredEvents = false;\n const initialData = {};\n let eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n const targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n const targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n const targetImagePosition = convertToVector3(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent (sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n const targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n const targetImageId = initialData.imageIds.targetElements[targetIndex];\n const sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n const sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n let positionDifference;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent (e, eventData) {\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n const index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n external.$(element).on(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n const index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n const index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n external.$(element).off(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n const index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler (e) {\n const element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n const elements = external.$.unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener('cornerstoneelementdisabled', disableHandler);\n element.addEventListener('cornerstoneelementdisabled', disableHandler);\n });\n };\n\n this.destroy = function () {\n const elements = external.$.unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexport default Synchronizer;\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/Synchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes any scrolling actions within the stack to propagate to\n// All of the other viewports that are synced\nexport default function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the stack of the target viewport\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n let newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackScrollSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n stackData.imageIds.forEach((imageId, index) => {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\n\n// In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable.\n\nexport default function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n const finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionOffsetSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceStackToolDataSource = getToolState(sourceElement, 'stack');\n const sourceStackData = sourceStackToolDataSource.data[0];\n const targetStackToolDataSource = getToolState(targetElement, 'stack');\n const targetStackData = targetStackToolDataSource.data[0];\n\n let newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImageIndexSynchronizer.js","import external from '../externalModules.js';\n\n// This function synchronizes the target zoom and pan to match the source\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/panZoomSynchronizer.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager (toolTypes, oldStateManager) {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n const imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n\n return imageIdToolStateManager;\n}\n\nconst timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager (element, tools) {\n tools = tools || ['timeSeries'];\n let oldStateManager = getElementToolStateManager(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n const timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n setElementToolStateManager(element, timeSeriesSpecificStateManager);\n}\n\nexport {\n addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/timeSeriesSpecificStateManager.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager (toolTypes, oldStateManager) {\n let toolState = {};\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n\n }\n\n const stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n\n\n return stackSpecificToolStateManager;\n}\n\nconst stackStateManagers = [];\n\nfunction addStackStateManager (element, otherTools) {\n let oldStateManager = getElementToolStateManager(element);\n\n if (!oldStateManager) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n let stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n const stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n setElementToolStateManager(element, stackSpecificStateManager);\n}\n\nconst stackSpecificStateManager = {\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\nexport {\n stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/stackSpecificStateManager.js","// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager () {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState (frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nconst globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexport {\n newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/frameOfReferenceStateManager.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager } from './toolState.js';\n\nfunction saveApplicationState (elements) {\n // Save imageId-specific tool state data\n const appState = {\n imageIdToolState: globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = external.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState (appState) {\n if (!appState.hasOwnProperty('imageIdToolState') ||\n !appState.hasOwnProperty('elementToolState') ||\n !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n\n // Restore all the imageId specific tool data\n globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n const element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n const savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nconst appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexport default appState;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/appState.js","import scroll from '../util/scroll.js';\nimport keyboardTool from '../imageTools/keyboardTool.js';\n\nconst keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback (e, eventData) {\n const keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n let images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n scroll(eventData.element, images);\n}\n\n// Module/private exports\nconst stackScrollKeyboard = keyboardTool(keyDownCallback);\n\nexport default stackScrollKeyboard;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScrollKeyboard.js","import external from '../externalModules.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst toolType = 'stackPrefetch';\nconst requestType = 'prefetch';\n\nlet configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nlet resetPrefetchTimeout;\nconst resetPrefetchDelay = 10;\n\nfunction range (lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n const arr = [];\n let c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nconst max = function (arr) {\n return Math.max.apply(null, arr);\n};\n\nconst min = function (arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex (arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n const l = [];\n const h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch (element) {\n // Check to make sure stack data exists\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n const stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList (imageIdIndex) {\n const index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) { // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort((a, b) => (a - b));\n const indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n const imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n const imagePromise = external.cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise && imagePromise.state() === 'resolved') {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n requestPoolManager.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n const nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n let imageId;\n let nextImageIdIndex;\n const preventCache = false;\n\n function doneCallback (image) {\n // Console.log('prefetch done: ' + image.imageId);\n const imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function failCallback (error) {\n console.log(`prefetch errored: ${error}`);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n let lowerIndex = nearest.low;\n let higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n const currentIndex = stack.currentImageIdIndex;\n const shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n const shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n const shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n const shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n requestPoolManager.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler (element) {\n return function (e) {\n const eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n let stackData;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = getToolState(element, 'stack');\n } catch(error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated (e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n const element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch(error) {\n return;\n }\n\n }, resetPrefetchDelay);\n}\n\nfunction enable (element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n const stackPrefetchDataArray = getToolState(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n const stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n const indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n addToolState(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener('cornerstonenewimage', onImageUpdated);\n element.addEventListener('cornerstonenewimage', onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n external.cornerstone.events.addEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n}\n\nfunction disable (element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener('cornerstonenewimage', onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n\n const stackPrefetchData = getToolState(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n requestPoolManager.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n setMaxSimultaneousRequests(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nconst stackPrefetch = {\n enable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nexport default stackPrefetch;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackPrefetch.js","import displayTool from '../imageTools/displayTool.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nconst scrollBarHeight = 6;\n\nconst configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered (e, eventData) {\n const element = eventData.element;\n const width = eventData.enabledElement.canvas.width;\n const height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n const context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n const config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const imageIds = stackData.data[0].imageIds;\n const currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n const cursorWidth = width / imageIds.length;\n const cursorHeight = height / imageIds.length;\n const xPosition = cursorWidth * currentImageIdIndex;\n const yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nconst scrollIndicator = displayTool(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexport default scrollIndicator;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/scrollIndicator.js","import FusionRenderer from './fusionRenderer.js';\n\nconst stackRenderers = {};\n\nstackRenderers.FusionRenderer = FusionRenderer;\n\nexport default stackRenderers;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackRenderers.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default class FusionRenderer {\n constructor () {\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n render (element, imageStacks) {\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n const toolData = getToolState(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n const cornerstone = external.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n const baseImageObject = imageStacks[0];\n const currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n const overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then((baseImage) => {\n let baseLayerId = this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach((imgObj, overlayLayerIndex) => {\n const imageId = this.findImageFn(imgObj.imageIds, currentImageId);\n const layerIndex = overlayLayerIndex + 1;\n let currentLayerId = this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then((image) => {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/fusionRenderer.js","/* eslint no-bitwise:0 */\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nconst toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\nfunction getPlayClipTimeouts (vector, speed) {\n\n let i;\n let sample;\n let delay;\n let sum = 0;\n const limit = vector.length;\n const timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = (Number(vector[i]) / speed) | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) { // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = (sum / timeouts.length) | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData (playClipData) {\n const id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent (element) {\n const eventDetail = {\n element\n };\n\n triggerEvent(element, 'CornerstoneToolsClipStopped', eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n let playClipData;\n let playClipTimeouts;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n const stackToolData = getToolState(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (stackToolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = stackToolData.data[0];\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (\n playClipData.ignoreFrameTimeVector !== true &&\n playClipData.frameTimeVector &&\n playClipData.frameTimeVector.length === stackData.imageIds.length\n ) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n const playClipAction = () => {\n\n // Hoisting of context variables\n let loader,\n startLoadingHandler,\n endLoadingHandler,\n errorLoadingHandler,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n const imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n\n }\n\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler () {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n\n}\n\nexport {\n playClip,\n stopClip\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/playClip.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet mouseX;\nlet mouseY;\n\nfunction keyPress (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n const keyPressData = {\n event: window.event || e, // Old IE support\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n const keyPressEvents = {\n keydown: 'CornerstoneToolsKeyDown',\n keypress: 'CornerstoneToolsKeyPress',\n keyup: 'CornerstoneToolsKeyUp'\n\n };\n\n triggerEvent(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove (e) {\n mouseX = e.pageX || e.originalEvent.pageX;\n mouseY = e.pageY || e.originalEvent.pageY;\n}\n\nconst keyboardEvent = 'keydown keypress keyup';\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n external.$(element).on(keyboardEvent, keyPress);\n external.$(element).on('mousemove', mouseMove);\n}\n\nfunction disable (element) {\n external.$(element).off(keyboardEvent, keyPress);\n external.$(element).off('mousemove', mouseMove);\n}\n\n// Module exports\nconst keyboardInput = {\n enable,\n disable\n};\n\nexport default keyboardInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/keyboardInput.js","import external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet isClickEvent = true;\nlet preventClickTimeout;\nconst clickDelay = 200;\n\nfunction getEventWhich (event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler () {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = 'CornerstoneToolsMouseDoubleClick';\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n const lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n}\n\nfunction mouseDown (e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = 'CornerstoneToolsMouseDown';\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n external.$(element).off('mousemove', mouseMove);\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n const eventPropagated = triggerEvent(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = 'CornerstoneToolsMouseDownActivate';\n triggerEvent(eventData.element, 'CornerstoneToolsMouseDownActivate', eventData);\n }\n\n const whichMouseButton = getEventWhich(e);\n\n function onMouseMove (e) {\n // Calculate our current points in page and image coordinates\n const eventType = 'CornerstoneToolsMouseDrag';\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n\n // Prevent left click selection of DOM elements\n return pauseEvent(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp (e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n let eventType = 'CornerstoneToolsMouseUp';\n\n if (isClickEvent) {\n eventType = 'CornerstoneToolsMouseClick';\n }\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n external.$(document).off('mousemove', onMouseMove);\n external.$(document).off('mouseup', onMouseUp);\n\n external.$(eventData.element).on('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n external.$(document).on('mousemove', onMouseMove);\n external.$(document).on('mouseup', onMouseUp);\n\n return pauseEvent(e);\n}\n\nfunction mouseMove (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = 'CornerstoneToolsMouseMove';\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n\n const whichMouseButton = getEventWhich(e);\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n}\n\nfunction disable (element) {\n external.$(element).off('mousedown', mouseDown);\n external.$(element).off('mousemove', mouseMove);\n external.$(element).off('dblclick', mouseDoubleClick);\n}\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n external.$(element).on('mousedown', mouseDown);\n external.$(element).on('mousemove', mouseMove);\n external.$(element).on('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nconst mouseInput = {\n enable,\n disable\n};\n\nexport default mouseInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseInput.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction mouseWheel (e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n let x;\n let y;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else if (e.originalEvent &&\n e.originalEvent.pageX !== undefined &&\n e.originalEvent.pageY !== undefined) {\n x = e.originalEvent.pageX;\n y = e.originalEvent.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n const startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = (window.event && window.event.wheelDelta) ? window.event : e; // Old IE support\n\n let wheelDelta;\n\n if (e.originalEvent && e.originalEvent.wheelDelta) {\n wheelDelta = -e.originalEvent.wheelDelta;\n } else if (e.originalEvent && e.originalEvent.deltaY) {\n wheelDelta = -e.originalEvent.deltaY;\n } else if (e.originalEvent && e.originalEvent.detail) {\n wheelDelta = -e.originalEvent.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n const direction = wheelDelta < 0 ? -1 : 1;\n\n const mouseWheelData = {\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n triggerEvent(element, 'CornerstoneToolsMouseWheel', mouseWheelData);\n}\n\nconst mouseWheelEvents = 'mousewheel DOMMouseScroll';\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n external.$(element).on(mouseWheelEvents, mouseWheel);\n}\n\nfunction disable (element) {\n external.$(element).unbind(mouseWheelEvents, mouseWheel);\n}\n\n// Module exports\nconst mouseWheelInput = {\n enable,\n disable\n};\n\nexport default mouseWheelInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseWheelInput.js","import external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport preventGhostClick from '../inputSources/preventGhostClick.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet startPoints,\n currentPoints,\n lastPoints,\n deltaPoints,\n eventData,\n touchStartDelay,\n pressTimeout,\n pageDistanceMoved;\n\nlet lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta;\n\nconst pressDelay = 700,\n pressMaxDistance = 5;\n\nfunction onTouch (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget || e.srcEvent.currentTarget;\n let eventType,\n scaleChange,\n delta,\n remainingPointers,\n rotation;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if ((e.pointers && e.pointers.length > 1) ||\n (e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 1)) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = 'CornerstoneToolsTap';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = 'CornerstoneToolsDoubleTap';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchPinch';\n eventData = {\n event: e,\n startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY),\n client: {\n x: e.originalEvent.touches[0].clientX,\n y: e.originalEvent.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchStart';\n if (e.originalEvent.touches.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchStart';\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n const eventPropagated = triggerEvent(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = 'CornerstoneToolsTouchStartActive';\n if (e.originalEvent.touches.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchStartActive';\n }\n\n eventData.type = eventType;\n triggerEvent(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = copyPoints(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY),\n client: {\n x: e.originalEvent.touches[0].clientX,\n y: e.originalEvent.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchPress';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.changedTouches[0].pageX, e.originalEvent.changedTouches[0].pageY),\n client: {\n x: e.originalEvent.changedTouches[0].clientX,\n y: e.originalEvent.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchEnd';\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = 'CornerstoneToolsTouchDrag';\n if (e.pointers.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchDrag';\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = 'CornerstoneToolsDragEnd';\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return pauseEvent(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = 'CornerstoneToolsTouchRotate';\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n rotation,\n type: eventType\n };\n triggerEvent(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable (element) {\n disable(element);\n const Hammer = external.Hammer;\n\n const hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n const mc = new Hammer.Manager(element, hammerOptions);\n\n const panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n const pan = new Hammer.Pan(panOptions);\n const pinch = new Hammer.Pinch({\n threshold: 0\n });\n const rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n // We want to detect both the same time\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n const doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n preventGhostClick.enable(element);\n external.$(element).on('touchstart touchend', onTouch);\n external.$(element).data('hammer', mc);\n}\n\nfunction disable (element) {\n preventGhostClick.disable(element);\n external.$(element).off('touchstart touchend', onTouch);\n const mc = external.$(element).data('hammer');\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nconst touchInput = {\n enable,\n disable\n};\n\nexport default touchInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/touchInput.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = angle.getConfiguration();\n const cornerstone = external.cornerstone;\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n let handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n let handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n drawHandles(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n const dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n const dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n const dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n const dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n let angle = Math.acos(Math.abs(((dx1 * dx2) + (dy1 * dy2)) / (Math.sqrt((dx1 * dx1) + (dy1 * dy1)) * Math.sqrt((dx2 * dx2) + (dy2 * dy2)))));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n const textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n const textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n drawTextBox(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst angle = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst angleTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n angle,\n angleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/angleTool.js","/* eslint no-alert:0 */\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawArrow from '../util/drawArrow.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const measurementData = createNewMeasurement(mouseEventData);\n const cornerstone = external.cornerstone;\n\n const eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(mouseEventData.element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(mouseEventData.element);\n\n external.$(mouseEventData.element).on('CornerstoneToolsMouseMove', eventData, arrowAnnotate.mouseMoveCallback);\n external.$(mouseEventData.element).on('CornerstoneToolsMouseDown', eventData, arrowAnnotate.mouseDownCallback);\n external.$(mouseEventData.element).on('CornerstoneToolsMouseDownActivate', eventData, arrowAnnotate.mouseDownActivateCallback);\n external.$(mouseEventData.element).on('CornerstoneToolsMouseDoubleClick', eventData, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(mouseEventData.element).off('CornerstoneToolsMouseMove', arrowAnnotate.mouseMoveCallback);\n external.$(mouseEventData.element).off('CornerstoneToolsMouseDown', arrowAnnotate.mouseDownCallback);\n external.$(mouseEventData.element).off('CornerstoneToolsMouseDownActivate', arrowAnnotate.mouseDownActivateCallback);\n external.$(mouseEventData.element).off('CornerstoneToolsMouseDoubleClick', arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(mouseEventData.element);\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(mouseEventData.element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const enabledElement = eventData.enabledElement;\n const cornerstone = external.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = arrowAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the arrow\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n drawArrow(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n drawArrow(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(data.text).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const element = touchEventData.element;\n const measurementData = createNewMeasurement(touchEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n }\n\n addToolState(element, toolType, measurementData);\n external.$(element).off('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback (e, eventData) {\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback (e, eventData) {\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n external.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst arrowAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nconst arrowAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport { arrowAnnotate, arrowAnnotateTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/arrowAnnotate.js","import external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState, clearToolState } from '../stateManagement/toolState.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { imagePointToPatientPoint } from '../util/pointProjector.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nconst toolType = 'crosshairs';\n\nfunction chooseLocation (e, eventData) {\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n const cornerstone = external.cornerstone;\n const sourceElement = e.currentTarget;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n const sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n const patientPoint = imagePointToPatientPoint(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n const stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const row = convertToVector3(imagePlane.rowCosines);\n const column = convertToVector3(imagePlane.columnCosines);\n const normal = column.clone().cross(row.clone());\n const distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n chooseLocation(e, eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction mouseDragCallback (e, eventData) {\n chooseLocation(e, eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction enable (element, mouseButtonMask, synchronizationContext) {\n const eventData = {\n mouseButtonMask\n };\n\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n}\n\n// Module/private exports\nconst crosshairs = {\n activate: enable,\n deactivate: disable,\n enable,\n disable\n};\n\nfunction dragEndCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsTouchDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback);\n}\n\nfunction dragStartCallback (e, eventData) {\n external.$(eventData.element).on('CornerstoneToolsTouchDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback);\n chooseLocation(e, eventData);\n\n return false;\n}\n\nfunction dragCallback (e, eventData) {\n chooseLocation(e, eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction enableTouch (element, synchronizationContext) {\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n external.$(element).off('CornerstoneToolsTouchStart', dragStartCallback);\n\n external.$(element).on('CornerstoneToolsTouchStart', dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch (element) {\n external.$(element).off('CornerstoneToolsTouchStart', dragStartCallback);\n}\n\nconst crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexport {\n crosshairs,\n crosshairsTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/crosshairs.js","import external from '../externalModules.js';\nimport doubleTapTool from './doubleTapTool.js';\n\nfunction fitToWindowStrategy (eventData) {\n external.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback (e, eventData) {\n doubleTapZoom.strategy(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst doubleTapZoom = doubleTapTool(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexport default doubleTapZoom;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapZoom.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nlet dragEventData;\n\nfunction defaultStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const x = Math.round(eventData.currentPoints.image.x);\n const y = Math.round(eventData.currentPoints.image.y);\n\n let storedPixels;\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n text = `${x}, ${y}`;\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]} A: ${storedPixels[3]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n // Draw text\n const coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n let toolCoords;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() / 2);\n }\n\n let storedPixels;\n let text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 ||\n toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = getRGBPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n text = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n\n const modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += `HU: ${modalityPixelValueText}`;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n const suv = calculateSUV(eventData.image, sp);\n\n if (suv) {\n text += ` SUV: ${parseFloat(suv.toFixed(2))}`;\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n const textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n let translation;\n const handleRadius = 6;\n const width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -textStyle.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(textStyle.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n drawTextBox(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback (e, eventData) {\n const element = eventData.element;\n\n element.removeEventListener('cornerstoneimagerendered', imageRenderedCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e, eventData) {\n const element = eventData.element;\n\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n element.addEventListener('cornerstoneimagerendered', imageRenderedCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n dragProbe.strategy(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction imageRenderedCallback () {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback (e, eventData) {\n const element = eventData.element;\n\n dragEventData = eventData;\n external.cornerstone.updateImage(element);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst dragProbe = simpleMouseButtonTool(mouseDownCallback);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nconst options = {\n fireOnTouchStart: true\n};\n\nconst dragProbeTouch = touchDragTool(dragCallback, options);\n\nexport {\n dragProbe,\n dragProbeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/dragProbe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport drawEllipse from '../util/drawEllipse.js';\nimport pointInEllipse from '../util/pointInEllipse.js';\nimport calculateEllipseStatistics from '../util/calculateEllipseStatistics.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse (element, data, coords, distance) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n const majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n const pointInMinorEllipse = pointInEllipse(minorEllipse, coords);\n const pointInMajorEllipse = pointInEllipse(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool (element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch (element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = ellipticalRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n drawEllipse(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateEllipseStatistics(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst ellipticalRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst ellipticalRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType\n});\n\nexport { ellipticalRoi, ellipticalRoiTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/ellipticalRoi.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'freehand';\nlet configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n const data = toolData.data[config.currentTool];\n\n const handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle (eventData, toolIndex) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n const mousePoint = eventData.currentPoints.canvas;\n\n for (let i = 0; i < data.handles.length; i++) {\n const handleCanvas = external.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (external.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n let handleNearby;\n\n for (let toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby,\n toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n\n // Check if drawing is finished\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback (e, eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n let x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n let y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n const currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n const lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n const lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n const handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < (data.handles.length - 1)) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing (eventData) {\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n\n const measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n const config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n addToolState(eventData.element, toolType, measurementData);\n\n const toolData = getToolState(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing (eventData, handleNearby) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n const toolData = getToolState(eventData.element, toolType);\n\n let handleNearby, toolIndex;\n\n const config = freehand.getConfiguration();\n const currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n const nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n let fillColor = toolColors.getFillColor();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n fillColor = toolColors.getFillColor();\n } else {\n color = toolColors.getToolColor();\n fillColor = toolColors.getToolColor();\n }\n\n let handleStart;\n\n if (data.handles.length) {\n for (let j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (let k = 0; k < data.handles[j].lines.length; k++) {\n const lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n const mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === (data.handles.length - 1)) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n const options = {\n fill: fillColor\n };\n\n if (data.active) {\n drawHandles(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n drawHandles(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\nfunction enable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n external.$(element).off('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module/private exports\nconst freehand = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration\n};\n\nexport { freehand };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/freehand.js","import external from '../externalModules.js';\nimport mouseButtonRectangleTool from './mouseButtonRectangleTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n const existingToolData = getToolState(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n let insideBox = false;\n\n if ((coords.x >= rect.left && coords.x <= (rect.left + rect.width)) && coords.y >= rect.top && coords.y <= (rect.top + rect.height)) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this elemen\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n\n context.save();\n\n const data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n drawHandles(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst preventHandleOutsideImage = true;\n\nconst highlight = mouseButtonRectangleTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nconst highlightTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nexport {\n highlight,\n highlightTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/highlight.js","import displayTool from './displayTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction onImageRendered (e, eventData) {\n const image = eventData.image;\n const stats = image.stats;\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n const text = `${key} : ${stats[key]}`;\n\n textLines.push(text);\n });\n\n drawTextBox(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nconst imageStats = displayTool(onImageRendered);\n\nexport default imageStats;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/imageStats.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n const { image, element } = eventData;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = length.getConfiguration();\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n let rowPixelSpacing;\n let colPixelSpacing;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n const color = toolColors.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n const dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n const dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n const length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n let suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n const text = `${length.toFixed(2)}${suffix}`;\n\n if (!data.handles.textBox.hasMoved) {\n const coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst length = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst lengthTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n length,\n lengthTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/length.js","import external from '../externalModules.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getBrowserInfo } from '../util/getMaxSimultaneousRequests.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nlet configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nlet browserName;\n\nlet currentPoints;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback (e, eventData) {\n const element = eventData.element;\n\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool (eventData) {\n external.$(eventData.element).find('.magnifyTool').hide();\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback (e, eventData) {\n const element = eventData.element;\n\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(element).on('CornerstoneToolsMouseDrag', eventData, dragCallback);\n external.$(element).on('CornerstoneToolsMouseUp', eventData, mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', eventData, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener('cornerstonenewimage', newImageCallback);\n drawMagnificationTool(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction newImageCallback (e) {\n const eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback (e, eventData) {\n const element = eventData.element;\n\n external.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback);\n external.$(eventData.element).off('CornerstoneToolsTouchEnd', dragEndCallback);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback (e, eventData) {\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n external.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback);\n external.$(eventData.element).on('CornerstoneToolsTouchEnd', dragEndCallback);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool (eventData) {\n const magnifyCanvas = external.$(eventData.element).find('.magnifyTool').get(0);\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n const config = magnify.getConfiguration();\n\n const magnifySize = config.magnifySize;\n const magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n const canvas = external.$(eventData.element).find('canvas').not('.magnifyTool').get(0);\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n const getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n const canvasLocation = external.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n const copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n const scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = `${canvasLocation.y - 0.5 * magnifySize}px`;\n magnifyCanvas.style.left = `${canvasLocation.x - 0.5 * magnifySize}px`;\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas (element) {\n // If the magnifying glass canvas doesn't already exist\n if (external.$(element).find('.magnifyTool').length === 0) {\n // Create a canvas and append it as a child to the element\n const magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n const config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas (element) {\n external.$(element).find('.magnifyTool').remove();\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable (element) {\n if (!browserName) {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst magnify = {\n enable,\n activate,\n deactivate: disable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nconst options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nconst magnifyTouchDrag = touchDragTool(dragCallback, options);\n\nexport {\n magnify,\n magnifyTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/magnify.js","import external from '../externalModules.js';\nimport orientation from '../orientation/index.js';\nimport displayTool from './displayTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction getOrientationMarkers (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n const imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n const rowString = orientation.getOrientationString(imagePlaneMetaData.rowCosines);\n const columnString = orientation.getOrientationString(imagePlaneMetaData.columnCosines);\n\n const oppositeRowString = orientation.invertOrientationString(rowString);\n const oppositeColumnString = orientation.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n let coords;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n const top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n const bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n const left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n const right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top,\n bottom,\n left,\n right\n };\n}\n\nfunction onImageRendered (e, eventData) {\n const element = eventData.element;\n\n const markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n const coords = getOrientationMarkerPositions(element, markers);\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getToolColor();\n\n const textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n drawTextBox(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n drawTextBox(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n const config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n drawTextBox(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n drawTextBox(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst orientationMarkers = displayTool(onImageRendered);\n\nexport default orientationMarkers;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/orientationMarkers.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback (e, eventData) {\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n let widthScale = eventData.viewport.scale;\n let heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= (eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing);\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= (eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing);\n }\n\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / widthScale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / heightScale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst pan = simpleMouseButtonTool(mouseDownCallback);\nconst panTouchDrag = touchDragTool(dragCallback);\n\nexport {\n pan,\n panTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/pan.js","import external from '../externalModules.js';\nimport multiTouchDragTool from './multiTouchDragTool.js';\n\nfunction touchPanCallback (e, eventData) {\n const config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 2);\n }\n};\n\nconst panMultiTouch = multiTouchDragTool(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexport default panMultiTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/panMultiTouch.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n const endCanvas = external.cornerstone.pixelToCanvas(element, data.handles.end);\n\n\n return external.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n\n for (let i = 0; i < toolData.data.length; i++) {\n\n context.save();\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the handles\n drawHandles(context, eventData, data.handles, color);\n\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n let storedPixels;\n\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = `${x}, ${y}`;\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probe = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst probeTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n probe,\n probeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/probe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = rectangleRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = (ellipse.width * columnPixelSpacing) * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst rectangleRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst rectangleRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n rectangleRoi,\n rectangleRoiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rectangleRoi.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\n// --- Strategies --- //\nfunction defaultStrategy (eventData) {\n // Calculate distance from the center of the image\n const rect = eventData.element.getBoundingClientRect(eventData.element);\n\n const points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n const width = eventData.element.clientWidth;\n const height = eventData.element.clientHeight;\n\n const pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n const rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n const rotationDegrees = rotationRadians * (180 / Math.PI);\n const rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback (e, eventData) {\n rotate.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst rotate = simpleMouseButtonTool(mouseDownCallback);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nconst rotateTouchDrag = touchDragTool(dragCallback);\n\nexport {\n rotate,\n rotateTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotate.js","import external from '../externalModules.js';\n\nfunction touchRotateCallback (e, eventData) {\n eventData.viewport.rotation += eventData.rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback);\n}\n\nfunction activate (element) {\n external.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback);\n external.$(element).on('CornerstoneToolsTouchRotate', touchRotateCallback);\n}\n\nconst rotateTouch = {\n activate,\n disable\n};\n\nexport default rotateTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotateTouch.js","import external from '../externalModules.js';\n\nexport default function (element, filename, mimetype) {\n // Setting the default value for mimetype to image/png\n mimetype = mimetype || 'image/png';\n const canvas = external.$(element).find('canvas').get(0);\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n const lnk = document.createElement('a');\n\n // / the key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // / convert canvas content to data-uri for link. When download\n // / attribute is set the content pointed to by link will be\n // / pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n\n const e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n\n } else if (lnk.fireEvent) {\n\n lnk.fireEvent('onclick');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/saveAs.js","/* eslint no-alert:0 */\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawCircle from '../util/drawCircle.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n const realCoords = external.cornerstone.pixelToCanvas(element, data.handles.end);\n const distanceToPoint = external.cornerstoneMath.point.distance(realCoords, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n const canvasWidth = eventData.canvasContext.canvas.width;\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = seedAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw\n const handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n drawCircle(context, handleCanvas, color, lineWidth);\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n let textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = `${data.text} x: ${Math.round(data.handles.end.x)\n } y: ${Math.round(data.handles.end.y)}`;\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(textPlusCoords).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > (canvasWidth / 2)) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n const boundingBoxPoints = [\n {\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction pressCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return false;\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n external.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst seedAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nconst seedAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport {\n seedAnnotate,\n seedAnnotateTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/seedAnnotate.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport touchTool from './touchTool.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\n\nconst toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 25);\n}\n\nfunction length (vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = simpleAngle.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n const columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n const rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n let suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n const sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n const sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideALength = length(sideA);\n const sideBLength = length(sideB);\n const sideCLength = length(sideC);\n\n // Cosine law\n let angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n\n if (rAngle) {\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n const distance = 15;\n\n let textCoords;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n const textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(mouseEventData);\n const element = mouseEventData.element;\n\n const eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(element).off('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', simpleAngle.mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n\n external.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n external.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(touchEventData);\n const element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(element).off('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n external.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n external.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n external.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n });\n });\n}\n\nconst simpleAngle = mouseButtonTool({\n createNewMeasurement,\n addNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst simpleAngleTouch = touchTool({\n createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n simpleAngle,\n simpleAngleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleAngle.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport { removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n const imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!external.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n let currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n const insideBoundingBox = pointInsideBoundingBox(data.handles.end, coords);\n\n\n return (distanceToPoint < 10) || insideBoundingBox;\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const config = textMarker.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n let color = toolColors.getToolColor();\n\n if (data.active) {\n color = toolColors.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n const measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n const textCoords = external.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n data.handles.end.boundingBox = boundingBox;\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n const mouseButtonData = {\n mouseButtonMask: e.data.mouseButtonMask\n };\n\n external.$(element).on('CornerstoneToolsMouseMove', mouseButtonData, textMarker.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', mouseButtonData, textMarker.mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', mouseButtonData, textMarker.mouseDownActivateCallback);\n external.$(element).on('CornerstoneToolsMouseDoubleClick', mouseButtonData, textMarker.mouseDoubleClickCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsMouseMove', textMarker.mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', textMarker.mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', textMarker.mouseDownActivateCallback);\n external.$(element).off('CornerstoneToolsMouseDoubleClick', textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchPressCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n external.$(element).on('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n external.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n external.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst textMarker = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nconst textMarkerTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback: touchPressCallback\n});\n\nexport {\n textMarker,\n textMarkerTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/textMarker.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction defaultStrategy (eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n const maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n const minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n\n const deltaX = eventData.deltaPoints.page.x * multiplier;\n const deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += (deltaX);\n eventData.viewport.voi.windowCenter += (deltaY);\n}\n\nfunction mouseDragCallback (e, eventData) {\n wwwc.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchDragCallback (e, eventData) {\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n const dragData = eventData;\n\n const maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n const minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n const deltaX = dragData.deltaPoints.page.x * multiplier;\n const deltaY = dragData.deltaPoints.page.y * multiplier;\n\n const config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n } else {\n dragData.viewport.voi.windowWidth += (deltaY);\n dragData.viewport.voi.windowCenter += (deltaX);\n }\n } else {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n }\n\n external.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nconst wwwc = simpleMouseButtonTool(mouseDownCallback);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nconst wwwcTouchDrag = touchDragTool(touchDragCallback);\n\nexport {\n wwwc,\n wwwcTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwc.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport getLuminance from '../util/getLuminance.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nconst toolType = 'wwwcRegion';\n\nlet configuration = {\n minWindowWidth: 10\n};\n\nlet currentMouseButtonMask;\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) {\n const numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n let min = globalMax;\n let max = globalMin;\n let sum = 0;\n\n for (let index = 0; index < numPixels; index++) {\n const spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min,\n max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback (e) {\n const eventData = e.detail;\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n external.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n\n external.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n const mouseData = {\n mouseButtonMask: currentMouseButtonMask\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n\n external.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n const mouseData = {\n mouseButtonMask: currentMouseButtonMask\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback);\n\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion (eventData) {\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n let width = Math.abs(startPoint.x - endPoint.x);\n let height = Math.abs(startPoint.y - endPoint.y);\n\n let left = Math.min(startPoint.x, endPoint.x);\n let top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n const pixelLuminanceData = getLuminance(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n const minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n const config = wwwcRegion.getConfiguration();\n const viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement (e, eventData) {\n const element = eventData.element;\n\n external.$(element).off('CornerstoneToolsMouseMove');\n external.$(element).off('CornerstoneToolsMouseDrag');\n\n external.$(element).on('CornerstoneToolsMouseMove', dragCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', dragCallback);\n\n external.$(element).on('CornerstoneToolsMouseClick', dragEndCallback);\n if (e.type === 'CornerstoneToolsMouseDrag') {\n external.$(element).on('CornerstoneToolsMouseUp', dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', eventData, whichMovement);\n external.$(eventData.element).on('CornerstoneToolsMouseMove', eventData, whichMovement);\n\n external.$(eventData.element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n const measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n addToolState(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n const endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n toolData.data[0].endPoint = endPoint;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n // Get the current element's canvas\n const canvas = external.$(eventData.element).find('canvas').get(0);\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n const color = toolColors.getActiveColor();\n\n // Calculate the rectangle parameters\n const startPointCanvas = cornerstone.pixelToCanvas(eventData.element, startPoint);\n const endPointCanvas = cornerstone.pixelToCanvas(eventData.element, endPoint);\n\n const left = Math.min(startPointCanvas.x, endPointCanvas.x);\n const top = Math.min(startPointCanvas.y, endPointCanvas.y);\n const width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n const height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseMove', dragCallback);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n currentMouseButtonMask = mouseButtonMask;\n\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseMove', dragCallback);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener('cornerstonenewimage', newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag (element) {\n external.$(element).off('CornerstoneToolsTouchDrag', dragCallback);\n external.$(element).off('CornerstoneToolsTouchStart', recordStartPoint);\n external.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n}\n\nfunction activateTouchDrag (element) {\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n external.$(element).off('CornerstoneToolsTouchDrag', dragCallback);\n external.$(element).off('CornerstoneToolsTouchStart', recordStartPoint);\n external.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.$(element).on('CornerstoneToolsTouchDrag', dragCallback);\n external.$(element).on('CornerstoneToolsTouchStart', recordStartPoint);\n external.$(element).on('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst wwwcRegion = {\n activate,\n deactivate: disable,\n disable,\n setConfiguration,\n getConfiguration\n};\n\nconst wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexport {\n wwwcRegion,\n wwwcRegionTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwcRegion.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport mouseWheelTool from './mouseWheelTool.js';\nimport touchPinchTool from './touchPinchTool.js';\nimport touchDragTool from './touchDragTool.js';\n\n\nlet startPoints;\n\nfunction changeViewportScale (viewport, ticks) {\n const config = zoom.getConfiguration();\n const pow = 1.7;\n\n const oldFactor = Math.log(viewport.scale) / Math.log(pow);\n const factor = oldFactor + ticks;\n\n const scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition (position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift (shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n const angle = viewport.rotation * Math.PI / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy (eventData, ticks) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy (eventData, ticks) {\n const element = eventData.element;\n const image = eventData.image;\n const config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n const shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n const translateSpeed = 8;\n const outwardsMinScaleToTranslate = 3;\n const minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n let desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n const distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy (eventData, ticks) {\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback (e, eventData) {\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n const ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback (e, eventData) {\n let ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n const config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const config = zoom.getConfiguration();\n const viewport = eventData.viewport;\n const element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nconst zoom = simpleMouseButtonTool(mouseDownCallback);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nconst zoomWheel = mouseWheelTool(mouseWheelCallback);\nconst zoomTouchPinch = touchPinchTool(touchPinchCallback);\nconst zoomTouchDrag = touchDragTool(dragCallback);\n\nexport {\n zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/zoom.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'brush';\nconst configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet dragging = false;\n\nfunction paint (eventData) {\n const configuration = brush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown (e, eventData) {\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e, eventData) {\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e, eventData) {\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = brush.getConfiguration();\n const radius = configuration.radius;\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst brush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexport { brush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brush.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'adaptiveBrush';\nconst configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet thrMax;\nlet thrMin;\nlet currentRadius;\nlet dragging;\n\nfunction getGreyValues (pointerArray, pixelData, imageColumns) {\n const configuration = adaptiveBrush.getConfiguration();\n const tolerance = configuration.tolerance;\n let minValue = Number.MAX_VALUE;\n let maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach((point) => {\n const pixelIndex = point[1] * imageColumns + point[0];\n const greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush (imagePixelData, brushPixelData, rows, columns) {\n const configuration = adaptiveBrush.getConfiguration();\n const brushPixelValue = configuration.draw;\n const mouseX = Math.round(lastImageCoords.x);\n const mouseY = Math.round(lastImageCoords.y);\n let numPixelsOutsideThresholdWindow = null;\n let pointerArray = [];\n let radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = getCircle(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (let j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n const xCoord = pointerArray[j][0];\n const yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n const pixelIndex = yCoord * columns + xCoord;\n const pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n drawBrushPixels(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { rows, columns } = layer.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction erase (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n const configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown (e, eventData) {\n const element = eventData.element;\n const configuration = adaptiveBrush.getConfiguration();\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { x, y } = eventData.currentPoints.image;\n const { rows, columns } = layer.image;\n const pointerArray = getCircle(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e, eventData) {\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e, eventData) {\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = adaptiveBrush.getConfiguration();\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const pointerArray = getCircle(currentRadius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst adaptiveBrush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexport { adaptiveBrush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/adaptiveBrush.js","export default '1.1.2';\n\n\n\n// WEBPACK FOOTER //\n// ./version.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 6512cc8fd2024d8a510d","webpack:///./externalModules.js","webpack:///./events.js","webpack:///./stateManagement/toolState.js","webpack:///./enabledElementTools.js","webpack:///./util/isMouseButtonEnabled.js","webpack:///./util/triggerEvent.js","webpack:///./stateManagement/toolColors.js","webpack:///./util/drawTextBox.js","webpack:///./stateManagement/toolStyle.js","webpack:///./imageTools/mouseButtonTool.js","webpack:///./manipulators/drawHandles.js","webpack:///./imageTools/touchTool.js","webpack:///./stateManagement/loadHandlerManager.js","webpack:///./imageTools/touchDragTool.js","webpack:///./stateManagement/textStyle.js","webpack:///./manipulators/anyHandlesOutsideImage.js","webpack:///./imageTools/simpleMouseButtonTool.js","webpack:///./util/convertToVector3.js","webpack:///./stateManagement/imageIdSpecificStateManager.js","webpack:///./util/pointInsideBoundingBox.js","webpack:///./util/calculateSUV.js","webpack:///./manipulators/getHandleNearImagePoint.js","webpack:///./util/getMaxSimultaneousRequests.js","webpack:///./imageTools/mouseWheelTool.js","webpack:///./manipulators/moveHandle.js","webpack:///./manipulators/moveNewHandle.js","webpack:///./imageTools/displayTool.js","webpack:///./manipulators/moveNewHandleTouch.js","webpack:///./util/pointProjector.js","webpack:///./requestPool/requestPoolManager.js","webpack:///./imageTools/multiTouchDragTool.js","webpack:///./util/scroll.js","webpack:///./util/roundToDecimal.js","webpack:///./util/pointInEllipse.js","webpack:///./util/pauseEvent.js","webpack:///./util/getRGBPixels.js","webpack:///./util/copyPoints.js","webpack:///./stateManagement/toolCoordinates.js","webpack:///./manipulators/handleActivator.js","webpack:///./manipulators/moveAllHandles.js","webpack:///./timeSeriesTools/incrementTimePoint.js","webpack:///./referenceLines/calculateReferenceLine.js","webpack:///./referenceLines/renderActiveReferenceLine.js","webpack:///./orientation/index.js","webpack:///./util/scrollToIndex.js","webpack:///./stackTools/stackScroll.js","webpack:///./util/getLuminance.js","webpack:///./util/drawEllipse.js","webpack:///./util/drawCircle.js","webpack:///./util/drawArrow.js","webpack:///./util/calculateEllipseStatistics.js","webpack:///./imageTools/keyboardTool.js","webpack:///./manipulators/touchMoveAllHandles.js","webpack:///./manipulators/touchMoveHandle.js","webpack:///./inputSources/preventGhostClick.js","webpack:///./imageTools/doubleTapTool.js","webpack:///./imageTools/mouseButtonRectangleTool.js","webpack:///./imageTools/touchPinchTool.js","webpack:///./paintingTools/brushTool.js","webpack:///./paintingTools/getCircle.js","webpack:///./paintingTools/drawBrush.js","webpack:///./index.js","webpack:///./referenceLines/index.js","webpack:///./referenceLines/referenceLinesTool.js","webpack:///./orientation/getOrientationString.js","webpack:///./orientation/invertOrientationString.js","webpack:///./util/setContextToDisplayFontSize.js","webpack:///./timeSeriesTools/probeTool4D.js","webpack:///./measurementManager/measurementManager.js","webpack:///./measurementManager/lineSampleMeasurement.js","webpack:///./timeSeriesTools/timeSeriesPlayer.js","webpack:///./timeSeriesTools/timeSeriesScroll.js","webpack:///./synchronization/wwwcSynchronizer.js","webpack:///./synchronization/updateImageSynchronizer.js","webpack:///./synchronization/Synchronizer.js","webpack:///./synchronization/stackScrollSynchronizer.js","webpack:///./synchronization/stackImagePositionSynchronizer.js","webpack:///./synchronization/stackImagePositionOffsetSynchronizer.js","webpack:///./synchronization/stackImageIndexSynchronizer.js","webpack:///./synchronization/panZoomSynchronizer.js","webpack:///./stateManagement/timeSeriesSpecificStateManager.js","webpack:///./stateManagement/stackSpecificStateManager.js","webpack:///./stateManagement/frameOfReferenceStateManager.js","webpack:///./stateManagement/appState.js","webpack:///./stackTools/stackScrollKeyboard.js","webpack:///./stackTools/stackPrefetch.js","webpack:///./stackTools/scrollIndicator.js","webpack:///./stackTools/stackRenderers.js","webpack:///./stackTools/fusionRenderer.js","webpack:///./stackTools/playClip.js","webpack:///./inputSources/keyboardInput.js","webpack:///./inputSources/mouseInput.js","webpack:///./inputSources/mouseWheelInput.js","webpack:///./inputSources/touchInput.js","webpack:///./imageTools/angleTool.js","webpack:///./imageTools/arrowAnnotate.js","webpack:///./imageTools/crosshairs.js","webpack:///./imageTools/doubleTapZoom.js","webpack:///./imageTools/dragProbe.js","webpack:///./imageTools/ellipticalRoi.js","webpack:///./imageTools/freehand.js","webpack:///./imageTools/highlight.js","webpack:///./imageTools/imageStats.js","webpack:///./imageTools/length.js","webpack:///./imageTools/magnify.js","webpack:///./imageTools/orientationMarkers.js","webpack:///./imageTools/pan.js","webpack:///./imageTools/panMultiTouch.js","webpack:///./imageTools/probe.js","webpack:///./imageTools/rectangleRoi.js","webpack:///./imageTools/rotate.js","webpack:///./imageTools/rotateTouch.js","webpack:///./imageTools/saveAs.js","webpack:///./imageTools/seedAnnotate.js","webpack:///./imageTools/simpleAngle.js","webpack:///./imageTools/textMarker.js","webpack:///./imageTools/wwwc.js","webpack:///./imageTools/wwwcRegion.js","webpack:///./imageTools/zoom.js","webpack:///./paintingTools/brush.js","webpack:///./paintingTools/adaptiveBrush.js","webpack:///./version.js"],"names":["cornerstone","window","cornerstoneMath","Hammer","cs","cm","module","EVENTS","IMAGE_RENDERED","NEW_IMAGE","IMAGE_CACHE_PROMISE_REMOVED","ELEMENT_DISABLED","MOUSE_DOWN","MOUSE_UP","MOUSE_DOWN_ACTIVATE","MOUSE_DRAG","MOUSE_MOVE","MOUSE_CLICK","MOUSE_DOUBLE_CLICK","MOUSE_WHEEL","TOUCH_START","TOUCH_START_ACTIVE","TOUCH_END","TOUCH_DRAG","TOUCH_DRAG_END","TOUCH_PINCH","TOUCH_ROTATE","TOUCH_PRESS","TAP","DOUBLE_TAP","MULTI_TOUCH_START","MULTI_TOUCH_START_ACTIVE","MULTI_TOUCH_DRAG","KEY_DOWN","KEY_UP","KEY_PRESS","MEASUREMENT_ADDED","MEASUREMENT_MODIFIED","MEASUREMENT_REMOVED","TOOL_DEACTIVATED","CLIP_STOPPED","STACK_SCROLL","LINE_SAMPLE_UPDATED","getElementToolStateManager","element","enabledImage","getEnabledElement","toolStateManager","undefined","addToolState","toolType","measurementData","add","eventType","eventData","getToolState","get","removeToolState","data","toolData","indexOfData","i","length","splice","clearToolState","setElementToolStateManager","elementToolOptions","getToolOptions","toolOptions","optionsObject","find","toolOptionObject","options","setToolOptions","index","findIndex","push","which","mouseButtonMask","mouseButton","triggerEvent","el","type","detail","event","CustomEvent","cancelable","document","createEvent","initCustomEvent","dispatchEvent","defaultColor","activeColor","fillColor","setFillColor","color","getFillColor","setToolColor","getToolColor","setActiveColor","getActiveColor","getColorIfActive","active","toolColors","context","textLines","x","y","Object","prototype","toString","call","padding","font","getFont","fontSize","getFontSize","backgroundColor","getBackgroundColor","save","textBaseline","strokeStyle","maxWidth","forEach","text","width","measureText","Math","max","fillStyle","boundingBox","height","centering","left","top","debug","fillRect","fillText","restore","defaultWidth","activeWidth","setToolWidth","getToolWidth","setActiveWidth","getActiveWidth","toolStyle","mouseToolInterface","configuration","mouseDownActivateCallback","e","addNewMeasurement","preventDefault","stopPropagation","mouseMoveCallback","setCoords","imageNeedsUpdate","coords","currentPoints","canvas","handles","pointNearTool","updateImage","mouseDownCallback","handleDoneMove","invalidated","addEventListener","mouseMove","startPoints","currentTarget","preventHandleOutsideImage","distance","handle","removeEventListener","stopImmediatePropagation","opt","deleteIfHandleOutsideImage","mouseDown","mouseDownActivate","mouseDoubleClick","mouseDoubleClickCallback","mouseEventData","createNewMeasurement","handleMover","keys","end","disable","onImageRendered","enable","activate","deactivate","statusChangeEventData","getConfiguration","setConfiguration","config","toolInterface","renderData","name","drawnIndependently","drawHandlesIfActive","beginPath","lineWidth","handleCanvasCoords","pixelToCanvas","arc","handleRadius","PI","fill","stroke","deactivateAllHandles","deactivateAllToolInstances","touchTool","touchToolInterface","touchEventData","highlight","touchDownActivateCallback","tapCallback","touchStartCallback","doneMovingCallback","distanceSq","lastEvent","lastEventData","pressCallback","doubleTapCallback","defaultStartLoadHandler","defaultEndLoadHandler","defaultErrorLoadingHandler","setStartLoadHandler","handler","getStartLoadHandler","setEndLoadHandler","getEndLoadHandler","setErrorLoadingHandler","getErrorLoadingHandler","loadHandlerManager","touchDragCallback","events","fireOnTouchStart","activateCallback","disableCallback","enableCallback","deactivateCallback","defaultFontSize","defaultFont","defaultBackgroundColor","setFont","setFontSize","setBackgroundColor","textStyle","image","imageRect","handleOutsideImage","allowedOutsideImage","point","insideRect","Error","convertToVector3","arrayOrVector3","Vector3","newImageIdSpecificToolStateManager","toolState","saveImageIdToolState","imageId","restoreImageIdToolState","imageIdToolState","saveToolState","restoreToolState","savedToolState","addImageIdSpecificToolState","hasOwnProperty","getImageIdSpecificToolState","clearImageIdSpecificToolStateManager","clear","globalImageIdSpecificToolStateManager","storedPixelValue","patientStudyModule","metaData","seriesModule","modality","modalityPixelValue","slope","intercept","patientWeight","petSequenceModule","radiopharmaceuticalInfo","startTime","radiopharmaceuticalStartTime","totalDose","radionuclideTotalDose","halfLife","radionuclideHalfLife","seriesAcquisitionTime","seriesTime","acquisitionTimeInSeconds","fracToDec","fractionalSeconds","seconds","minutes","hours","injectionStartTimeInSeconds","durationInSeconds","correctedDose","exp","log","suv","fractionalValue","parseFloat","distanceThreshold","nearbyHandle","pointNearHandle","hasBoundingBox","handleCanvas","configMaxSimultaneousRequests","maxSimultaneousRequests","default","IE","Firefox","Opera","Chrome","Safari","getBrowserInfo","ua","navigator","userAgent","M","match","tem","test","exec","slice","join","replace","appName","appVersion","setMaxSimultaneousRequests","newMaxSimultaneousRequests","getMaxSimultaneousRequests","getDefaultSimultaneousRequests","infoString","info","split","browserName","browserVersion","browserData","isMobileDevice","pattern","RegExp","mouseWheelCallback","distanceFromTool","mouseDragCallback","hasMoved","min","modifiedEventData","mouseUpCallback","moveCallback","whichMovement","moveEndCallback","measurementRemovedCallback","toolDeactivatedCallback","imageCoords","pageToPixel","page","distanceFromTouch","projectPatientPointToImagePlane","imagePointToPatientPoint","planePlaneIntersection","patientPoint","imagePlane","rowCosines","columnCosines","imagePositionPatient","clone","sub","dot","columnPixelSpacing","rowPixelSpacing","imagePoint","multiplyScalar","getRectangleFromImagePlane","topLeft","topRight","columns","bottomLeft","rows","bottomRight","rect","Line3","right","bottom","lineRectangleIntersection","line","intersections","side","segment","intersection","intersectLine","targetImagePlane","referenceImagePlane","targetRowCosines","targetColumnCosines","targetImagePositionPatient","referenceRowCosines","referenceColumnCosines","referenceImagePositionPatient","targetNormal","cross","targetPlane","Plane","setFromNormalAndCoplanarPoint","referenceNormal","referencePlane","originDirection","intersectPlane","origin","direction","distanceTo","start","requestPool","interaction","thumbnail","prefetch","numRequests","maxNumRequests","awake","grabDelay","addRequest","preventCache","doneCallback","failCallback","requestDetails","imageLoadObject","imageCache","getImageLoadObject","promise","then","error","clearRequestStack","startAgain","setTimeout","startGrabbing","sendRequest","requestTypeToLoadPriority","priority","loader","loadImage","loadAndCacheImage","currentRequests","requestsToSend","getNextRequest","shift","getRequestPool","images","loop","stackData","newImageIdIndex","currentImageIdIndex","nbImages","imageIds","value","precision","multiplier","pow","round","ellipse","location","xRadius","yRadius","center","normalized","inEllipse","cancelBubble","returnValue","enabledElement","storedPixelData","pixelData","getPixelData","spIndex","row","column","red","green","blue","alpha","points","copy","client","coordsData","getCoords","toolCoordinates","canvasPoint","activeHandle","getActiveHandle","movesIndependently","deltaPoints","timePoints","wrap","timeSeriesData","currentStack","stacks","currentStackIndex","newStackIndex","viewport","getViewport","newStack","startLoadingHandler","endLoadingHandler","errorLoadingHandler","displayImage","targetElement","referenceElement","targetImage","referenceImage","frameOfReferenceUID","angleInRadians","angleTo","abs","referenceLine","refLineStartCanvas","refLineEndCanvas","setTransform","moveTo","lineTo","orientation","getOrientationString","invertOrientationString","stackRenderer","stackRendererData","render","newImageId","retryLoadOnScroll","Boolean","imagePromise","dragCallback","mouseDragEventData","deltaY","stackScroll","pixelsPerImage","offsetHeight","stackScrollSpeed","imageDelta","imageIdIndexOffset","imageDeltaMod","stackScrollWheel","stackScrollTouchDrag","multiTouchDragCallback","stackScrollMultiTouch","testPointers","numPointers","luminance","w","h","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","closePath","headLength","angle","atan2","cos","sin","sp","sum","sumSquared","count","mean","variance","stdDev","sqrt","keyDownCallback","touchEndCallback","handlesOutsideImage","runAnimation","time","Date","getTime","fingerDistance","aboveFinger","targetLocation","touchEndEvents","handlePressed","animate","lastTime","distanceRemaining","linearDistEachFrame","requestAnimationFrame","antiGhostDelay","pointerType","mouse","touch","lastInteractionType","lastInteractionTime","handleTap","now","handleTapMouse","bind","handleTapTouch","attachEvents","eventList","interactionType","tapHandler","eventName","removeEvents","mouseEvents","touchEvents","preventGhostClick","pointInsideRect","touchPinchCallback","brushTool","TOOL_STATE_TOOL_TYPE","brushLayerId","brushToolInterface","onMouseMove","onMouseUp","onDrag","onMouseDown","Uint8ClampedArray","layer","getLayer","setPixelData","invalid","colormapId","colormap","colors","getColormap","setNumberOfColors","setColor","labelMapImage","minPixelValue","maxPixelValue","rgba","labelmap","invert","sizeInBytes","pixelReplication","addLayer","getCircle","radius","xCoord","yCoord","x0","y0","circleArray","drawBrushPixels","pointerArray","storedPixels","brushPixelValue","getPixelIndex","drawBrushOnCanvas","canvasContext","canvasPtTL","canvasPtBR","sizeX","sizeY","canvasPt","timeSeriesScroll","timeSeriesScrollWheel","timeSeriesScrollTouchDrag","addTimeSeriesStateManager","newTimeSeriesSpecificToolStateManager","stackSpecificStateManager","newStackSpecificToolStateManager","addStackStateManager","newFrameOfReferenceSpecificToolStateManager","globalFrameOfReferenceSpecificToolStateManager","playClip","stopClip","angleTouch","arrowAnnotate","arrowAnnotateTouch","crosshairs","crosshairsTouch","dragProbe","dragProbeTouch","ellipticalRoi","ellipticalRoiTouch","freehand","highlightTouch","lengthTouch","magnify","magnifyTouchDrag","pan","panTouchDrag","probe","probeTouch","rectangleRoi","rectangleRoiTouch","rotate","rotateTouchDrag","seedAnnotate","seedAnnotateTouch","simpleAngle","simpleAngleTouch","textMarker","textMarkerTouch","wwwc","wwwcTouchDrag","wwwcRegion","wwwcRegionTouch","zoom","zoomWheel","zoomTouchPinch","zoomTouchDrag","brush","adaptiveBrush","referenceLines","calculateReferenceLine","tool","renderActiveReferenceLine","syncContext","synchronizationContext","enabledElements","getSourceElements","renderer","getContext","setToPixelCoordinateSystem","referenceEnabledElement","vector","vec3","orientationX","orientationY","orientationZ","z","string","inverted","toUpperCase","fontScale","scaledFontSize","scale","lineHeight","updateLineSample","samples","timeSeries","stack","imageIdIndex","offset","sample","lineSample","set","timeSeriestoolData","visible","textCoords","probeTool4D","MeasurementManager","that","measurements","measurement","eventDetail","remove","manager","framesPerSecond","timeSeriesToolData","playClipToolData","playClipData","intervalId","lastFrameTimeStamp","frameRate","setInterval","clearInterval","timeSeriesPlayer","stop","pixelsPerTimeSeries","timeSeriesScrollSpeed","timeSeriesDelta","timeSeriesDeltaMod","mouseMoveData","originalEvent","synchronizer","sourceElement","sourceViewport","targetViewport","voi","windowWidth","windowCenter","setViewport","unique","array","filter","self","indexOf","Synchronizer","sourceElements","targetElements","ignoreFiredEvents","initialData","eventHandler","setHandler","getHandler","getDistances","distances","sourceEnabledElement","sourceImageId","sourceImagePlane","sourceImagePosition","targetEnabledElement","targetImageId","targetImagePosition","fireEvent","targetIndex","sourceIndex","positionDifference","onEvent","addSource","updateDisableHandlers","addTarget","removeSource","removeTarget","getTargetElements","disableHandler","elements","concat","destroy","stackToolDataSource","sourceImage","minDistance","Number","MAX_VALUE","imagePosition","distanceToSquared","finalPosition","sourceStackToolDataSource","sourceStackData","targetStackToolDataSource","targetStackData","translation","toolTypes","oldStateManager","addStackSpecificToolState","getStackSpecificToolState","imageIdToolStateManager","timeSeriesStateManagers","tools","timeSeriesSpecificStateManager","stackToolState","stackSpecificToolStateManager","stackStateManagers","otherTools","stackTools","addFrameOfReferenceSpecificToolState","frameOfReference","frameOfReferenceToolState","getFrameOfReferenceSpecificToolState","removeFrameOfReferenceSpecificToolState","saveApplicationState","appState","elementToolState","elementViewport","id","restoreApplicationState","elementId","getElementById","savedViewport","UP","DOWN","keyCode","stackScrollKeyboard","requestType","maxImagesToPrefetch","Infinity","resetPrefetchTimeout","resetPrefetchDelay","range","lowEnd","highEnd","arr","c","apply","nearestIndex","l","v","low","high","stackPrefetchData","stackPrefetch","indicesToRequest","enabled","removeFromList","sort","a","b","indicesToRequestCopy","nearest","nextImageIdIndex","console","lowerIndex","higherIndex","currentIndex","shouldSkipLower","shouldSkipHigher","shouldLoadLower","shouldLoadHigher","getPromiseRemovedHandler","onImageUpdated","clearTimeout","target","stackPrefetchDataArray","warn","indexOfCurrentImage","promiseRemovedHandler","scrollBarHeight","scrollIndicator","cursorWidth","cursorHeight","xPosition","yPosition","stackRenderers","FusionRenderer","layerIds","findImageFn","imageStacks","isInteger","baseImageObject","currentImageId","overlayImageStacks","baseImage","baseLayerId","setLayerImage","imgObj","overlayLayerIndex","layerIndex","currentLayerId","setActiveLayer","getPlayClipTimeouts","speed","delay","limit","timeouts","isTimeVarying","stopClipWithData","usingFrameTimeVector","triggerStopEvent","playClipTimeouts","stackToolData","frameTimeVector","ignoreFrameTimeVector","reverse","playClipAction","imageCount","playClipTimeoutHandler","mouseX","mouseY","keyPress","keyPressData","keyPressEvents","keydown","keypress","keyup","pageX","pageY","keyboardEvents","keyboardInput","isClickEvent","preventClickTimeout","clickDelay","getEventWhich","buttons","preventClickHandler","pageToPoint","clientX","clientY","lastPoints","eventPropagated","whichMouseButton","subtract","ctrlKey","metaKey","shiftKey","mouseInput","mouseWheel","wheelDeltaY","axis","startingCoords","wheelDelta","mouseWheelData","imageX","imageY","mouseWheelEvents","mouseWheelInput","touchStartDelay","pressTimeout","pageDistanceMoved","lastScale","lastRotation","preventNextPinch","isPress","lastDelta","pressDelay","pressMaxDistance","onTouch","srcEvent","scaleChange","delta","remainingPointers","rotation","pointers","touches","isTouchEvent","changedTouches","deltaX","changedPointers","hammerOptions","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","TouchInput","mc","Manager","panOptions","DIRECTION_ALL","threshold","Pan","pinch","Pinch","Rotate","recognizeWith","doubleTap","Tap","taps","interval","posThreshold","on","hammer","off","touchInput","angleData","start2","end2","lineSegment","distanceToPoint","shadow","shadowColor","shadowOffsetX","shadowOffsetY","handleStartCanvas","handleEndCanvas","dx1","ceil","dy1","dx2","dy2","acos","rAngle","str","String","fromCharCode","parseInt","textX","textY","getTextCallback","doneChangingTextCallback","prompt","changeTextCallback","drawHandles","drawHandlesOnHover","arrowFirst","textBox","handleOptions","textWidth","textHeight","transform","internal","getTransform","transformPoint","link","midpointCanvas","findClosestPoint","boundingBoxPoints","setLineDash","addNewMeasurementTouch","doubleClickCallback","updatedText","deleteTool","chooseLocation","sourceImagePoint","normal","dragEndCallback","dragStartCallback","enableTouch","disableTouch","fitToWindowStrategy","fitToWindow","doubleTapZoom","strategy","strategies","dragEventData","defaultStrategy","fontHeight","getStoredPixels","mo","toFixed","minimalStrategy","toolCoords","modalityPixelValueText","imageRenderedCallback","minimal","pointNearEllipse","startCanvas","endCanvas","minorEllipse","majorEllipse","pointInMinorEllipse","pointInMajorEllipse","pointNearToolTouch","numberWithCommas","parts","leftCanvas","topCanvas","widthCanvas","heightCanvas","area","meanStdDev","meanStdDevSUV","pixels","getPixels","isNaN","moSuffix","meanText","stdDevText","SUVtext","suffix","areaText","ellipsePoints","mouseLocation","modifying","currentHandle","currentTool","addPoint","handleData","lines","toolIndex","mousePoint","pointNearHandleAllTools","handleNearby","lastLineIndex","lastLine","startDrawing","endDrawing","nearby","handleStart","j","k","lineCanvas","mouseLocationCanvas","existingToolData","insideBox","clientWidth","clientHeight","strokeRect","stats","key","imageStats","colPixelSpacing","rowImagePixelSpacing","colImagePixelSpacing","dx","dy","magnifySize","magnificationLevel","newImageCallback","hideTool","querySelector","style","display","body","cursor","drawMagnificationTool","magnifyCanvas","createMagnificationCanvas","zoomCtx","getSize","canvasLocation","clearRect","copyFrom","scaledMagnify","drawImage","createElement","classList","position","appendChild","removeMagnificationCanvas","removeChild","getOrientationMarkers","imagePlaneMetaData","rowString","columnString","oppositeRowString","oppositeColumnString","getOrientationMarkerPositions","markers","textWidths","orientationMarkers","drawAllMarkers","widthScale","heightScale","touchPanCallback","panMultiTouch","calculateMeanStdDev","getBoundingClientRect","pointsFromCenter","rotationRadians","rotationDegrees","horizontalStrategy","verticalStrategy","horizontal","vertical","touchRotateCallback","rotateTouch","saveAs","filename","mimetype","lnk","download","href","toDataURL","initMouseEvent","doneGetTextCallback","currentLetter","currentNumber","showCoordinates","countUp","realCoords","canvasWidth","textPlusCoords","middle","handleMiddleCanvas","sideA","sideB","sideC","sideALength","sideBLength","sideCLength","touchMoveCallback","current","ascending","insideBoundingBox","touchPressCallback","maxVOI","minVOI","imageDynamicRange","dragData","minWindowWidth","calculateMinMaxMean","storedPixelLuminanceData","globalMin","globalMax","numPixels","spv","endPoint","applyWWWCRegion","startPoint","floor","pixelLuminanceData","minMaxMean","recordStartPoint","startPointCanvas","endPointCanvas","disableTouchDrag","activateTouchDrag","changeViewportScale","ticks","oldFactor","factor","maxScale","minScale","boundPosition","correctShift","hflip","vflip","cosA","sinA","newX","newY","newCoords","translateStrategy","translateSpeed","outwardsMinScaleToTranslate","minTranslation","preventZoomOutsideImage","desiredTranslation","distanceToDesired","zoomToCenterStrategy","translate","zoomToCenter","draw","hoverColor","dragColor","lastImageCoords","dragging","paint","tolerance","minRadius","thrMax","thrMin","currentRadius","getGreyValues","imageColumns","minValue","maxValue","pixelIndex","greyValue","paintAdaptiveBrush","imagePixelData","brushPixelData","numPixelsOutsideThresholdWindow","pixelValue","baseLayer","getLayers","brushData","erase"],"mappings":"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A,O;;;;;;;;;iDACAA,O;;;;;;;;;4DACAA,O;;;;;;;;;mEACAA,O;;;;;;;;;yEACAA,O;;;;;;;;;gEACAA,O;;;;;;;;;wDACAA,O;;;;;;;;;8CAEAA,O;;;;;;;;;sBACAxQ,Y;;;;;;sBACPM,Y;;;;;;sBACAE,e;;;;;;sBACAO,c;;;;;;sBACAC,0B;;;;;;sBACAtB,0B;;;;;;;;;oDACO8Q,O;;;;;;;;;+CACAA,O;;;;;;;;;2CACA4V,yB;;;;;;2CACPC,qC;;;;;;;;;8CACO7V,O;;;;;;;;;sCAEA8V,yB;;;;;;sCACPC,gC;;;;;;sCACAC,oB;;;;;;;;;uDAEOhW,O;;;;;;;;;wCAEAvD,kC;;;;;;wCACPc,qC;;;;;;;;;yCAEO0Y,2C;;;;;;yCACPC,8C;;;;;;;;;6CAEOlW,O;;;;;;;;;wDAEAA,O;;;;;;;;;wBAEA6N,W;;;;;;wBACPO,gB;;;;;;wBACAC,oB;;;;;;wBACAE,qB;;;;;;;;;kDAEOvO,O;;;;;;;;;oDACAA,O;;;;;;;;;mDACAA,O;;;;;;;;;qBACAmW,Q;;;;;;qBAAUC,Q;;;;;;;;;2DAEVpW,O;;;;;;;;;gDACAA,O;;;;;;;;;4DACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;mDACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;kDACAA,O;;;;;;;;;uDACAA,O;;;;;;;;;wDACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;kDAEAA,O;;;;;;;;;+CACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;sDACAA,O;;;;;;;;;+CACAA,O;;;;;;;;;sBAGAuP,K;;;;;;sBAAO8G,U;;;;;;;;;0BACPC,a;;;;;;0BAAeC,kB;;;;;;;;;uBACfC,U;;;;;;uBAAYC,e;;;;;;;;;gDACZzW,O;;;;;;;;;kDACAA,O;;;;;;;;;kDACAA,O;;;;;;;;;sBACA0W,S;;;;;;sBAAWC,c;;;;;;;;;0BAEXC,a;;;;;;0BAAeC,kB;;;;;;;;;qBACfC,Q;;;;;;;;;sBAEAld,S;;;;;;sBAAWmd,c;;;;;;;;;+CACX/W,O;;;;;;;;;iDACAA,O;;;;;;;;;mBACA3P,M;;;;;;mBAAQ2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","file":"cornerstoneTools.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 61);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6512cc8fd2024d8a510d","let cornerstone = window.cornerstone;\nlet cornerstoneMath = window.cornerstoneMath;\nlet Hammer = window.Hammer;\n\nexport default {\n set cornerstone (cs) {\n cornerstone = cs;\n },\n get cornerstone () {\n return cornerstone;\n },\n set cornerstoneMath (cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath () {\n return cornerstoneMath;\n },\n set Hammer (module) {\n Hammer = module;\n },\n get Hammer () {\n return Hammer;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","const EVENTS = {\n // Events from Cornerstone Core\n IMAGE_RENDERED: 'cornerstoneimagerendered',\n NEW_IMAGE: 'cornerstonenewimage',\n IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',\n ELEMENT_DISABLED: 'cornerstoneelementdisabled',\n\n // Mouse events\n MOUSE_DOWN: 'cornerstonetoolsmousedown',\n MOUSE_UP: 'cornerstonetoolsmouseup',\n MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',\n MOUSE_DRAG: 'cornerstonetoolsmousedrag',\n MOUSE_MOVE: 'cornerstonetoolsmousemove',\n MOUSE_CLICK: 'cornerstonetoolsmouseclick',\n MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',\n MOUSE_WHEEL: 'cornerstonetoolsmousewheel',\n\n // Touch events\n TOUCH_START: 'cornerstonetoolstouchstart',\n TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',\n TOUCH_END: 'cornerstonetoolstouchend',\n TOUCH_DRAG: 'cornerstonetoolstouchdrag',\n TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',\n TOUCH_PINCH: 'cornerstonetoolstouchpinch',\n TOUCH_ROTATE: 'cornerstonetoolstouchrotate',\n TOUCH_PRESS: 'cornerstonetoolstouchpress',\n TAP: 'cornerstonetoolstap',\n DOUBLE_TAP: 'cornerstonetoolsdoubletap',\n MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',\n MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',\n MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',\n\n // Keyboard events\n KEY_DOWN: 'cornerstonetoolskeydown',\n KEY_UP: 'cornerstonetoolskeyup',\n KEY_PRESS: 'cornerstonetoolskeypress',\n\n // Measurement / tool events\n MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',\n MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',\n MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved',\n TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',\n CLIP_STOPPED: 'cornerstonetoolsclipstopped',\n STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed\n\n LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated'\n};\n\nexport default EVENTS;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction getElementToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState (element, toolType, measurementData) {\n const toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n const eventType = EVENTS.MEASUREMENT_ADDED;\n const eventData = {\n toolType,\n element,\n measurementData\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState (element, toolType, data) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n const eventType = EVENTS.MEASUREMENT_REMOVED;\n const eventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, eventData);\n }\n}\n\nfunction clearToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager (element, toolStateManager) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexport {\n addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolState.js","const elementToolOptions = {};\n\nfunction getToolOptions (toolType, element) {\n if (!elementToolOptions[toolType]) {\n return {};\n }\n\n const toolOptions = elementToolOptions[toolType];\n const optionsObject = toolOptions.find((toolOptionObject) => toolOptionObject.element === element);\n\n if (!optionsObject) {\n return {};\n }\n\n return optionsObject.options;\n}\n\nfunction setToolOptions (toolType, element, options) {\n if (!elementToolOptions[toolType]) {\n elementToolOptions[toolType] = [{\n element,\n options\n }];\n\n return;\n }\n\n const toolOptions = elementToolOptions[toolType];\n const index = toolOptions.findIndex((toolOptionObject) => toolOptionObject.element === element);\n\n if (index === -1) {\n elementToolOptions[toolType].push({\n element,\n options\n });\n } else {\n elementToolOptions[toolType][index].options = options;\n }\n}\n\nexport { getToolOptions, setToolOptions };\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElementTools.js","/* eslint no-bitwise:0 */\n\nexport default function (which, mouseButtonMask) {\n const mouseButton = (1 << (which - 1));\n\n\n return ((mouseButtonMask & mouseButton) !== 0);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/isMouseButtonEnabled.js","/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/triggerEvent.js","\nlet defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor (color) {\n fillColor = color;\n}\n\nfunction getFillColor () {\n return fillColor;\n}\n\nfunction setToolColor (color) {\n defaultColor = color;\n}\n\nfunction getToolColor () {\n return defaultColor;\n}\n\nfunction setActiveColor (color) {\n activeColor = color;\n}\n\nfunction getActiveColor () {\n return activeColor;\n}\n\nfunction getColorIfActive (active) {\n return active ? activeColor : defaultColor;\n}\n\nconst toolColors = {\n setFillColor,\n getFillColor,\n setToolColor,\n getToolColor,\n setActiveColor,\n getActiveColor,\n getColorIfActive\n};\n\nexport default toolColors;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolColors.js","import textStyle from '../stateManagement/textStyle.js';\n\nexport default function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n const padding = 5;\n const font = textStyle.getFont();\n const fontSize = textStyle.getFontSize();\n const backgroundColor = textStyle.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n let maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n const width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n const boundingBox = {\n width: maxWidth + (padding * 2),\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawTextBox.js","let defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth (width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth () {\n return defaultWidth;\n}\n\nfunction setActiveWidth (width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth () {\n return activeWidth;\n}\n\nconst toolStyle = {\n setToolWidth,\n getToolWidth,\n setActiveWidth,\n getActiveWidth\n};\n\nexport default toolStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolStyle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\nimport { getToolOptions, setToolOptions } from '../enabledElementTools.js';\n\nexport default function (mouseToolInterface) {\n let configuration = {};\n const toolType = mouseToolInterface.toolType;\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e) {\n const eventData = e.detail;\n\n toolCoordinates.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n const coords = eventData.currentPoints.canvas;\n\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) ||\n (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e) {\n const eventData = e.detail;\n let data;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove () {\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, data);\n }\n\n external.cornerstone.updateImage(element);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n let i;\n\n // Now check to see if there is a handle we can move\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distance = 6;\n const handle = getHandleNearImagePoint(element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n data.active = true;\n moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n const opt = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n\n const mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback;\n const mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback;\n const mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback;\n const mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n\n let handleMover;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = moveHandle;\n } else {\n handleMover = moveNewHandle;\n }\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n const eventType = EVENTS.TOOL_DEACTIVATED;\n const statusChangeEventData = {\n mouseButtonMask,\n toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n function getConfiguration () {\n return configuration;\n }\n\n function setConfiguration (config) {\n configuration = config;\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration,\n mouseDownCallback,\n mouseMoveCallback,\n mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseDoubleClick) {\n toolInterface.mouseDoubleClickCallback = mouseDoubleClick;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonTool.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\n\nconst handleRadius = 6;\n\nexport default function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = toolStyle.getActiveWidth();\n } else {\n context.lineWidth = toolStyle.getToolWidth();\n }\n\n const handleCanvasCoords = external.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/drawHandles.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport touchMoveHandle from '../manipulators/touchMoveHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport touchMoveAllHandles from '../manipulators/touchMoveAllHandles.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction deactivateAllHandles (handles) {\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances (toolData) {\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool (touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n\n const measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n addToolState(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === EVENTS.TAP) {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n moveNewHandleTouch(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool tapCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let data;\n let i;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback () {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distanceSq = 25; // Should probably make this a settable property later\n const handle = getHandleNearImagePoint(element, data.handles, coords, distanceSq);\n\n if (handle) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e);\n } else {\n touchDownActivateCallback(e);\n }\n\n return false;\n }\n\n function touchStartCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool touchStartCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.startPoints.canvas;\n let data;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let i;\n\n function doneMovingCallback (lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === EVENTS.TOUCH_PRESS) {\n triggerEvent(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n data.active = true;\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n element.addEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element) {\n const eventType = EVENTS.TOOL_DEACTIVATED;\n const statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexport default touchTool;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchTool.js","let defaultStartLoadHandler;\nlet defaultEndLoadHandler;\nlet defaultErrorLoadingHandler;\n\nfunction setStartLoadHandler (handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler () {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler (handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler () {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler (handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler () {\n return defaultErrorLoadingHandler;\n}\n\nconst loadHandlerManager = {\n setStartLoadHandler,\n getStartLoadHandler,\n setEndLoadHandler,\n getEndLoadHandler,\n setErrorLoadingHandler,\n getErrorLoadingHandler\n};\n\nexport default loadHandlerManager;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/loadHandlerManager.js","import EVENTS from '../events.js';\n\nexport default function (touchDragCallback, options) {\n let events = EVENTS.TOUCH_DRAG;\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsTouchStart';\n }\n\n const toolInterface = {\n activate (element) {\n element.removeEventListener(events, touchDragCallback);\n\n if (options && options.eventData) {\n element.addEventListener(events, options.eventData, touchDragCallback);\n } else {\n element.addEventListener(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchDragTool.js","let defaultFontSize = 15,\n defaultFont = `${defaultFontSize}px Arial`,\n defaultBackgroundColor = 'transparent';\n\nfunction setFont (font) {\n defaultFont = font;\n}\n\nfunction getFont () {\n return defaultFont;\n}\n\nfunction setFontSize (fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize () {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor (backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor () {\n return defaultBackgroundColor;\n}\n\nconst textStyle = {\n setFont,\n getFont,\n setFontSize,\n getFontSize,\n setBackgroundColor,\n getBackgroundColor\n};\n\nexport default textStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/textStyle.js","import external from '../externalModules.js';\n\nexport default function (renderData, handles) {\n const image = renderData.image;\n const imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n let handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (external.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/anyHandlesOutsideImage.js","import EVENTS from '../events.js';\nimport { setToolOptions } from '../enabledElementTools.js';\n\nexport default function (mouseDownCallback, toolType) {\n if (!toolType) {\n throw new Error('simpleMouseButtonTool: toolType is required');\n }\n\n let configuration = {};\n\n return {\n activate (element, mouseButtonMask, options = {}) {\n options.mouseButtonMask = mouseButtonMask;\n setToolOptions(toolType, element, options);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleMouseButtonTool.js","import external from '../externalModules.js';\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nexport default function convertToVector3 (arrayOrVector3) {\n const cornerstoneMath = external.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/convertToVector3.js","import external from '../externalModules.js';\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager () {\n let toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState (imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState (imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState (element, toolType, data) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState (element, toolType) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = imageIdToolState[toolType];\n\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState,\n restoreImageIdToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nconst globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexport {\n newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/imageIdSpecificStateManager.js","import external from '../externalModules.js';\n\nexport default function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return external.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInsideBoundingBox.js","import external from '../externalModules.js';\n\n// Returns a decimal value given a fractional value\nfunction fracToDec (fractionalValue) {\n return parseFloat(`.${fractionalValue}`);\n}\n\nexport default function (image, storedPixelValue) {\n const cornerstone = external.cornerstone;\n const patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n const modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n const modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n const patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n const petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n const startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n const totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n const halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n const seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n const acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n const injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n const durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n const correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n const suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateSUV.js","import external from '../externalModules.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\n\nexport default function (element, handles, coords, distanceThreshold) {\n let nearbyHandle;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if (pointInsideBoundingBox(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n const handleCanvas = external.cornerstone.pixelToCanvas(element, handle);\n const distance = external.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/getHandleNearImagePoint.js","let configMaxSimultaneousRequests;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nconst maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo () {\n const ua = navigator.userAgent;\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n let tem;\n\n if (/trident/i.test(M[1])) {\n tem = (/\\brv[ :]+(\\d+)/g).exec(ua) || [];\n\n return `IE ${tem[1] || ''}`;\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests (newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests () {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests () {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n const browserName = info[0];\n const browserVersion = info[1];\n const browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice () {\n const pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n\n return pattern.test(navigator.userAgent);\n}\n\nexport {\n getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n setMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice\n};\n\n\n\n// WEBPACK FOOTER //\n// ./util/getMaxSimultaneousRequests.js","import EVENTS from '../events.js';\n\nexport default function (mouseWheelCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n element.addEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseWheelTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback (e) {\n const eventData = e.detail;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback () {\n handle.active = false;\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveHandle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function moveCallback (e) {\n const eventData = e.detail;\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function whichMovement (e) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n\n element.addEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n if (e.type === EVENTS.MOUSE_DRAG) {\n element.addEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n }\n }\n\n function measurementRemovedCallback (e) {\n const eventData = e.detail;\n\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback (e) {\n const eventData = e.detail;\n\n if (eventData.toolType === toolType) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.addEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n function moveEndCallback () {\n element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandle.js","\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\n\nexport default function (onImageRendered) {\n let configuration = {};\n\n return {\n disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n },\n enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/displayTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n const distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback (e) {\n const eventData = e.detail;\n\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback (e) {\n const eventData = e.detail;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.removeEventListener(EVENTS.TAP, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n if (e.type === EVENTS.TOUCH_PINCH || e.type === EVENTS.TOUCH_PRESS) {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation (e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.addEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.addEventListener(EVENTS.TAP, moveEndCallback);\n element.addEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n\n function toolDeactivatedCallback () {\n element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.removeEventListener(EVENTS.TAP, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandleTouch.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Projects a patient point to an image point\nexport function projectPatientPointToImagePlane (patientPoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n const point = patientPoint.clone().sub(imagePositionPatient);\n const x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n const y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n\n return {\n x,\n y\n };\n}\n\n// Projects an image point to a patient point\nexport function imagePointToPatientPoint (imagePoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n\n const x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n const y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n const patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane (imagePlane) {\n // Get the points\n const topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n const topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n const bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n const bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n const rect = {\n top: new external.cornerstoneMath.Line3(topLeft, topRight),\n left: new external.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new external.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new external.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n\n return rect;\n}\n\nfunction lineRectangleIntersection (line, rect) {\n const intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n const segment = rect[side];\n const intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nexport function planePlaneIntersection (targetImagePlane, referenceImagePlane) {\n const targetRowCosines = convertToVector3(targetImagePlane.rowCosines);\n const targetColumnCosines = convertToVector3(targetImagePlane.columnCosines);\n const targetImagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n const referenceRowCosines = convertToVector3(referenceImagePlane.rowCosines);\n const referenceColumnCosines = convertToVector3(referenceImagePlane.columnCosines);\n const referenceImagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n const targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n const targetPlane = new external.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n const referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n const referencePlane = new external.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n const originDirection = referencePlane.clone().intersectPlane(targetPlane);\n const origin = originDirection.origin;\n const direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n const bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n const distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n const line = new external.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n const rect = getRectangleFromImagePlane(referenceImagePlane);\n const intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointProjector.js","import external from '../externalModules.js';\nimport { getMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nconst numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nlet maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nlet awake = false;\nconst grabDelay = 20;\n\nfunction addRequest (element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n const requestDetails = {\n type,\n imageId,\n preventCache,\n doneCallback,\n failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.promise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack (type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain () {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest (requestDetails) {\n const cornerstone = external.cornerstone;\n // Increment the number of current requests of this type\n const type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n const imageId = requestDetails.imageId;\n const doneCallback = requestDetails.doneCallback;\n const failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n const imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imageLoadObject.promise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority (requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n const priority = requestTypeToLoadPriority(requestDetails);\n\n let loader;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing () {\n // Begin by grabbing X images\n const maxSimultaneousRequests = getMaxSimultaneousRequests();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n const currentRequests = numRequests.interaction +\n numRequests.thumbnail +\n numRequests.prefetch;\n const requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest () {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length &&\n !requestPool.thumbnail.length &&\n !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool () {\n return requestPool;\n}\n\nexport default {\n addRequest,\n clearRequestStack,\n startGrabbing,\n getRequestPool\n};\n\n\n\n// WEBPACK FOOTER //\n// ./requestPool/requestPoolManager.js","import EVENTS from '../events.js';\n\nexport default function (touchDragCallback, options) {\n let configuration = {};\n const events = [EVENTS.MULTI_TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(EVENTS.MULTI_TOUCH_START);\n }\n\n return {\n activate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/multiTouchDragTool.js","import scrollToIndex from './scrollToIndex.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default function (element, images, loop = false) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n let newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n const nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n scrollToIndex(element, newImageIdIndex);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scroll.js","export default function (value, precision) {\n const multiplier = Math.pow(10, precision);\n\n\n return (Math.round(value * multiplier) / multiplier);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/roundToDecimal.js","export default function (ellipse, location) {\n const xRadius = ellipse.width / 2;\n const yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n const center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n const normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n const inEllipse = ((normalized.x * normalized.x) / (xRadius * xRadius)) + ((normalized.y * normalized.y) / (yRadius * yRadius)) <= 1.0;\n\n\n return inEllipse;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInEllipse.js","/**\n * This function is used to prevent selection from occuring when left click dragging on the image\n * @param e the event that is provided to your event handler\n * Based on: http://stackoverflow.com/questions/5429827/how-can-i-prevent-text-element-selection-with-cursor-drag\n * @returns {boolean}\n */\nexport default function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pauseEvent.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const storedPixelData = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * enabledElement.image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n const alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getRGBPixels.js","import external from '../externalModules.js';\n\nexport default function (points) {\n const page = external.cornerstoneMath.point.copy(points.page);\n const image = external.cornerstoneMath.point.copy(points.image);\n const client = external.cornerstoneMath.point.copy(points.client);\n const canvas = external.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page,\n image,\n client,\n canvas\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/copyPoints.js","let coordsData;\n\nfunction setCoords (eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords () {\n return coordsData;\n}\n\nconst toolCoordinates = {\n setCoords,\n getCoords\n};\n\nexport default toolCoordinates;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolCoordinates.js","import getHandleNearImagePoint from './getHandleNearImagePoint.js';\n\nfunction getActiveHandle (handles) {\n let activeHandle;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\nexport default function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n const activeHandle = getActiveHandle(handles);\n const nearbyHandle = getHandleNearImagePoint(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/handleActivator.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (e, data, toolData, toolType, options, doneMovingCallback) {\n const cornerstone = external.cornerstone;\n const mouseEventData = e.detail;\n const element = mouseEventData.element;\n\n function mouseDragCallback (e) {\n const eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback (e) {\n const eventData = e.detail;\n\n data.invalidated = true;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveAllHandles.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\nexport default function (element, timePoints, wrap) {\n const toolData = getToolState(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const timeSeriesData = toolData.data[0];\n const currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n const currentImageIdIndex = currentStack.currentImageIdIndex;\n let newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n const viewport = cornerstone.getViewport(element);\n const newStack = timeSeriesData.stacks[newStackIndex];\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n let loader;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n const imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/incrementTimePoint.js","import { planePlaneIntersection, projectPatientPointToImagePlane } from '../util/pointProjector.js';\n\n// Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner\n// Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but\n// That requires a bit more math and this works fine for most cases\nexport default function (targetImagePlane, referenceImagePlane) {\n const points = planePlaneIntersection(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: projectPatientPointToImagePlane(points.start, targetImagePlane),\n end: projectPatientPointToImagePlane(points.end, targetImagePlane)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/calculateReferenceLine.js","import external from '../externalModules.js';\nimport calculateReferenceLine from './calculateReferenceLine.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Renders the active reference line\nexport default function (context, eventData, targetElement, referenceElement) {\n const cornerstone = external.cornerstone;\n const targetImage = cornerstone.getEnabledElement(targetElement).image;\n const referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n const referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane ||\n !referenceImagePlane ||\n !targetImagePlane.rowCosines ||\n !targetImagePlane.columnCosines ||\n !targetImagePlane.imagePositionPatient ||\n !referenceImagePlane.rowCosines ||\n !referenceImagePlane.columnCosines ||\n !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = convertToVector3(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = convertToVector3(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = convertToVector3(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = convertToVector3(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n const targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n const referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n let angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) { // 0.5 radians = ~30 degrees\n return;\n }\n\n const referenceLine = calculateReferenceLine(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n const refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n const refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n const color = toolColors.getActiveColor();\n const lineWidth = toolStyle.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/renderActiveReferenceLine.js","import getOrientationString from './getOrientationString.js';\nimport invertOrientationString from './invertOrientationString.js';\n\nconst orientation = {\n getOrientationString,\n invertOrientationString\n};\n\nexport default orientation;\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/index.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { stackScroll } from '../stackTools/stackScroll.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (element, newImageIdIndex) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (toolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function doneCallback (image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch(error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n const eventData = {\n newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n const newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n const config = stackScroll.getConfiguration();\n\n if (config && config.retryLoadOnScroll === true) {\n // Const newImageLoadObject = cornerstone.imageCache.getImageLoadObject(newImageId);\n\n // TODO: No way to check state of Promise. No way to know if it is rejected.\n /* If (newImageLoadObject && newImagePromise.state() === 'rejected') {\n cornerstone.imageCache.removeImagePromise(newImageId);\n }*/\n }\n\n // Convert the preventCache value in stack data to a boolean\n const preventCache = Boolean(stackData.preventCache);\n\n let imagePromise;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n requestPoolManager.startGrabbing();\n\n triggerEvent(element, EVENTS.STACK_SCROLL, eventData);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scrollToIndex.js","import EVENTS from '../events.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport multiTouchDragTool from '../imageTools/multiTouchDragTool.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport scroll from '../util/scroll.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'stackScroll';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n const mouseDragEventData = {\n deltaY: 0\n };\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragEventData, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n const images = -eventData.direction;\n\n const config = stackScroll.getConfiguration();\n\n let loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n scroll(eventData.element, images, loop);\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n const config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n let pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n e.data.deltaY = e.data.deltaY || 0;\n e.data.deltaY += eventData.deltaPoints.page.y;\n if (Math.abs(e.data.deltaY) >= pixelsPerImage) {\n const imageDelta = e.data.deltaY / pixelsPerImage;\n const imageIdIndexOffset = Math.round(imageDelta);\n const imageDeltaMod = e.data.deltaY % pixelsPerImage;\n\n e.data.deltaY = imageDeltaMod;\n scroll(element, imageIdIndexOffset);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Module/private exports\nconst stackScroll = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst stackScrollWheel = mouseWheelTool(mouseWheelCallback);\n\nconst options = {\n eventData: {\n deltaY: 0\n }\n};\nconst stackScrollTouchDrag = touchDragTool(dragCallback, options);\n\nfunction multiTouchDragCallback (e) {\n const eventData = e.detail;\n const config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e);\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 3);\n }\n};\n\nconst stackScrollMultiTouch = multiTouchDragTool(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexport {\n stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScroll.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n const luminance = [];\n let index = 0;\n const pixelData = image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns) + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getLuminance.js","// http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\nexport default function (context, x, y, w, h) {\n const kappa = 0.5522848,\n ox = (w / 2) * kappa, // Control point offset horizontal\n oy = (h / 2) * kappa, // Control point offset vertical\n xe = x + w, // X-end\n ye = y + h, // Y-end\n xm = x + w / 2, // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawEllipse.js","export default function (context, start, color, lineWidth) {\n const handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawCircle.js","export default function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n const headLength = 10;\n\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawArrow.js","import pointInEllipse from './pointInEllipse.js';\n\nexport default function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n const point = {\n x,\n y\n };\n\n if (pointInEllipse(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateEllipseStatistics.js","import EVENTS from '../events.js';\n\nexport default function (keyDownCallback) {\n let configuration = {};\n\n return {\n activate (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n element.addEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/keyboardTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n const touchEventData = event.detail;\n const element = touchEventData.element;\n const cornerstone = external.cornerstone;\n\n function touchDragCallback (e) {\n const eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback);\n element.removeEventListener(EVENTS.TAP, touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n const handlesOutsideImage = anyHandlesOutsideImage(eventData, data.handles);\n\n if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n element.addEventListener(EVENTS.TOUCH_PINCH, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback);\n element.addEventListener(EVENTS.TAP, touchEndCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveAllHandles.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nconst runAnimation = {\n value: false\n};\n\nconst touchEndEvents = [\n EVENTS.TOUCH_END,\n EVENTS.TOUCH_DRAG_END,\n EVENTS.TOUCH_PINCH,\n EVENTS.TOUCH_PRESS,\n EVENTS.TAP\n];\n\nfunction animate (lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Update\n const time = (new Date()).getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n const distanceRemaining = Math.abs(handle.y - targetLocation.y);\n const linearDistEachFrame = distanceRemaining / 10;\n\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\nexport default function (event, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n const touchEventData = event.detail;\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n\n const time = (new Date()).getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const fingerDistance = -57;\n\n const aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n let targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n const currentPoints = eventData.currentPoints;\n const aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback (e) {\n const eventData = e.detail;\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n\n runAnimation.value = false;\n\n handle.active = false;\n element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n touchEndEvents.forEach((eventType) => {\n element.removeEventListener(eventType, touchEndCallback);\n });\n\n cornerstone.updateImage(element);\n\n if (e.type === EVENTS.TOUCH_PRESS) {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n touchEndEvents.forEach((eventType) => {\n element.addEventListener(eventType, touchEndCallback);\n });\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveHandle.js","// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nconst antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n };\n\nlet lastInteractionType,\n lastInteractionTime;\n\nfunction handleTap (type, e) {\n const now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nconst handleTapMouse = handleTap.bind(null, pointerType.mouse);\nconst handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.addEventListener(eventName, tapHandler);\n });\n}\n\nfunction removeEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.removeEventListener(eventName, tapHandler);\n });\n}\n\nconst mouseEvents = ['mousedown', 'mouseup'];\nconst touchEvents = ['touchstart', 'touchend'];\n\nfunction disable (element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable (element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nconst preventGhostClick = {\n enable,\n disable\n};\n\nexport default preventGhostClick;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/preventGhostClick.js","import EVENTS from '../events.js';\n\nexport default function (doubleTapCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n element.addEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nexport default function (mouseToolInterface, preventHandleOutsideImage) {\n const toolType = mouseToolInterface.toolType;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const element = mouseEventData.element;\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e) {\n const eventData = e.detail;\n\n toolCoordinates.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n const coords = eventData.currentPoints.canvas;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove () {\n data.active = false;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, toolType);\n\n let i;\n\n // Now check to see if there is a handle we can move\n const distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n const opt = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonRectangleTool.js","import EVENTS from '../events.js';\n\nexport default function (touchPinchCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n element.addEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchPinchTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nlet brushLayerId;\n\nexport default function brushTool (brushToolInterface) {\n const toolType = brushToolInterface.toolType;\n\n function mouseMoveCallback (e) {\n brushToolInterface.onMouseMove(e);\n }\n\n function mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n brushToolInterface.onMouseUp(e);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n }\n\n function dragCallback (e) {\n brushToolInterface.onDrag(e);\n\n return false;\n }\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n brushToolInterface.onMouseDown(e);\n\n return false;\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n }\n\n function onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n let pixelData;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n }\n\n const layer = external.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n\n brushToolInterface.onImageRendered(e);\n }\n\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n // TODO: Fix jQuery event\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const { width, height } = enabledElement.image;\n let pixelData = new Uint8ClampedArray(width * height);\n\n const configuration = brushTool.getConfiguration();\n let colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n const colormap = external.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n const labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: () => pixelData,\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height,\n width,\n pixelData,\n setPixelData: (data) => {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n let layer;\n const options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = external.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = external.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n external.cornerstone.updateImage(element);\n }\n\n function deactivate (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }\n\n const brushTool = mouseButtonTool({\n mouseMoveCallback,\n mouseDownActivateCallback,\n onImageRendered,\n deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brushTool.js","export default function getCircle (radius, rows, columns, xCoord = 0, yCoord = 0) {\n const x0 = Math.round(xCoord);\n const y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n const circleArray = [];\n let index = 0;\n\n for(let y = -radius; y <= radius; y++) {\n const yCoord = y0 + y;\n\n if (yCoord > rows || yCoord < 0) {\n continue;\n }\n\n for(let x = -radius; x <= radius; x++) {\n const xCoord = x0 + x;\n\n if (xCoord > columns || xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/getCircle.js","import external from '../externalModules.js';\n\nfunction drawBrushPixels (pointerArray, storedPixels, brushPixelValue, columns) {\n const getPixelIndex = (x, y) => (y * columns) + x;\n\n pointerArray.forEach((point) => {\n const spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas (pointerArray, canvasContext, color, element) {\n const canvasPtTL = external.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n const canvasPtBR = external.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n const sizeX = canvasPtBR.x - canvasPtTL.x;\n const sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach((point) => {\n const canvasPt = external.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexport { drawBrushPixels, drawBrushOnCanvas };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/drawBrush.js","export { default as external } from './externalModules.js';\n\nexport { default as referenceLines } from './referenceLines/index.js';\nexport { default as orientation } from './orientation/index.js';\n\nexport { default as requestPoolManager } from './requestPool/requestPoolManager.js';\n\nexport { default as setContextToDisplayFontSize } from './util/setContextToDisplayFontSize.js';\nexport { default as scrollToIndex } from './util/scrollToIndex.js';\nexport { default as scroll } from './util/scroll.js';\nexport { default as roundToDecimal } from './util/roundToDecimal.js';\nexport { projectPatientPointToImagePlane,\n imagePointToPatientPoint,\n planePlaneIntersection } from './util/pointProjector.js';\n\nexport { default as pointInsideBoundingBox } from './util/pointInsideBoundingBox.js';\nexport { default as pointInEllipse } from './util/pointInEllipse.js';\nexport { default as pauseEvent } from './util/pauseEvent.js';\nexport { default as isMouseButtonEnabled } from './util/isMouseButtonEnabled.js';\nexport { default as getRGBPixels } from './util/getRGBPixels.js';\nexport { getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice } from './util/getMaxSimultaneousRequests.js';\n\nexport { default as getLuminance } from './util/getLuminance.js';\nexport { default as drawTextBox } from './util/drawTextBox.js';\nexport { default as drawEllipse } from './util/drawEllipse.js';\nexport { default as drawCircle } from './util/drawCircle.js';\nexport { default as drawArrow } from './util/drawArrow.js';\nexport { default as copyPoints } from './util/copyPoints.js';\nexport { default as calculateSUV } from './util/calculateSUV.js';\nexport { default as calculateEllipseStatistics } from './util/calculateEllipseStatistics.js';\n\nexport { default as probeTool4D } from './timeSeriesTools/probeTool4D.js';\nexport { default as incrementTimePoint } from './timeSeriesTools/incrementTimePoint.js';\nexport { default as timeSeriesPlayer } from './timeSeriesTools/timeSeriesPlayer.js';\nexport { timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag } from './timeSeriesTools/timeSeriesScroll.js';\n\nexport { default as wwwcSynchronizer } from './synchronization/wwwcSynchronizer.js';\nexport { default as updateImageSynchronizer } from './synchronization/updateImageSynchronizer.js';\nexport { default as Synchronizer } from './synchronization/Synchronizer.js';\nexport { default as stackScrollSynchronizer } from './synchronization/stackScrollSynchronizer.js';\nexport { default as stackImagePositionSynchronizer } from './synchronization/stackImagePositionSynchronizer.js';\nexport { default as stackImagePositionOffsetSynchronizer } from './synchronization/stackImagePositionOffsetSynchronizer.js';\nexport { default as stackImageIndexSynchronizer } from './synchronization/stackImageIndexSynchronizer.js';\nexport { default as panZoomSynchronizer } from './synchronization/panZoomSynchronizer.js';\n\nexport { default as toolStyle } from './stateManagement/toolStyle.js';\nexport { addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager } from './stateManagement/toolState.js';\nexport { default as toolCoordinates } from './stateManagement/toolCoordinates.js';\nexport { default as toolColors } from './stateManagement/toolColors.js';\nexport { addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager } from './stateManagement/timeSeriesSpecificStateManager.js';\nexport { default as textStyle } from './stateManagement/textStyle.js';\n\nexport { stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager } from './stateManagement/stackSpecificStateManager.js';\n\nexport { default as loadHandlerManager } from './stateManagement/loadHandlerManager.js';\n\nexport { newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager } from './stateManagement/imageIdSpecificStateManager.js';\n\nexport { newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager } from './stateManagement/frameOfReferenceStateManager.js';\n\nexport { default as appState } from './stateManagement/appState.js';\n\nexport { default as stackScrollKeyboard } from './stackTools/stackScrollKeyboard.js';\n\nexport { stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch } from './stackTools/stackScroll.js';\n\nexport { default as stackPrefetch } from './stackTools/stackPrefetch.js';\nexport { default as scrollIndicator } from './stackTools/scrollIndicator.js';\nexport { default as stackRenderers } from './stackTools/stackRenderers.js';\nexport { playClip, stopClip } from './stackTools/playClip.js';\n\nexport { default as anyHandlesOutsideImage } from './manipulators/anyHandlesOutsideImage.js';\nexport { default as drawHandles } from './manipulators/drawHandles.js';\nexport { default as getHandleNearImagePoint } from './manipulators/getHandleNearImagePoint.js';\nexport { default as handleActivator } from './manipulators/handleActivator.js';\nexport { default as moveAllHandles } from './manipulators/moveAllHandles.js';\nexport { default as moveHandle } from './manipulators/moveHandle.js';\nexport { default as moveNewHandle } from './manipulators/moveNewHandle.js';\nexport { default as moveNewHandleTouch } from './manipulators/moveNewHandleTouch.js';\nexport { default as touchMoveAllHandles } from './manipulators/touchMoveAllHandles.js';\nexport { default as touchMoveHandle } from './manipulators/touchMoveHandle.js';\n\nexport { default as keyboardInput } from './inputSources/keyboardInput.js';\nexport { default as mouseInput } from './inputSources/mouseInput.js';\nexport { default as mouseWheelInput } from './inputSources/mouseWheelInput.js';\nexport { default as preventGhostClick } from './inputSources/preventGhostClick.js';\nexport { default as touchInput } from './inputSources/touchInput.js';\n\n\nexport { angle, angleTouch } from './imageTools/angleTool.js';\nexport { arrowAnnotate, arrowAnnotateTouch } from './imageTools/arrowAnnotate.js';\nexport { crosshairs, crosshairsTouch } from './imageTools/crosshairs.js';\nexport { default as displayTool } from './imageTools/displayTool.js';\nexport { default as doubleTapTool } from './imageTools/doubleTapTool.js';\nexport { default as doubleTapZoom } from './imageTools/doubleTapZoom.js';\nexport { dragProbe, dragProbeTouch } from './imageTools/dragProbe.js';\n\nexport { ellipticalRoi, ellipticalRoiTouch } from './imageTools/ellipticalRoi.js';\nexport { freehand } from './imageTools/freehand.js';\n\nexport { highlight, highlightTouch } from './imageTools/highlight.js';\nexport { default as imageStats } from './imageTools/imageStats.js';\nexport { default as keyboardTool } from './imageTools/keyboardTool.js';\nexport { length, lengthTouch } from './imageTools/length.js';\nexport { magnify, magnifyTouchDrag } from './imageTools/magnify.js';\nexport { default as mouseButtonRectangleTool } from './imageTools/mouseButtonRectangleTool.js';\nexport { default as mouseButtonTool } from './imageTools/mouseButtonTool.js';\nexport { default as mouseWheelTool } from './imageTools/mouseWheelTool.js';\nexport { default as multiTouchDragTool } from './imageTools/multiTouchDragTool.js';\nexport { default as orientationMarkers } from './imageTools/orientationMarkers.js';\n\nexport { pan, panTouchDrag } from './imageTools/pan.js';\nexport { default as panMultiTouch } from './imageTools/panMultiTouch.js';\nexport { probe, probeTouch } from './imageTools/probe.js';\nexport { rectangleRoi, rectangleRoiTouch } from './imageTools/rectangleRoi.js';\nexport { rotate, rotateTouchDrag } from './imageTools/rotate.js';\nexport { default as rotateTouch } from './imageTools/rotateTouch.js';\nexport { default as saveAs } from './imageTools/saveAs.js';\nexport { seedAnnotate, seedAnnotateTouch } from './imageTools/seedAnnotate.js';\nexport { simpleAngle, simpleAngleTouch } from './imageTools/simpleAngle.js';\nexport { default as simpleMouseButtonTool } from './imageTools/simpleMouseButtonTool.js';\nexport { textMarker, textMarkerTouch } from './imageTools/textMarker.js';\n\nexport { default as touchDragTool } from './imageTools/touchDragTool.js';\nexport { default as touchPinchTool } from './imageTools/touchPinchTool.js';\nexport { default as touchTool } from './imageTools/touchTool.js';\nexport { wwwc, wwwcTouchDrag } from './imageTools/wwwc.js';\nexport { wwwcRegion, wwwcRegionTouch } from './imageTools/wwwcRegion.js';\nexport { zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag } from './imageTools/zoom.js';\nexport { brush } from './paintingTools/brush.js';\nexport { adaptiveBrush } from './paintingTools/adaptiveBrush.js';\nexport { default as version } from './version.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import calculateReferenceLine from './calculateReferenceLine.js';\nimport tool from './referenceLinesTool.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst referenceLines = {\n calculateReferenceLine,\n tool,\n renderActiveReferenceLine\n};\n\nexport default referenceLines;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/index.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst toolType = 'referenceLines';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n const renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach((referenceEnabledElement) => {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable (element, synchronizationContext, renderer) {\n renderer = renderer || renderActiveReferenceLine;\n\n addToolState(element, toolType, {\n synchronizationContext,\n renderer\n });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nconst tool = {\n enable,\n disable\n};\n\nexport default tool;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/referenceLinesTool.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nexport default function (vector) {\n const vec3 = convertToVector3(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n let orientation = '';\n const orientationX = vec3.x < 0 ? 'R' : 'L';\n const orientationY = vec3.y < 0 ? 'A' : 'P';\n const orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n const abs = new external.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (let i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/getOrientationString.js","export default function (string) {\n let inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/invertOrientationString.js","import external from '../externalModules.js';\n\n/**\n * Sets the canvas context transformation matrix so it is scaled to show text\n * more cleanly even if the image is scaled up. See\n * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText\n * for more information\n *\n * @param enabledElement\n * @param context\n * @param fontSize\n * @returns {{fontSize: number, lineHeight: number, fontScale: number}}\n */\nexport default function (enabledElement, context, fontSize) {\n const fontScale = 0.1;\n\n external.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n const scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n const lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n\n return {\n fontSize: scaledFontSize,\n lineHeight,\n fontScale\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/setContextToDisplayFontSize.js","import external from '../externalModules.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport MeasurementManager from '../measurementManager/measurementManager.js';\nimport LineSampleMeasurement from '../measurementManager/lineSampleMeasurement.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nconst toolType = 'probe4D';\n\nfunction updateLineSample (measurementData) {\n const cornerstone = external.cornerstone;\n const samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n let loader;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n const offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n const sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const timeSeriestoolData = getToolState(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n const timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n timeSeries,\n lineSample: new LineSampleMeasurement(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n MeasurementManager.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e) {\n const cornerstone = external.cornerstone;\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = 'white';\n const font = textStyle.getFont();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n const data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n drawHandles(context, eventData, data.handles, color);\n context.stroke();\n\n context.font = font;\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.fillStyle = color;\n\n drawTextBox(context, `${data.handles.end.x}, ${data.handles.end.y}`, textCoords.x, textCoords.y, color);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probeTool4D = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n toolType\n});\n\nexport default probeTool4D;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/probeTool4D.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nfunction MeasurementManager () {\n const cornerstone = external.cornerstone;\n const that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n const index = that.measurements.push(measurement);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_ADDED, eventDetail);\n };\n\n this.remove = function (index) {\n const measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_REMOVED, eventDetail);\n };\n\n}\n\n// Module/private exports\nconst manager = new MeasurementManager();\n\nexport default manager;\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/measurementManager.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nexport default function () {\n const cornerstone = external.cornerstone;\n const that = this;\n\n that.samples = [];\n\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n triggerEvent(cornerstone.events, EVENTS.LINE_SAMPLE_UPDATED);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/lineSampleMeasurement.js","import { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport incrementTimePoint from './incrementTimePoint.js';\n\nconst toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n const timeSeriesToolData = getToolState(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n const playClipToolData = getToolState(element, toolType);\n let playClipData;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n incrementTimePoint(element, 1, true);\n } else {\n incrementTimePoint(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n const playClipData = playClipToolData.data[0];\n\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nconst timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexport default timeSeriesPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesPlayer.js","import EVENTS from '../events.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport incrementTimePoint from './incrementTimePoint.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'timeSeriesScroll';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n setToolOptions(toolType, element, options);\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n const toolData = getToolState(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n const timeSeriesData = toolData.data[0];\n\n let pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n const timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n const timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n const images = -eventData.direction;\n\n incrementTimePoint(eventData.element, images);\n}\n\nfunction onDrag (e) {\n const mouseMoveData = e.originalEvent.detail;\n const eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n const toolData = getToolState(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n const timeSeriesDelta = eventData.deltaY / 3;\n const timeSeriesDeltaMod = eventData.deltaY % 3;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nconst timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst timeSeriesScrollWheel = mouseWheelTool(mouseWheelCallback);\nconst timeSeriesScrollTouchDrag = touchDragTool(onDrag);\n\nexport {\n timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesScroll.js","import external from '../externalModules.js';\n\n// This function synchronizes the target element ww/wc to match the source element\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/wwwcSynchronizer.js","import external from '../externalModules.js';\n\n// This function causes the target image to be drawn immediately\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n external.cornerstone.updateImage(targetElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/updateImageSynchronizer.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nfunction unique (array) {\n return array.filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n}\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer (event, handler) {\n const cornerstone = external.cornerstone;\n const that = this;\n const sourceElements = []; // Source elements fire the events we want to synchronize to\n const targetElements = []; // Target elements we want to synchronize to source elements\n\n let ignoreFiredEvents = false;\n const initialData = {};\n let eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n const targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n const targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n const targetImagePosition = convertToVector3(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent (sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n const targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n const targetImageId = initialData.imageIds.targetElements[targetIndex];\n const sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n const sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n let positionDifference;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent (e) {\n const eventData = e.detail;\n\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n const index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n element.addEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n const index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n const index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n element.removeEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n const index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler (e) {\n const element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n const elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener(EVENTS.ELEMENT_DISABLED, disableHandler);\n element.addEventListener(EVENTS.ELEMENT_DISABLED, disableHandler);\n });\n };\n\n this.destroy = function () {\n const elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexport default Synchronizer;\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/Synchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes any scrolling actions within the stack to propagate to\n// All of the other viewports that are synced\nexport default function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the stack of the target viewport\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n let newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackScrollSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n stackData.imageIds.forEach((imageId, index) => {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\n\n// In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable.\n\nexport default function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n const finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionOffsetSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceStackToolDataSource = getToolState(sourceElement, 'stack');\n const sourceStackData = sourceStackToolDataSource.data[0];\n const targetStackToolDataSource = getToolState(targetElement, 'stack');\n const targetStackData = targetStackToolDataSource.data[0];\n\n let newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImageIndexSynchronizer.js","import external from '../externalModules.js';\n\n// This function synchronizes the target zoom and pan to match the source\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/panZoomSynchronizer.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager (toolTypes, oldStateManager) {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n const imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n\n return imageIdToolStateManager;\n}\n\nconst timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager (element, tools) {\n tools = tools || ['timeSeries'];\n let oldStateManager = getElementToolStateManager(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n const timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n setElementToolStateManager(element, timeSeriesSpecificStateManager);\n}\n\nexport {\n addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/timeSeriesSpecificStateManager.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager (toolTypes, oldStateManager) {\n let toolState = {};\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n\n }\n\n const stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n\n\n return stackSpecificToolStateManager;\n}\n\nconst stackStateManagers = [];\n\nfunction addStackStateManager (element, otherTools) {\n let oldStateManager = getElementToolStateManager(element);\n\n if (!oldStateManager) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n let stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n const stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n setElementToolStateManager(element, stackSpecificStateManager);\n}\n\nconst stackSpecificStateManager = {\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\nexport {\n stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/stackSpecificStateManager.js","// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager () {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState (frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nconst globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexport {\n newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/frameOfReferenceStateManager.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager } from './toolState.js';\n\nfunction saveApplicationState (elements) {\n // Save imageId-specific tool state data\n const appState = {\n imageIdToolState: globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = external.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState (appState) {\n if (!appState.hasOwnProperty('imageIdToolState') ||\n !appState.hasOwnProperty('elementToolState') ||\n !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n\n // Restore all the imageId specific tool data\n globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n const element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n const savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nconst appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexport default appState;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/appState.js","import scroll from '../util/scroll.js';\nimport keyboardTool from '../imageTools/keyboardTool.js';\n\nconst keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback (e) {\n const eventData = e.detail;\n const keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n let images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n scroll(eventData.element, images);\n}\n\n// Module/private exports\nconst stackScrollKeyboard = keyboardTool(keyDownCallback);\n\nexport default stackScrollKeyboard;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScrollKeyboard.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst toolType = 'stackPrefetch';\nconst requestType = 'prefetch';\n\nlet configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nlet resetPrefetchTimeout;\nconst resetPrefetchDelay = 10;\n\nfunction range (lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n const arr = [];\n let c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nconst max = function (arr) {\n return Math.max.apply(null, arr);\n};\n\nconst min = function (arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex (arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n const l = [];\n const h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch (element) {\n // Check to make sure stack data exists\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n const stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList (imageIdIndex) {\n const index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) { // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort((a, b) => (a - b));\n const indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n const imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n requestPoolManager.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n const nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n let imageId;\n let nextImageIdIndex;\n const preventCache = false;\n\n function doneCallback (image) {\n // Console.log('prefetch done: ' + image.imageId);\n const imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function failCallback (error) {\n console.log(`prefetch errored: ${error}`);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n let lowerIndex = nearest.low;\n let higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n const currentIndex = stack.currentImageIdIndex;\n const shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n const shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n const shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n const shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n requestPoolManager.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler (element) {\n return function (e) {\n const eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n let stackData;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = getToolState(element, 'stack');\n } catch(error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated (e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n const element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch(error) {\n return;\n }\n\n }, resetPrefetchDelay);\n}\n\nfunction enable (element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n const stackPrefetchDataArray = getToolState(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n const stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n const indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n addToolState(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n element.addEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n external.cornerstone.events.addEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n}\n\nfunction disable (element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n\n const stackPrefetchData = getToolState(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n requestPoolManager.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n setMaxSimultaneousRequests(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nconst stackPrefetch = {\n enable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nexport default stackPrefetch;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackPrefetch.js","import displayTool from '../imageTools/displayTool.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nconst scrollBarHeight = 6;\n\nconst configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const width = eventData.enabledElement.canvas.width;\n const height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n const context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n const config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const imageIds = stackData.data[0].imageIds;\n const currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n const cursorWidth = width / imageIds.length;\n const cursorHeight = height / imageIds.length;\n const xPosition = cursorWidth * currentImageIdIndex;\n const yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nconst scrollIndicator = displayTool(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexport default scrollIndicator;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/scrollIndicator.js","import FusionRenderer from './fusionRenderer.js';\n\nconst stackRenderers = {};\n\nstackRenderers.FusionRenderer = FusionRenderer;\n\nexport default stackRenderers;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackRenderers.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default class FusionRenderer {\n constructor () {\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n render (element, imageStacks) {\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n const toolData = getToolState(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n const cornerstone = external.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n const baseImageObject = imageStacks[0];\n const currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n const overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then((baseImage) => {\n let baseLayerId = this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach((imgObj, overlayLayerIndex) => {\n const imageId = this.findImageFn(imgObj.imageIds, currentImageId);\n const layerIndex = overlayLayerIndex + 1;\n let currentLayerId = this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then((image) => {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/fusionRenderer.js","/* eslint no-bitwise:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nconst toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\nfunction getPlayClipTimeouts (vector, speed) {\n\n let i;\n let sample;\n let delay;\n let sum = 0;\n const limit = vector.length;\n const timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = (Number(vector[i]) / speed) | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) { // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = (sum / timeouts.length) | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData (playClipData) {\n const id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent (element) {\n const eventDetail = {\n element\n };\n\n triggerEvent(element, EVENTS.CLIP_STOPPED, eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n let playClipData;\n let playClipTimeouts;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n const stackToolData = getToolState(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (stackToolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = stackToolData.data[0];\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (\n playClipData.ignoreFrameTimeVector !== true &&\n playClipData.frameTimeVector &&\n playClipData.frameTimeVector.length === stackData.imageIds.length\n ) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n const playClipAction = () => {\n\n // Hoisting of context variables\n let loader,\n startLoadingHandler,\n endLoadingHandler,\n errorLoadingHandler,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n const imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n\n }\n\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler () {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n\n}\n\nexport {\n playClip,\n stopClip\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/playClip.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet mouseX;\nlet mouseY;\n\nfunction keyPress (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n const keyPressData = {\n event: window.event || e, // Old IE support\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n const keyPressEvents = {\n keydown: EVENTS.KEY_DOWN,\n keypress: EVENTS.KEY_PRESS,\n keyup: EVENTS.KEY_UP\n };\n\n triggerEvent(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove (e) {\n mouseX = e.pageX;\n mouseY = e.pageY;\n}\n\nconst keyboardEvents = ['keydown', 'keypress', 'keyup'];\n\nfunction enable (element) {\n keyboardEvents.forEach((eventType) => {\n element.removeEventListener(eventType, keyPress);\n element.addEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n element.addEventListener('mousemove', mouseMove);\n}\n\nfunction disable (element) {\n keyboardEvents.forEach((eventType) => {\n element.removeEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n}\n\n// Module exports\nconst keyboardInput = {\n enable,\n disable\n};\n\nexport default keyboardInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/keyboardInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet isClickEvent = true;\nlet preventClickTimeout;\nconst clickDelay = 200;\n\nfunction getEventWhich (event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler () {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_DOUBLE_CLICK;\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n const lastPoints = copyPoints(startPoints);\n\n\n /* Note: It seems we can't trust MouseEvent.buttons for dblclick events?\n\n For some reason they are always firing with e.buttons = 0\n so we have to use e.which for now instead.\n\n Might be related to using preventDefault on the original mousedown or click events?\n */\n const eventData = {\n event: e,\n which: e.which,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\nfunction mouseDown (e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_DOWN;\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n element.removeEventListener('mousemove', mouseMove);\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n const eventPropagated = triggerEvent(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = EVENTS.MOUSE_DOWN_ACTIVATE;\n triggerEvent(eventData.element, EVENTS.MOUSE_DOWN_ACTIVATE, eventData);\n }\n\n const whichMouseButton = getEventWhich(e);\n\n function onMouseMove (e) {\n // Calculate our current points in page and image coordinates\n const eventType = EVENTS.MOUSE_DRAG;\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n\n // Prevent left click selection of DOM elements\n return pauseEvent(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp (e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n let eventType = EVENTS.MOUSE_UP;\n\n if (isClickEvent) {\n eventType = EVENTS.MOUSE_CLICK;\n }\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.addEventListener('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n\n return pauseEvent(e);\n}\n\nfunction mouseMove (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_MOVE;\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n}\n\nfunction disable (element) {\n element.removeEventListener('mousedown', mouseDown);\n element.removeEventListener('mousemove', mouseMove);\n element.removeEventListener('dblclick', mouseDoubleClick);\n}\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n element.addEventListener('mousedown', mouseDown);\n element.addEventListener('mousemove', mouseMove);\n element.addEventListener('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nconst mouseInput = {\n enable,\n disable\n};\n\nexport default mouseInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction mouseWheel (e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.type === 'mousewheel' && e.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.type === 'DOMMouseScroll' && e.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n let x;\n let y;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n const startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = (window.event && window.event.wheelDelta) ? window.event : e; // Old IE support\n\n let wheelDelta;\n\n if (e.wheelDelta) {\n wheelDelta = -e.wheelDelta;\n } else if (e.deltaY) {\n wheelDelta = -e.deltaY;\n } else if (e.detail) {\n wheelDelta = -e.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n const direction = wheelDelta < 0 ? -1 : 1;\n\n const mouseWheelData = {\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n triggerEvent(element, EVENTS.MOUSE_WHEEL, mouseWheelData);\n}\n\nconst mouseWheelEvents = ['mousewheel', 'DOMMouseScroll'];\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n mouseWheelEvents.forEach((eventType) => {\n element.addEventListener(eventType, mouseWheel);\n });\n}\n\nfunction disable (element) {\n mouseWheelEvents.forEach((eventType) => {\n element.removeEventListener(eventType, mouseWheel);\n });\n}\n\n// Module exports\nconst mouseWheelInput = {\n enable,\n disable\n};\n\nexport default mouseWheelInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseWheelInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport preventGhostClick from '../inputSources/preventGhostClick.js';\nimport triggerEvent from '../util/triggerEvent.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nlet startPoints,\n currentPoints,\n lastPoints,\n deltaPoints,\n eventData,\n touchStartDelay,\n pressTimeout,\n pageDistanceMoved;\n\nlet lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta;\n\nconst pressDelay = 700,\n pressMaxDistance = 5;\n\nconst toolType = 'touchInput';\n\nfunction onTouch (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget || e.srcEvent.currentTarget;\n let eventType,\n scaleChange,\n delta,\n remainingPointers,\n rotation;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if ((e.pointers && e.pointers.length > 1) || (e.touches && e.touches.length > 1)) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = EVENTS.TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = EVENTS.DOUBLE_TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_PINCH;\n eventData = {\n event: e,\n startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_START;\n if (e.touches.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_START;\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n const eventPropagated = triggerEvent(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = EVENTS.TOUCH_START_ACTIVE;\n if (e.touches.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_START_ACTIVE;\n }\n\n eventData.type = eventType;\n triggerEvent(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = copyPoints(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_PRESS;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),\n client: {\n x: e.changedTouches[0].clientX,\n y: e.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_END;\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = EVENTS.TOUCH_DRAG;\n if (e.pointers.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_DRAG;\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = EVENTS.TOUCH_DRAG_END;\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return pauseEvent(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = EVENTS.TOUCH_ROTATE;\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n rotation,\n type: eventType\n };\n triggerEvent(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable (element) {\n disable(element);\n const Hammer = external.Hammer;\n\n const hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n const mc = new Hammer.Manager(element, hammerOptions);\n\n const panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n const pan = new Hammer.Pan(panOptions);\n const pinch = new Hammer.Pinch({\n threshold: 0\n });\n const rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n const doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n preventGhostClick.enable(element);\n\n const touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach((eventType) => {\n element.addEventListener(eventType, onTouch);\n });\n\n const options = getToolOptions(toolType, element);\n\n options.hammer = mc;\n\n setToolOptions(toolType, element, options);\n}\n\nfunction disable (element) {\n preventGhostClick.disable(element);\n\n const touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach((eventType) => {\n element.removeEventListener(eventType, onTouch);\n });\n\n const options = getToolOptions(toolType, element);\n const mc = options.hammer;\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nconst touchInput = {\n enable,\n disable\n};\n\nexport default touchInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/touchInput.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = angle.getConfiguration();\n const cornerstone = external.cornerstone;\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n let handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n let handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n drawHandles(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n const dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n const dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n const dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n const dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n let angle = Math.acos(Math.abs(((dx1 * dx2) + (dy1 * dy2)) / (Math.sqrt((dx1 * dx1) + (dy1 * dy1)) * Math.sqrt((dx2 * dx2) + (dy2 * dy2)))));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n const textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n const textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n drawTextBox(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst angle = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst angleTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n angle,\n angleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/angleTool.js","/* eslint no-alert:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawArrow from '../util/drawArrow.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const element = mouseEventData.element;\n const measurementData = createNewMeasurement(mouseEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(element);\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (eventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const enabledElement = eventData.enabledElement;\n const cornerstone = external.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = arrowAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the arrow\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n drawArrow(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n drawArrow(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(data.text).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const element = touchEventData.element;\n const measurementData = createNewMeasurement(touchEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n addToolState(element, toolType, measurementData);\n element.removeEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n const options = getToolOptions(toolType, element);\n let data;\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst arrowAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nconst arrowAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport { arrowAnnotate, arrowAnnotateTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/arrowAnnotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState, clearToolState } from '../stateManagement/toolState.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { imagePointToPatientPoint } from '../util/pointProjector.js';\nimport convertToVector3 from '../util/convertToVector3.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'crosshairs';\n\nfunction chooseLocation (e) {\n const eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n const cornerstone = external.cornerstone;\n const sourceElement = e.currentTarget;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n const sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n const patientPoint = imagePointToPatientPoint(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n const stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const row = convertToVector3(imagePlane.rowCosines);\n const column = convertToVector3(imagePlane.columnCosines);\n const normal = column.clone().cross(row.clone());\n const distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction mouseDragCallback (e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enable (element, mouseButtonMask, synchronizationContext) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Module/private exports\nconst crosshairs = {\n activate: enable,\n deactivate: disable,\n enable,\n disable\n};\n\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n}\n\nfunction dragStartCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n chooseLocation(e);\n\n return false;\n}\n\nfunction dragCallback (e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enableTouch (element, synchronizationContext) {\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback);\n\n element.addEventListener(EVENTS.TOUCH_START, dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch (element) {\n element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback);\n}\n\nconst crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexport {\n crosshairs,\n crosshairsTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/crosshairs.js","import external from '../externalModules.js';\nimport doubleTapTool from './doubleTapTool.js';\n\nfunction fitToWindowStrategy (eventData) {\n external.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback (e) {\n const eventData = e.detail;\n\n doubleTapZoom.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst doubleTapZoom = doubleTapTool(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexport default doubleTapZoom;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapZoom.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'dragProbe';\n\nlet dragEventData;\n\nfunction defaultStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const x = Math.round(eventData.currentPoints.image.x);\n const y = Math.round(eventData.currentPoints.image.y);\n\n let storedPixels;\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n text = `${x}, ${y}`;\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]} A: ${storedPixels[3]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n // Draw text\n const coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n let toolCoords;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() / 2);\n }\n\n let storedPixels;\n let text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 ||\n toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = getRGBPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n text = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n\n const modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += `HU: ${modalityPixelValueText}`;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n const suv = calculateSUV(eventData.image, sp);\n\n if (suv) {\n text += ` SUV: ${parseFloat(suv.toFixed(2))}`;\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n const textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n let translation;\n const handleRadius = 6;\n const width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -textStyle.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(textStyle.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n drawTextBox(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n dragProbe.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction imageRenderedCallback () {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n dragEventData = eventData;\n external.cornerstone.updateImage(element);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst dragProbe = simpleMouseButtonTool(mouseDownCallback, toolType);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nconst options = {\n fireOnTouchStart: true\n};\n\nconst dragProbeTouch = touchDragTool(dragCallback, options);\n\nexport {\n dragProbe,\n dragProbeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/dragProbe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport drawEllipse from '../util/drawEllipse.js';\nimport pointInEllipse from '../util/pointInEllipse.js';\nimport calculateEllipseStatistics from '../util/calculateEllipseStatistics.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse (element, data, coords, distance) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n const majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n const pointInMinorEllipse = pointInEllipse(minorEllipse, coords);\n const pointInMajorEllipse = pointInEllipse(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool (element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch (element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = ellipticalRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n drawEllipse(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateEllipseStatistics(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst ellipticalRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst ellipticalRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType\n});\n\nexport { ellipticalRoi, ellipticalRoiTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/ellipticalRoi.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'freehand';\nlet configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n const data = toolData.data[config.currentTool];\n\n const handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle (eventData, toolIndex) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n const mousePoint = eventData.currentPoints.canvas;\n\n for (let i = 0; i < data.handles.length; i++) {\n const handleCanvas = external.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (external.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n let handleNearby;\n\n for (let toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby,\n toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n\n // Check if drawing is finished\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback (e) {\n const eventData = e.detail;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n let x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n let y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n const currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n const lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n const lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n const handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < (data.handles.length - 1)) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing (eventData) {\n const element = eventData.element;\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n\n const measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n const config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n addToolState(eventData.element, toolType, measurementData);\n\n const toolData = getToolState(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing (eventData, handleNearby) {\n const element = eventData.element;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n const toolData = getToolState(eventData.element, toolType);\n\n let handleNearby, toolIndex;\n\n const config = freehand.getConfiguration();\n const currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n const nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n let fillColor = toolColors.getFillColor();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n fillColor = toolColors.getFillColor();\n } else {\n color = toolColors.getToolColor();\n fillColor = toolColors.getToolColor();\n }\n\n let handleStart;\n\n if (data.handles.length) {\n for (let j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (let k = 0; k < data.handles[j].lines.length; k++) {\n const lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n const mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === (data.handles.length - 1)) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n const options = {\n fill: fillColor\n };\n\n if (data.active) {\n drawHandles(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n drawHandles(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n\n// /////// END IMAGE RENDERING ///////\nfunction enable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module/private exports\nconst freehand = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration\n};\n\nexport { freehand };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/freehand.js","import external from '../externalModules.js';\nimport mouseButtonRectangleTool from './mouseButtonRectangleTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n const existingToolData = getToolState(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n let insideBox = false;\n\n if ((coords.x >= rect.left && coords.x <= (rect.left + rect.width)) && coords.y >= rect.top && coords.y <= (rect.top + rect.height)) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this elemen\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n\n context.save();\n\n const data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n drawHandles(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst preventHandleOutsideImage = true;\n\nconst highlight = mouseButtonRectangleTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nconst highlightTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nexport {\n highlight,\n highlightTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/highlight.js","import displayTool from './displayTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const image = eventData.image;\n const stats = image.stats;\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n const text = `${key} : ${stats[key]}`;\n\n textLines.push(text);\n });\n\n drawTextBox(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nconst imageStats = displayTool(onImageRendered);\n\nexport default imageStats;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/imageStats.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n const { image, element } = eventData;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = length.getConfiguration();\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n let rowPixelSpacing;\n let colPixelSpacing;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n const color = toolColors.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n const dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n const dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n const length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n let suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n const text = `${length.toFixed(2)}${suffix}`;\n\n if (!data.handles.textBox.hasMoved) {\n const coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst length = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst lengthTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n length,\n lengthTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/length.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getBrowserInfo } from '../util/getMaxSimultaneousRequests.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'magnify';\n\nlet configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nlet browserName;\n\nlet currentPoints;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool (eventData) {\n const element = eventData.element;\n\n element.querySelector('.magnifyTool').style.display = 'none';\n\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n drawMagnificationTool(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction newImageCallback (e) {\n const eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, dragEndCallback);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, dragEndCallback);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool (eventData) {\n const element = eventData.element;\n const magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n const config = magnify.getConfiguration();\n\n const magnifySize = config.magnifySize;\n const magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n const canvas = element.querySelector('canvas:not(.magnifyTool)');\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n const getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n const canvasLocation = external.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n const copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n const scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = `${canvasLocation.y - 0.5 * magnifySize}px`;\n magnifyCanvas.style.left = `${canvasLocation.x - 0.5 * magnifySize}px`;\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas (element) {\n // If the magnifying glass canvas doesn't already exist\n if (element.querySelector('.magnifyTool') === null) {\n // Create a canvas and append it as a child to the element\n const magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n const config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas (element) {\n const magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (magnifyCanvas) {\n element.removeChild(magnifyCanvas);\n }\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable (element) {\n if (!browserName) {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst magnify = {\n enable,\n activate,\n deactivate: disable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nconst options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nconst magnifyTouchDrag = touchDragTool(dragCallback, options);\n\nexport {\n magnify,\n magnifyTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/magnify.js","import external from '../externalModules.js';\nimport orientation from '../orientation/index.js';\nimport displayTool from './displayTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction getOrientationMarkers (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n const imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n const rowString = orientation.getOrientationString(imagePlaneMetaData.rowCosines);\n const columnString = orientation.getOrientationString(imagePlaneMetaData.columnCosines);\n\n const oppositeRowString = orientation.invertOrientationString(rowString);\n const oppositeColumnString = orientation.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n let coords;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n const top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n const bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n const left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n const right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top,\n bottom,\n left,\n right\n };\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n const markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n const coords = getOrientationMarkerPositions(element, markers);\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getToolColor();\n\n const textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n drawTextBox(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n drawTextBox(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n const config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n drawTextBox(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n drawTextBox(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst orientationMarkers = displayTool(onImageRendered);\n\nexport default orientationMarkers;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/orientationMarkers.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'pan';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n let widthScale = eventData.viewport.scale;\n let heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= (eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing);\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= (eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing);\n }\n\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / widthScale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / heightScale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst pan = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst panTouchDrag = touchDragTool(dragCallback);\n\nexport {\n pan,\n panTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/pan.js","import external from '../externalModules.js';\nimport multiTouchDragTool from './multiTouchDragTool.js';\n\nfunction touchPanCallback (e) {\n const eventData = e.detail;\n const config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 2);\n }\n};\n\nconst panMultiTouch = multiTouchDragTool(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexport default panMultiTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/panMultiTouch.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n const endCanvas = external.cornerstone.pixelToCanvas(element, data.handles.end);\n\n\n return external.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n\n for (let i = 0; i < toolData.data.length; i++) {\n\n context.save();\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the handles\n drawHandles(context, eventData, data.handles, color);\n\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n let storedPixels;\n\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = `${x}, ${y}`;\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probe = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst probeTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n probe,\n probeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/probe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = rectangleRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = (ellipse.width * columnPixelSpacing) * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst rectangleRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst rectangleRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n rectangleRoi,\n rectangleRoiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rectangleRoi.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'rotate';\n\n// --- Strategies --- //\nfunction defaultStrategy (eventData) {\n // Calculate distance from the center of the image\n const rect = eventData.element.getBoundingClientRect(eventData.element);\n\n const points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n const width = eventData.element.clientWidth;\n const height = eventData.element.clientHeight;\n\n const pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n const rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n const rotationDegrees = rotationRadians * (180 / Math.PI);\n const rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n rotate.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst rotate = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nconst rotateTouchDrag = touchDragTool(dragCallback);\n\nexport {\n rotate,\n rotateTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\n\nfunction touchRotateCallback (e) {\n const eventData = e.detail;\n\n eventData.viewport.rotation += eventData.rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable (element) {\n element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n}\n\nfunction activate (element) {\n element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n element.addEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n}\n\nconst rotateTouch = {\n activate,\n disable\n};\n\nexport default rotateTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotateTouch.js","export default function saveAs (element, filename, mimetype = 'image/png') {\n // Setting the default value for mimetype to image/png\n const canvas = element.querySelector('canvas');\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n const lnk = document.createElement('a');\n\n // The key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // Convert canvas content to data-uri for link. When download\n // Attribute is set the content pointed to by link will be\n // Pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n const e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n } else if (lnk.fireEvent) {\n lnk.fireEvent('onclick');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/saveAs.js","/* eslint no-alert:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawCircle from '../util/drawCircle.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n const realCoords = external.cornerstone.pixelToCanvas(element, data.handles.end);\n const distanceToPoint = external.cornerstoneMath.point.distance(realCoords, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n const canvasWidth = eventData.canvasContext.canvas.width;\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = seedAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw\n const handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n drawCircle(context, handleCanvas, color, lineWidth);\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n let textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = `${data.text} x: ${Math.round(data.handles.end.x)\n } y: ${Math.round(data.handles.end.y)}`;\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(textPlusCoords).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > (canvasWidth / 2)) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n const boundingBoxPoints = [\n {\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction pressCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst seedAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nconst seedAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport {\n seedAnnotate,\n seedAnnotateTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/seedAnnotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport touchTool from './touchTool.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\n\nconst toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 25);\n}\n\nfunction length (vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = simpleAngle.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n const columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n const rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n let suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n const sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n const sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideALength = length(sideA);\n const sideBLength = length(sideB);\n const sideCLength = length(sideC);\n\n // Cosine law\n let angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n\n if (rAngle) {\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n const distance = 15;\n\n let textCoords;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n const textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(mouseEventData);\n const element = mouseEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(touchEventData);\n const element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n });\n });\n}\n\nconst simpleAngle = mouseButtonTool({\n createNewMeasurement,\n addNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst simpleAngleTouch = touchTool({\n createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n simpleAngle,\n simpleAngleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleAngle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport { removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n const imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!external.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n let currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n const insideBoundingBox = pointInsideBoundingBox(data.handles.end, coords);\n\n\n return (distanceToPoint < 10) || insideBoundingBox;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const config = textMarker.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n let color = toolColors.getToolColor();\n\n if (data.active) {\n color = toolColors.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n const measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n const textCoords = external.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n data.handles.end.boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n }\n\n const config = textMarker.getConfiguration();\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction touchPressCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.addEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst textMarker = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nconst textMarkerTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback: touchPressCallback\n});\n\nexport {\n textMarker,\n textMarkerTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/textMarker.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'wwwc';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction defaultStrategy (eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n const maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n const minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n\n const deltaX = eventData.deltaPoints.page.x * multiplier;\n const deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += (deltaX);\n eventData.viewport.voi.windowCenter += (deltaY);\n}\n\nfunction mouseDragCallback (e) {\n const eventData = e.detail;\n\n wwwc.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchDragCallback (e) {\n const eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n const dragData = eventData;\n\n const maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n const minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n const deltaX = dragData.deltaPoints.page.x * multiplier;\n const deltaY = dragData.deltaPoints.page.y * multiplier;\n\n const config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n } else {\n dragData.viewport.voi.windowWidth += (deltaY);\n dragData.viewport.voi.windowCenter += (deltaX);\n }\n } else {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n }\n\n external.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nconst wwwc = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nconst wwwcTouchDrag = touchDragTool(touchDragCallback);\n\nexport {\n wwwc,\n wwwcTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwc.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport getLuminance from '../util/getLuminance.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'wwwcRegion';\n\nlet configuration = {\n minWindowWidth: 10\n};\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) {\n const numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n let min = globalMax;\n let max = globalMin;\n let sum = 0;\n\n for (let index = 0; index < numPixels; index++) {\n const spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min,\n max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion (eventData) {\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n let width = Math.abs(startPoint.x - endPoint.x);\n let height = Math.abs(startPoint.y - endPoint.y);\n\n let left = Math.min(startPoint.x, endPoint.x);\n let top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n const pixelLuminanceData = getLuminance(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n const minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n const config = wwwcRegion.getConfiguration();\n const viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.addEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n if (e.type === EVENTS.MOUSE_DRAG) {\n element.addEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n const measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n addToolState(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const context = eventData.canvasContext;\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n const color = toolColors.getActiveColor();\n\n // Calculate the rectangle parameters\n const startPointCanvas = cornerstone.pixelToCanvas(element, startPoint);\n const endPointCanvas = cornerstone.pixelToCanvas(element, endPoint);\n\n const left = Math.min(startPointCanvas.x, endPointCanvas.x);\n const top = Math.min(startPointCanvas.y, endPointCanvas.y);\n const width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n const height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag (element) {\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction activateTouchDrag (element) {\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.addEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst wwwcRegion = {\n activate,\n deactivate: disable,\n disable,\n setConfiguration,\n getConfiguration\n};\n\nconst wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexport {\n wwwcRegion,\n wwwcRegionTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwcRegion.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport mouseWheelTool from './mouseWheelTool.js';\nimport touchPinchTool from './touchPinchTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'zoom';\nlet startPoints;\n\nfunction changeViewportScale (viewport, ticks) {\n const config = zoom.getConfiguration();\n const pow = 1.7;\n\n const oldFactor = Math.log(viewport.scale) / Math.log(pow);\n const factor = oldFactor + ticks;\n\n const scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition (position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift (shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n const angle = viewport.rotation * Math.PI / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy (eventData, ticks) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy (eventData, ticks) {\n const element = eventData.element;\n const image = eventData.image;\n const config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n const shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n const translateSpeed = 8;\n const outwardsMinScaleToTranslate = 3;\n const minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n let desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n const distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy (eventData, ticks) {\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n const ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n let ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n const config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const config = zoom.getConfiguration();\n const viewport = eventData.viewport;\n const element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nconst zoom = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nconst zoomWheel = mouseWheelTool(mouseWheelCallback);\nconst zoomTouchPinch = touchPinchTool(touchPinchCallback);\nconst zoomTouchDrag = touchDragTool(dragCallback);\n\nexport {\n zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/zoom.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'brush';\nconst configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet dragging = false;\n\nfunction paint (eventData) {\n const configuration = brush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown (e) {\n const eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e) {\n const eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = brush.getConfiguration();\n const radius = configuration.radius;\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst brush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexport { brush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brush.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'adaptiveBrush';\nconst configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet thrMax;\nlet thrMin;\nlet currentRadius;\nlet dragging;\n\nfunction getGreyValues (pointerArray, pixelData, imageColumns) {\n const configuration = adaptiveBrush.getConfiguration();\n const tolerance = configuration.tolerance;\n let minValue = Number.MAX_VALUE;\n let maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach((point) => {\n const pixelIndex = point[1] * imageColumns + point[0];\n const greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush (imagePixelData, brushPixelData, rows, columns) {\n const configuration = adaptiveBrush.getConfiguration();\n const brushPixelValue = configuration.draw;\n const mouseX = Math.round(lastImageCoords.x);\n const mouseY = Math.round(lastImageCoords.y);\n let numPixelsOutsideThresholdWindow = null;\n let pointerArray = [];\n let radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = getCircle(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (let j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n const xCoord = pointerArray[j][0];\n const yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n const pixelIndex = yCoord * columns + xCoord;\n const pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n drawBrushPixels(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { rows, columns } = layer.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction erase (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n const configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown (e) {\n const eventData = e.detail;\n\n const element = eventData.element;\n const configuration = adaptiveBrush.getConfiguration();\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { x, y } = eventData.currentPoints.image;\n const { rows, columns } = layer.image;\n const pointerArray = getCircle(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e) {\n const eventData = e.detail;\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = adaptiveBrush.getConfiguration();\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const pointerArray = getCircle(currentRadius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst adaptiveBrush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexport { adaptiveBrush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/adaptiveBrush.js","export default '2.0.0';\n\n\n\n// WEBPACK FOOTER //\n// ./version.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/cornerstoneTools.min.js b/dist/cornerstoneTools.min.js index 300148aa0..0dc867553 100644 --- a/dist/cornerstoneTools.min.js +++ b/dist/cornerstoneTools.min.js @@ -1,3 +1,3 @@ -/*! cornerstone-tools - 1.1.2 - 2017-12-06 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstoneTools",[],t):"object"==typeof exports?exports.cornerstoneTools=t():e.cornerstoneTools=t()}(this,function(){return function(e){function t(n){if(o[n])return o[n].exports;var a=o[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var o={};return t.m=e,t.c=o,t.d=function(e,o,n){t.o(e,o)||Object.defineProperty(e,o,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(o,"a",o),o},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=60)}([function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=window.cornerstone,a=window.cornerstoneMath,r=window.$,l=window.Hammer;t.default={set cornerstone(e){n=e},get cornerstone(){return n},set cornerstoneMath(e){a=e},get cornerstoneMath(){return a},set $(e){r=e},get $(){return r},set Hammer(e){l=e},get Hammer(){return l}}},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=f.default.cornerstone.getEnabledElement(e);return void 0===t.toolStateManager&&(t.toolStateManager=c.globalImageIdSpecificToolStateManager),t.toolStateManager}function r(e,t,o){a(e).add(e,t,o);var n={toolType:t,element:e,measurementData:o};(0,v.default)(e,"CornerstoneToolsMeasurementAdded",n)}function l(e,t){return a(e).get(e,t)}function i(e,t,o){for(var n=a(e),r=n.get(e,t),l=-1,i=0;i2&&void 0!==arguments[2]?arguments[2]:null,n=void 0;"function"==typeof window.CustomEvent?n=new CustomEvent(t.toLocaleLowerCase(),{detail:o,cancelable:!0}):(n=document.createEvent("CustomEvent"),n.initCustomEvent(t.toLocaleLowerCase(),!0,!0,o));var a=r.default.$.Event(t,o);return r.default.$(e).trigger(a,o),!a.isImmediatePropagationStopped()&&e.dispatchEvent(n)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n;var a=o(0),r=function(e){return e&&e.__esModule?e:{default:e}}(a)},function(e,t,o){"use strict";function n(e){c=e}function a(){return c}function r(e){d=e}function l(){return d}function i(e){f=e}function u(){return f}function s(e){return e?f:d}Object.defineProperty(t,"__esModule",{value:!0});var d="white",f="greenyellow",c="transparent",g={setFillColor:n,getFillColor:a,setToolColor:r,getToolColor:l,setActiveColor:i,getActiveColor:u,getColorIfActive:s};t.default=g},function(e,t,o){"use strict";function n(e){i=e}function a(){return i}function r(e){u=e}function l(){return u}Object.defineProperty(t,"__esModule",{value:!0});var i=1,u=2,s={setToolWidth:n,getToolWidth:a,setActiveWidth:r,getActiveWidth:l};t.default=s},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o,n,r,l){"[object Array]"!==Object.prototype.toString.call(t)&&(t=[t]);var i=a.default.getFont(),u=a.default.getFontSize(),s=a.default.getBackgroundColor();e.save(),e.font=i,e.textBaseline="top",e.strokeStyle=r;var d=0;t.forEach(function(t){var o=e.measureText(t).width;d=Math.max(d,o)}),e.fillStyle=s;var f={width:d+10,height:5+t.length*(u+5)};return l&&l.centering&&!0===l.centering.x&&(o-=f.width/2),l&&l.centering&&!0===l.centering.y&&(n-=f.height/2),f.left=o,f.top=n,l&&!0===l.debug&&(e.fillStyle="#FF0000"),e.fillRect(f.left,f.top,f.width,f.height),t.forEach(function(t,a){e.fillStyle=r,e.fillText(t,o+5,n+5+a*(u+5))}),e.restore(),f};var n=o(14),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(t){var l=r.default.cornerstone,i=t.element,u=e.createNewMeasurement(t);if(u){var s={mouseButtonMask:t.which};(0,M.addToolState)(t.element,e.toolType,u),r.default.$(i).off("CornerstoneToolsMouseMove",e.mouseMoveCallback||n),r.default.$(i).off("CornerstoneToolsMouseDown",e.mouseDownCallback||a),r.default.$(i).off("CornerstoneToolsMouseDownActivate",e.mouseDownActivateCallback||o),e.mouseDoubleClickCallback&&r.default.$(i).off("CornerstoneToolsMouseDoubleClick",e.mouseDoubleClickCallback),l.updateImage(i);var d=void 0;d=1===Object.keys(u.handles).length?g.default:m.default;var f=void 0;f=!(!e.options||void 0===e.options.preventHandleOutsideImage)&&e.options.preventHandleOutsideImage,d(t,e.toolType,u,u.handles.end,function(){u.active=!1,u.invalidated=!0,(0,C.default)(t,u.handles)&&(0,M.removeToolState)(i,e.toolType,u),r.default.$(i).on("CornerstoneToolsMouseMove",s,e.mouseMoveCallback||n),r.default.$(i).on("CornerstoneToolsMouseDown",s,e.mouseDownCallback||a),r.default.$(i).on("CornerstoneToolsMouseDownActivate",s,e.mouseDownActivateCallback||o),e.mouseDoubleClickCallback&&r.default.$(i).on("CornerstoneToolsMouseDoubleClick",s,e.mouseDoubleClickCallback),l.updateImage(i)},f)}}function o(o,n){if((0,b.default)(n.which,o.data.mouseButtonMask))return e.addNewMeasurement?e.addNewMeasurement(n):t(n),!1}function n(t,o){if(i.default.setCoords(o),0===o.which){var n=(0,M.getToolState)(o.element,e.toolType);if(n){for(var a=!1,l=0;l2&&void 0!==arguments[2]&&arguments[2],n=(0,r.getToolState)(e,"stack");if(n&&n.data&&n.data.length){var l=n.data[0],i=l.currentImageIdIndex+t;if(o){i%=l.imageIds.length}else i=Math.min(l.imageIds.length-1,i),i=Math.max(0,i);(0,a.default)(e,i)}};var n=o(43),a=function(e){return e&&e.__esModule?e:{default:e}}(n),r=o(1)},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var o=Math.pow(10,t);return Math.round(e*o)/o}},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var o=e.width/2,n=e.height/2;if(o<=0||n<=0)return!1;var a={x:e.left+o,y:e.top+n},r={x:t.x-a.x,y:t.y-a.y};return r.x*r.x/(o*o)+r.y*r.y/(n*n)<=1}},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.cancelBubble=!0,e.returnValue=!1,!1}},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o,n,r){if(!e)throw new Error("getRGBPixels: parameter element must not be undefined");t=Math.round(t),o=Math.round(o);var l=a.default.cornerstone.getEnabledElement(e),i=[],u=0,s=l.image.getPixelData(),d=void 0,f=void 0,c=void 0;if(l.image.color)for(f=0;f=i.stacks.length&&(f=0),f<0&&(f=i.stacks.length-1)):(f=Math.min(i.stacks.length-1,f),f=Math.max(0,f)),f!==i.currentStackIndex){var c=a.getViewport(e),g=i.stacks[f],v=u.default.getStartLoadHandler(),m=u.default.getEndLoadHandler(),h=u.default.getErrorLoadingHandler();v&&v(e);var p=void 0;p=!0===g.preventCache?a.loadImage(g.imageIds[d]):a.loadAndCacheImage(g.imageIds[d]),p.then(function(t){i.currentImageIdIndex!==d&&(g.currentImageIdIndex=d,i.currentStackIndex=f,a.displayImage(e,t,c),m&&m(e,t))},function(t){var o=g.imageIds[d];h&&h(e,o,t)})}}};var a=o(0),r=n(a),l=o(1),i=o(10),u=n(i)},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var o=(0,n.planePlaneIntersection)(e,t);if(o)return{start:(0,n.projectPatientPointToImagePlane)(o.start,e),end:(0,n.projectPatientPointToImagePlane)(o.end,e)}};var n=o(26)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o,n){var a=r.default.cornerstone,l=a.getEnabledElement(o).image,u=a.getEnabledElement(n).image;if(l&&u){var d=a.metaData.get("imagePlaneModule",l.imageId),c=a.metaData.get("imagePlaneModule",u.imageId);if(d&&c&&d.rowCosines&&d.columnCosines&&d.imagePositionPatient&&c.rowCosines&&c.columnCosines&&c.imagePositionPatient&&d.frameOfReferenceUID===c.frameOfReferenceUID){d.rowCosines=(0,g.default)(d.rowCosines),d.columnCosines=(0,g.default)(d.columnCosines),d.imagePositionPatient=(0,g.default)(d.imagePositionPatient),c.rowCosines=(0,g.default)(c.rowCosines),c.columnCosines=(0,g.default)(c.columnCosines),c.imagePositionPatient=(0,g.default)(c.imagePositionPatient);var v=d.rowCosines.clone().cross(d.columnCosines),m=c.rowCosines.clone().cross(c.columnCosines),h=v.angleTo(m);if(!((h=Math.abs(h))<.5)){var p=(0,i.default)(d,c);if(p){var T=a.pixelToCanvas(t.element,p.start),C=a.pixelToCanvas(t.element,p.end),y=s.default.getActiveColor(),b=f.default.getToolWidth();e.setTransform(1,0,0,1,0,0),e.save(),e.beginPath(),e.strokeStyle=y,e.lineWidth=b,e.moveTo(T.x,T.y),e.lineTo(C.x,C.y),e.stroke(),e.restore()}}}}};var a=o(0),r=n(a),l=o(39),i=n(l),u=o(4),s=n(u),d=o(5),f=n(d),c=o(15),g=n(c)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=o(63),r=n(a),l=o(64),i=n(l),u={getOrientationString:r.default,invertOrientationString:i.default};t.default=u},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o){return a.default.cornerstone.setToPixelCoordinateSystem(e,t,.1),{fontSize:o/e.viewport.scale/.1,lineHeight:o/e.viewport.scale/.1,fontScale:.1}};var n=o(0),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){function o(o){if(v.currentImageIdIndex===t){try{i.getEnabledElement(e)}catch(e){return}s?(s.currentImageIdIndex=t,s.render(e,a.data)):i.displayImage(e,o),h&&h(e,o)}}function n(o){var n=v.imageIds[t];p&&p(e,n,o)}var a=(0,l.getToolState)(e,"stack");if(a&&a.data&&a.data.length){var i=r.default.cornerstone,s=void 0;if(a.data.length>1){var c=(0,l.getToolState)(e,"stackRenderer");c&&c.data&&c.data.length&&(s=c.data[0])}var v=a.data[0];t<0&&(t+=v.imageIds.length);var m=d.default.getStartLoadHandler(),h=d.default.getEndLoadHandler(),p=d.default.getErrorLoadingHandler();if(t!==v.currentImageIdIndex){m&&m(e);var T={newImageIdIndex:t,direction:t-v.currentImageIdIndex};v.currentImageIdIndex=t;var C=v.imageIds[t],y=f.stackScroll.getConfiguration();if(y&&!0===y.retryLoadOnScroll){var b=i.imageCache.getImagePromise(C);b&&"rejected"===b.state()&&i.imageCache.removeImagePromise(C)}var M=Boolean(v.preventCache),x=void 0;x=M?i.loadImage(C):i.loadAndCacheImage(C),x.then(o,n),u.default.startGrabbing(),(0,g.default)(e,"CornerstoneStackScroll",T)}}};var a=o(0),r=n(a),l=o(1),i=o(27),u=n(i),s=o(10),d=n(s),f=o(44),c=o(3),g=n(c)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){d.default.$(t.element).off("CornerstoneToolsMouseDrag",i),d.default.$(t.element).off("CornerstoneToolsMouseUp",a),d.default.$(t.element).off("CornerstoneToolsMouseClick",a)}function r(e,t){if((0,y.default)(t.which,e.data.mouseButtonMask)){var o={deltaY:0};return d.default.$(t.element).on("CornerstoneToolsMouseDrag",o,i),d.default.$(t.element).on("CornerstoneToolsMouseUp",a),d.default.$(t.element).on("CornerstoneToolsMouseClick",a),e.stopImmediatePropagation(),!1}}function l(e,t){var o=-t.direction,n=P.getConfiguration(),a=!1;n&&n.loop&&(a=n.loop),(0,M.default)(t.element,o,a)}function i(e,t){var o=t.element,n=(0,x.getToolState)(o,"stack");if(n&&n.data&&n.data.length){var a=n.data[0],r=P.getConfiguration(),l=Math.max(2,d.default.$(o).height()/Math.max(a.imageIds.length,8));if(r&&r.stackScrollSpeed&&(l=r.stackScrollSpeed),e.data.deltaY=e.data.deltaY||0,e.data.deltaY+=t.deltaPoints.page.y,Math.abs(e.data.deltaY)>=l){var i=e.data.deltaY/l,u=Math.round(i),s=e.data.deltaY%l;e.data.deltaY=s,(0,M.default)(o,u)}return!1}}function u(e,t){var o=$.getConfiguration();o&&o.testPointers(t)&&i(e,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.stackScrollMultiTouch=t.stackScrollTouchDrag=t.stackScrollWheel=t.stackScroll=void 0;var s=o(0),d=n(s),f=o(11),c=n(f),g=o(28),v=n(g),m=o(13),h=n(m),p=o(21),T=n(p),C=o(2),y=n(C),b=o(29),M=n(b),x=o(1),P=(0,h.default)(r),w=(0,T.default)(l),S={eventData:{deltaY:0}},I=(0,c.default)(i,S),k={testPointers:function(e){return e.numPointers>=3}},$=(0,v.default)(u,S);$.setConfiguration(k),t.stackScroll=P,t.stackScrollWheel=w,t.stackScrollTouchDrag=I,t.stackScrollMultiTouch=$},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o,n,r){if(!e)throw new Error("getLuminance: parameter element must not be undefined");t=Math.round(t),o=Math.round(o);var l=a.default.cornerstone.getEnabledElement(e),i=l.image,u=[],s=0,d=i.getPixelData(),f=void 0,c=void 0,g=void 0;if(i.color)for(c=0;cr.y?t.y-=d:t.y3&&void 0!==arguments[3]?arguments[3]:0,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=Math.round(n),l=Math.round(a);if(1===e)return[[r,l]];for(var i=[],u=0,s=-e;s<=e;s++){var d=l+s;if(!(d>t||d<0))for(var f=-e;f<=e;f++){var c=r+f;c>o||c<0||f*f+s*s1e-4&&u.x>u.y&&u.x>u.z)o+=n,u.x=0;else if(u.y>1e-4&&u.y>u.x&&u.y>u.z)o+=a,u.y=0;else{if(!(u.z>1e-4&&u.z>u.x&&u.z>u.y))break;o+=l,u.z=0}return o};var a=o(0),r=n(a),l=o(15),i=n(l)},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.replace("H","f");return t=t.replace("F","h"),t=t.replace("R","l"),t=t.replace("L","r"),t=t.replace("A","p"),t=t.replace("P","a"),t=t.toUpperCase()}},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=u.default.cornerstone,o=[];e.timeSeries.stacks.forEach(function(n){var a=void 0;a=!0===n.preventCache?t.loadImage(n.imageIds[e.imageIdIndex]):t.loadAndCacheImage(n.imageIds[e.imageIdIndex]),a.then(function(t){var n=Math.round(e.handles.end.x)+Math.round(e.handles.end.y)*t.width,a=t.getPixelData()[n];o.push(a)})}),e.lineSample.set(o)}function r(e){var t=(0,m.getToolState)(e.element,"timeSeries");if(void 0!==t&&void 0!==t.data&&0!==t.data.length){var o=t.data[0],n={timeSeries:o,lineSample:new C.default,imageIdIndex:o.stacks[o.currentStackIndex].currentImageIdIndex,visible:!0,handles:{end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0}}};return a(n),p.default.add(n),n}}function l(e,t){var o=(0,m.getToolState)(e.currentTarget,y);if(o){var n=t.canvasContext.canvas.getContext("2d");u.default.cornerstone.setToPixelCoordinateSystem(t.enabledElement,n);for(var a=0;a0?(0,i.default)(e,1,!0):(0,i.default)(e,-1,!0)},1e3/Math.abs(a.framesPerSecond)))}}function a(e){var t=(0,r.getToolState)(e,u);if(t&&t.data&&t.data.length){var o=t.data[0];clearInterval(o.intervalId),o.intervalId=void 0}}Object.defineProperty(t,"__esModule",{value:!0});var r=o(1),l=o(38),i=function(e){return e&&e.__esModule?e:{default:e}}(l),u="timeSeriesPlayer",s={start:n,stop:a};t.default=s},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){d.default.$(t.element).off("CornerstoneToolsMouseDrag",l),d.default.$(t.element).off("CornerstoneToolsMouseUp",a),d.default.$(t.element).off("CornerstoneToolsMouseClick",a)}function r(e,t){if((0,y.default)(t.which,e.data.mouseButtonMask)){var o={deltaY:0,options:e.data.options};return d.default.$(t.element).on("CornerstoneToolsMouseDrag",o,l),d.default.$(t.element).on("CornerstoneToolsMouseUp",a),d.default.$(t.element).on("CornerstoneToolsMouseClick",a),e.stopImmediatePropagation(),!1}}function l(e,t){e.data.deltaY+=t.deltaPoints.page.y;var o=(0,b.getToolState)(t.element,"timeSeries");if(void 0!==o&&void 0!==o.data&&0!==o.data.length){var n=o.data[0],a=d.default.$(t.element).height()/n.stacks.length;if(void 0!==e.data.options&&void 0!==e.data.options.timeSeriesScrollSpeed&&(a=e.data.options.timeSeriesScrollSpeed),e.data.deltaY>=a||e.data.deltaY<=-a){var r=Math.round(e.data.deltaY/a),l=e.data.deltaY%a;(0,T.default)(t.element,r),e.data.deltaY=l}return!1}}function i(e,t){var o=-t.direction;(0,T.default)(t.element,o)}function u(e){var t=e.originalEvent.detail,o={deltaY:0};o.deltaY+=t.deltaPoints.page.y;var n=(0,b.getToolState)(t.element,"stack");if(void 0!==n&&void 0!==n.data&&0!==n.data.length){if(o.deltaY>=3||o.deltaY<=-3){var a=o.deltaY/3,r=o.deltaY%3;(0,T.default)(o.element,a),o.deltaY=r}return!1}}Object.defineProperty(t,"__esModule",{value:!0}),t.timeSeriesScrollTouchDrag=t.timeSeriesScrollWheel=t.timeSeriesScroll=void 0;var s=o(0),d=n(s),f=o(13),c=n(f),g=o(11),v=n(g),m=o(21),h=n(m),p=o(38),T=n(p),C=o(2),y=n(C),b=o(1),M=(0,c.default)(r),x=(0,h.default)(i),P=(0,v.default)(u);t.timeSeriesScroll=M,t.timeSeriesScrollWheel=x,t.timeSeriesScrollTouchDrag=P},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o){if(o!==t){var n=a.default.cornerstone,r=n.getViewport(t),l=n.getViewport(o);l.voi.windowWidth===r.voi.windowWidth&&l.voi.windowCenter===r.voi.windowCenter&&l.invert===r.invert||(l.voi.windowWidth=r.voi.windowWidth,l.voi.windowCenter=r.voi.windowCenter,l.invert=r.invert,e.setViewport(o,l))}};var n=o(0),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o){o!==t&&a.default.cornerstone.updateImage(o)};var n=o(0),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){function o(e,t){s.length&&d.length&&(f=!0,d.forEach(function(o){var n=d.indexOf(o);if(-1!==n){var a=c.imageIds.targetElements[n],r=s.indexOf(e);if(-1!==r){var l=c.imageIds.sourceElements[r],u=void 0;l===a?u=0:void 0!==c.distances[l]&&(u=c.distances[l][a]),g(i,e,o,t,u)}}}),f=!1)}function n(e,t){!0!==f&&o(e.currentTarget,t)}function a(e){var t=e.detail.element;i.remove(t)}var r=l.default.cornerstone,i=this,s=[],d=[],f=!1,c={},g=t;this.setHandler=function(e){g=e},this.getHandler=function(){return g},this.getDistances=function(){s.length&&d.length&&(c.distances={},c.imageIds={sourceElements:[],targetElements:[]},s.forEach(function(e){var t=r.getEnabledElement(e);if(t&&t.image){var o=t.image.imageId,n=r.metaData.get("imagePlaneModule",o);if(n&&n.imagePositionPatient){var a=(0,u.default)(n.imagePositionPatient);c.hasOwnProperty(t)||(c.distances[o]={},c.imageIds.sourceElements.push(o),d.forEach(function(t){var n=r.getEnabledElement(t);if(n&&n.image){var l=n.image.imageId;if(c.imageIds.targetElements.push(l),e!==t&&o!==l&&!c.distances[o].hasOwnProperty(l)){var i=r.metaData.get("imagePlaneModule",l);if(i&&i.imagePositionPatient){var s=(0,u.default)(i.imagePositionPatient);c.distances[o][l]=s.clone().sub(a)}}}}),Object.keys(c.distances[o]).length||delete c.distances[o])}}}))},this.addSource=function(t){-1===s.indexOf(t)&&(s.push(t),l.default.$(t).on(e,n),i.getDistances(),i.updateDisableHandlers())},this.addTarget=function(e){-1===d.indexOf(e)&&(d.push(e),i.getDistances(),g(i,e,e,0),i.updateDisableHandlers())},this.add=function(e){i.addSource(e),i.addTarget(e)},this.removeSource=function(t){var a=s.indexOf(t);-1!==a&&(s.splice(a,1),l.default.$(t).off(e,n),i.getDistances(),o(t),i.updateDisableHandlers())},this.removeTarget=function(e){var t=d.indexOf(e);-1!==t&&(d.splice(t,1),i.getDistances(),g(i,e,e,0),i.updateDisableHandlers())},this.remove=function(e){i.removeTarget(e),i.removeSource(e)},this.getSourceElements=function(){return s},this.getTargetElements=function(){return d},this.displayImage=function(e,t,o){f=!0,r.displayImage(e,t,o),f=!1},this.setViewport=function(e,t){f=!0,r.setViewport(e,t),f=!1},this.updateDisableHandlers=function(){l.default.$.unique(s.concat(d)).forEach(function(e){e.removeEventListener("cornerstoneelementdisabled",a),e.addEventListener("cornerstoneelementdisabled",a)})},this.destroy=function(){l.default.$.unique(s.concat(d)).forEach(function(e){i.remove(e)})}}Object.defineProperty(t,"__esModule",{value:!0});var r=o(0),l=n(r),i=o(15),u=n(i);t.default=a},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o,n){if(t!==o&&n&&n.direction){var a=r.default.cornerstone,i=(0,l.getToolState)(o,"stack"),s=i.data[0],d=s.currentImageIdIndex+n.direction;if(d=Math.min(Math.max(d,0),s.imageIds.length-1),s.currentImageIdIndex!==d){var f=u.default.getStartLoadHandler(),c=u.default.getEndLoadHandler(),g=u.default.getErrorLoadingHandler();f&&f(o);var v=void 0;v=!0===s.preventCache?a.loadImage(s.imageIds[d]):a.loadAndCacheImage(s.imageIds[d]),v.then(function(t){var n=a.getViewport(o);s.currentImageIdIndex=d,e.displayImage(o,t,n),c&&c(o,t)},function(e){var t=s.imageIds[d];g&&g(o,t,e)})}}};var a=o(0),r=n(a),l=o(1),i=o(10),u=n(i)},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,o){if(o!==t){var n=r.default.cornerstone,a=n.getEnabledElement(t).image,i=n.metaData.get("imagePlaneModule",a.imageId);if(void 0!==i&&void 0!==i.imagePositionPatient){var s=(0,d.default)(i.imagePositionPatient),f=(0,l.getToolState)(o,"stack"),c=f.data[0],g=Number.MAX_VALUE,v=-1;if(c.imageIds.forEach(function(e,t){var o=n.metaData.get("imagePlaneModule",e);if(void 0!==o&&void 0!==o.imagePositionPatient){var a=(0,d.default)(o.imagePositionPatient),r=a.distanceToSquared(s);r=0))return t.add(o,n,r);!1===a.hasOwnProperty(n)&&(a[n]={data:[]}),a[n].data.push(r)}function n(o,n){return e.indexOf(n)>=0?(!1===a.hasOwnProperty(n)&&(a[n]={data:[]}),a[n]):t.get(o,n)}var a={};return{get:n,add:o}}function a(e,t){t=t||["timeSeries"];var o=(0,l.getElementToolStateManager)(e);void 0===o&&(o=r.globalImageIdSpecificToolStateManager);var a=n(t,o);i.push(a),(0,l.setElementToolStateManager)(e,a)}Object.defineProperty(t,"__esModule",{value:!0}),t.newTimeSeriesSpecificToolStateManager=t.addTimeSeriesStateManager=void 0;var r=o(16),l=o(1),i=[];t.addTimeSeriesStateManager=a,t.newTimeSeriesSpecificToolStateManager=n},function(e,t,o){"use strict";function n(e,t){function o(){return l}function n(e){l=e}function a(o,n,a){if(!(e.indexOf(n)>=0))return t.add(o,n,a);!1===l.hasOwnProperty(n)&&(l[n]={data:[]}),l[n].data.push(a)}function r(o,n){return e.indexOf(n)>=0?(!1===l.hasOwnProperty(n)&&(l[n]={data:[]}),l[n]):t.get(o,n)}var l={};return{get:r,add:a,saveToolState:o,restoreToolState:n,toolState:l}}function a(e,t){var o=(0,l.getElementToolStateManager)(e);o||(o=r.globalImageIdSpecificToolStateManager);var a=["stack","stackPrefetch","playClip","volume","slab","referenceLines","crosshairs","stackRenderer"];t&&(a=a.concat(t));var u=n(a,o);i.push(u),(0,l.setElementToolStateManager)(e,u)}Object.defineProperty(t,"__esModule",{value:!0}),t.addStackStateManager=t.newStackSpecificToolStateManager=t.stackSpecificStateManager=void 0;var r=o(16),l=o(1),i=[],u={newStackSpecificToolStateManager:n,addStackStateManager:a};t.stackSpecificStateManager=u,t.newStackSpecificToolStateManager=n,t.addStackStateManager=a},function(e,t,o){"use strict";function n(){function e(e,t,o){!1===n.hasOwnProperty(e)&&(n[e]={});var a=n[e];!1===a.hasOwnProperty(t)&&(a[t]={data:[]}),a[t].data.push(o)}function t(e,t){if(!1!==n.hasOwnProperty(e)){var o=n[e];if(!1!==o.hasOwnProperty(t)){return o[t]}}}function o(e,t,o){if(!1!==n.hasOwnProperty(e)){var a=n[e];if(!1!==a.hasOwnProperty(t)){for(var r=a[t],l=-1,i=0;it&&n.push(e)}),{low:e.indexOf(S(o)),high:e.indexOf(I(n))}}function l(e){function t(e){var t=u.indicesToRequest.indexOf(e);t>-1&&u.indicesToRequest.splice(t,1)}function o(e){t(l.imageIds.indexOf(e.imageId))}function n(t){console.log("prefetch errored: "+t),c&&c(e,d,t,"stackPrefetch")}var a=(0,C.getToolState)(e,"stack");if(a&&a.data&&a.data.length){var l=a.data[0],i=(0,C.getToolState)(e,b);if(i){var u=i.data[0]||{};if(u.indicesToRequest&&u.indicesToRequest.length||(u.enabled=!1),!1!==u.enabled){i.data[0].indicesToRequest.sort(function(e,t){return e-t});if(u.indicesToRequest.slice().forEach(function(e){var o=l.imageIds[e];if(o){var n=v.default.cornerstone.imageCache.getImagePromise(o);n&&"resolved"===n.state()&&t(e)}}),u.indicesToRequest.length){h.default.clearRequestStack(M);for(var s=r(u.indicesToRequest,l.currentImageIdIndex),d=void 0,f=void 0,c=T.default.getErrorLoadingHandler(),g=s.low,m=s.high;g>=0||mx.maxImagesToPrefetch,P=u.indicesToRequest[m]-p>x.maxImagesToPrefetch,w=!y&&g>=0,S=!P&&m0&&(a=i.isTimeVarying?r/i.length|0:i[0],i.push(a)),i}function r(e){var t=e.intervalId;void 0!==t&&(e.intervalId=void 0,e.usingFrameTimeVector?clearTimeout(t):clearInterval(t))}function l(e){var t={element:e};(0,m.default)(e,"CornerstoneToolsClipStopped",t)}function i(e,t){var o=void 0,n=void 0;if(void 0===e)throw new Error("playClip: element must not be undefined");var i=(0,g.getToolState)(e,"stack");if(i&&i.data&&i.data.length){var u=d.default.cornerstone,s=void 0;if(i.data.length>1){var f=(0,g.getToolState)(e,"stackRenderer");f&&f.data&&f.data.length&&(s=f.data[0])}var v=i.data[0],m=(0,g.getToolState)(e,h);m&&m.data&&m.data.length?(o=m.data[0],r(o)):(o={intervalId:void 0,framesPerSecond:30,lastFrameTimeStamp:void 0,frameRate:0,frameTimeVector:void 0,ignoreFrameTimeVector:!1,usingFrameTimeVector:!1,speed:1,reverse:!1,loop:!0},(0,g.addToolState)(e,h,o)),(t<0||t>0)&&(o.framesPerSecond=Number(t),o.reverse=o.framesPerSecond<0,o.ignoreFrameTimeVector=!0),!0!==o.ignoreFrameTimeVector&&o.frameTimeVector&&o.frameTimeVector.length===v.imageIds.length&&(n=a(o.frameTimeVector,o.speed));var p=function(){var t=void 0,n=void 0,a=void 0,d=void 0,f=v.currentImageIdIndex,g=v.imageIds.length;if(o.reverse?f--:f++,!o.loop&&(f<0||f>=g))return r(o),void l(e);f>=g&&(f=0),f<0&&(f=g-1),f!==v.currentImageIdIndex&&(n=c.default.getStartLoadHandler(),a=c.default.getEndLoadHandler(),d=c.default.getErrorLoadingHandler(),n&&n(e),t=!0===v.preventCache?u.loadImage(v.imageIds[f]):u.loadAndCacheImage(v.imageIds[f]),t.then(function(t){try{v.currentImageIdIndex=f,s?(s.currentImageIdIndex=f,s.render(e,i.data)):u.displayImage(e,t),a&&a(e,t)}catch(e){return}},function(t){var o=v.imageIds[f];d&&d(e,o,t)}))};n&&n.length>0&&n.isTimeVarying?(o.usingFrameTimeVector=!0,o.intervalId=setTimeout(function e(){o.intervalId=setTimeout(e,n[v.currentImageIdIndex]),p()},0)):(o.usingFrameTimeVector=!1,o.intervalId=setInterval(p,1e3/Math.abs(o.framesPerSecond)))}}function u(e){var t=(0,g.getToolState)(e,h);t&&t.data&&t.data.length&&r(t.data[0])}Object.defineProperty(t,"__esModule",{value:!0}),t.stopClip=t.playClip=void 0;var s=o(0),d=n(s),f=o(10),c=n(f),g=o(1),v=o(3),m=n(v),h="playClip";t.playClip=i,t.stopClip=u},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=s.default.cornerstone,o=e.currentTarget,n={event:window.event||e,element:o,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,currentPoints:{page:{x:c,y:g},image:t.pageToPixel(o,c,g)},keyCode:e.keyCode,which:e.which};n.currentPoints.canvas=t.pixelToCanvas(o,n.currentPoints.image);var a={keydown:"CornerstoneToolsKeyDown",keypress:"CornerstoneToolsKeyPress",keyup:"CornerstoneToolsKeyUp"};(0,f.default)(o,a[e.type],n)}function r(e){c=e.pageX||e.originalEvent.pageX,g=e.pageY||e.originalEvent.pageY}function l(e){i(e),s.default.$(e).on(v,a),s.default.$(e).on("mousemove",r)}function i(e){s.default.$(e).off(v,a),s.default.$(e).off("mousemove",r)}Object.defineProperty(t,"__esModule",{value:!0});var u=o(0),s=n(u),d=o(3),f=n(d),c=void 0,g=void 0,v="keydown keypress keyup",m={enable:l,disable:i};t.default=m},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){return"number"!=typeof e.buttons?e.which:0===e.buttons?0:e.buttons%2==1?1:e.buttons%4==2?3:e.buttons%8==4?2:0}function r(){C=!1}function l(e){var t=c.default.cornerstone,o=e.currentTarget,n="CornerstoneToolsMouseDoubleClick",r={page:c.default.cornerstoneMath.point.pageToPoint(e),image:t.pageToPixel(o,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};r.canvas=t.pixelToCanvas(o,r.image);var l=(0,v.default)(r),i={event:e,which:a(e),viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,startPoints:r,lastPoints:l,currentPoints:r,deltaPoints:{x:0,y:0},type:n};(0,T.default)(i.element,n,i)}function i(e){function t(e){var t={page:c.default.cornerstoneMath.point.pageToPoint(e),image:n.pageToPixel(l,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};t.canvas=n.pixelToCanvas(l,t.image);var o={page:c.default.cornerstoneMath.point.subtract(t.page,s.page),image:c.default.cornerstoneMath.point.subtract(t.image,s.image),client:c.default.cornerstoneMath.point.subtract(t.client,s.client),canvas:c.default.cornerstoneMath.point.subtract(t.canvas,s.canvas)},a={which:f,viewport:n.getViewport(l),image:n.getEnabledElement(l).image,element:l,startPoints:i,lastPoints:s,currentPoints:t,deltaPoints:o,type:"CornerstoneToolsMouseDrag",ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey};return(0,T.default)(a.element,"CornerstoneToolsMouseDrag",a),s=(0,v.default)(t),(0,h.default)(e)}function o(e){clearTimeout(y);var a="CornerstoneToolsMouseUp";C&&(a="CornerstoneToolsMouseClick");var r={page:c.default.cornerstoneMath.point.pageToPoint(e),image:n.pageToPixel(l,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};r.canvas=n.pixelToCanvas(l,r.image);var d={page:c.default.cornerstoneMath.point.subtract(r.page,s.page),image:c.default.cornerstoneMath.point.subtract(r.image,s.image),client:c.default.cornerstoneMath.point.subtract(r.client,s.client),canvas:c.default.cornerstoneMath.point.subtract(r.canvas,s.canvas)},g={event:e,which:f,viewport:n.getViewport(l),image:n.getEnabledElement(l).image,element:l,startPoints:i,lastPoints:s,currentPoints:r,deltaPoints:d,type:a};(0,T.default)(g.element,a,g),c.default.$(document).off("mousemove",t),c.default.$(document).off("mouseup",o),c.default.$(g.element).on("mousemove",u),C=!0}y=setTimeout(r,b);var n=c.default.cornerstone,l=e.currentTarget;c.default.$(l).off("mousemove",u);var i={page:c.default.cornerstoneMath.point.pageToPoint(e),image:n.pageToPixel(l,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};i.canvas=n.pixelToCanvas(l,i.image);var s=(0,v.default)(i),d={event:e,which:a(e),viewport:n.getViewport(l),image:n.getEnabledElement(l).image,element:l,startPoints:i,lastPoints:s,currentPoints:i,deltaPoints:{x:0,y:0},type:"CornerstoneToolsMouseDown"};(0,T.default)(d.element,"CornerstoneToolsMouseDown",d)&&(d.type="CornerstoneToolsMouseDownActivate",(0,T.default)(d.element,"CornerstoneToolsMouseDownActivate",d));var f=a(e);return c.default.$(document).on("mousemove",t),c.default.$(document).on("mouseup",o),(0,h.default)(e)}function u(e){var t=c.default.cornerstone,o=e.currentTarget,n={page:c.default.cornerstoneMath.point.pageToPoint(e),image:t.pageToPixel(o,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};n.canvas=t.pixelToCanvas(o,n.image);var r=(0,v.default)(n),l=a(e),i={page:c.default.cornerstoneMath.point.pageToPoint(e),image:t.pageToPixel(o,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};i.canvas=t.pixelToCanvas(o,i.image);var u={page:c.default.cornerstoneMath.point.subtract(i.page,r.page),image:c.default.cornerstoneMath.point.subtract(i.image,r.image),client:c.default.cornerstoneMath.point.subtract(i.client,r.client),canvas:c.default.cornerstoneMath.point.subtract(i.canvas,r.canvas)},s={which:l,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,startPoints:n,lastPoints:r,currentPoints:i,deltaPoints:u,type:"CornerstoneToolsMouseMove"};(0,T.default)(o,"CornerstoneToolsMouseMove",s),r=(0,v.default)(i)}function s(e){c.default.$(e).off("mousedown",i),c.default.$(e).off("mousemove",u),c.default.$(e).off("dblclick",l)}function d(e){s(e),c.default.$(e).on("mousedown",i),c.default.$(e).on("mousemove",u),c.default.$(e).on("dblclick",l)}Object.defineProperty(t,"__esModule",{value:!0});var f=o(0),c=n(f),g=o(34),v=n(g),m=o(32),h=n(m),p=o(3),T=n(p),C=!0,y=void 0,b=200,M={enable:d,disable:s};t.default=M},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){if(!("mousewheel"===e.originalEvent.type&&0===e.originalEvent.wheelDeltaY||"DOMMouseScroll"===e.originalEvent.type&&1===e.originalEvent.axis)){e.preventDefault();var t=u.default.cornerstone,o=e.currentTarget,n=void 0,a=void 0;void 0!==e.pageX&&void 0!==e.pageY?(n=e.pageX,a=e.pageY):e.originalEvent&&void 0!==e.originalEvent.pageX&&void 0!==e.originalEvent.pageY?(n=e.originalEvent.pageX,a=e.originalEvent.pageY):(n=e.x,a=e.y);var r=t.pageToPixel(o,n,a);e=window.event&&window.event.wheelDelta?window.event:e;var l=void 0;l=e.originalEvent&&e.originalEvent.wheelDelta?-e.originalEvent.wheelDelta:e.originalEvent&&e.originalEvent.deltaY?-e.originalEvent.deltaY:e.originalEvent&&e.originalEvent.detail?-e.originalEvent.detail:e.wheelDelta;var i=l<0?-1:1,s={element:o,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,direction:i,pageX:n,pageY:a,imageX:r.x,imageY:r.y};(0,d.default)(o,"CornerstoneToolsMouseWheel",s)}}function r(e){l(e),u.default.$(e).on(f,a)}function l(e){u.default.$(e).unbind(f,a)}Object.defineProperty(t,"__esModule",{value:!0});var i=o(0),u=n(i),s=o(3),d=n(s),f="mousewheel DOMMouseScroll",c={enable:r,disable:l};t.default=c},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=u.default.cornerstone,o=e.currentTarget||e.srcEvent.currentTarget,n=void 0,a=void 0,r=void 0,l=void 0,i=void 0;switch(e.preventDefault(),(e.pointers&&e.pointers.length>1||e.originalEvent&&e.originalEvent.touches&&e.originalEvent.touches.length>1)&&(k=!1,clearTimeout(x)),e.type){case"tap":k=!1,clearTimeout(x),T={page:u.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(o,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},T.canvas=t.pixelToCanvas(o,T.image),n="CornerstoneToolsTap",b={event:e,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,currentPoints:T,type:n,isTouchEvent:!0},(0,h.default)(o,n,b);break;case"doubletap":k=!1,clearTimeout(x),T={page:u.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(o,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},T.canvas=t.pixelToCanvas(o,T.image),n="CornerstoneToolsDoubleTap",b={event:e,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,currentPoints:T,type:n,isTouchEvent:!0},(0,h.default)(o,n,b);break;case"pinchstart":k=!1,clearTimeout(x),w=1;break;case"pinchmove":if(k=!1,clearTimeout(x),!0===I){w=e.scale,I=!1;break}a=(e.scale-w)/w,p={page:e.center,image:t.pageToPixel(o,e.center.x,e.center.y)},p.canvas=t.pixelToCanvas(o,p.image),n="CornerstoneToolsTouchPinch",b={event:e,startPoints:p,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,direction:e.scale<1?1:-1,scaleChange:a,type:n,isTouchEvent:!0},(0,h.default)(o,n,b),w=e.scale;break;case"touchstart":w=1,clearTimeout(x),clearTimeout(M),M=setTimeout(function(){p={page:u.default.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),image:t.pageToPixel(o,e.originalEvent.touches[0].pageX,e.originalEvent.touches[0].pageY),client:{x:e.originalEvent.touches[0].clientX,y:e.originalEvent.touches[0].clientY}},p.canvas=t.pixelToCanvas(o,p.image),n="CornerstoneToolsTouchStart",e.originalEvent.touches.length>1&&(n="CornerstoneToolsMultiTouchStart"),b={event:e,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,startPoints:p,currentPoints:p,type:n,isTouchEvent:!0},!0===(0,h.default)(o,n,b)&&(n="CornerstoneToolsTouchStartActive",e.originalEvent.touches.length>1&&(n="CornerstoneToolsMultiTouchStartActive"),b.type=n,(0,h.default)(o,n,b)),C=(0,d.default)(p)},50),k=!0,P=0,x=setTimeout(function(){k&&(T={page:u.default.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),image:t.pageToPixel(o,e.originalEvent.touches[0].pageX,e.originalEvent.touches[0].pageY),client:{x:e.originalEvent.touches[0].clientX,y:e.originalEvent.touches[0].clientY}},T.canvas=t.pixelToCanvas(o,p.image),n="CornerstoneToolsTouchPress",b={event:e,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,currentPoints:T,type:n,isTouchEvent:!0},(0,h.default)(o,n,b))},_);break;case"touchend":w=1,k=!1,clearTimeout(x),setTimeout(function(){p={page:u.default.cornerstoneMath.point.pageToPoint(e.originalEvent.changedTouches[0]),image:t.pageToPixel(o,e.originalEvent.changedTouches[0].pageX,e.originalEvent.changedTouches[0].pageY),client:{x:e.originalEvent.changedTouches[0].clientX,y:e.originalEvent.changedTouches[0].clientY}},p.canvas=t.pixelToCanvas(o,p.image),n="CornerstoneToolsTouchEnd",b={event:e,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,startPoints:p,currentPoints:p,type:n,isTouchEvent:!0},(0,h.default)(o,n,b)},50);break;case"panmove":r={x:e.deltaX-$.x,y:e.deltaY-$.y},$={x:e.deltaX,y:e.deltaY},T={page:{x:C.page.x+r.x,y:C.page.y+r.y},image:t.pageToPixel(o,C.page.x+r.x,C.page.y+r.y),client:{x:C.client.x+r.x,y:C.client.y+r.y}},T.canvas=t.pixelToCanvas(o,T.image),y={page:u.default.cornerstoneMath.point.subtract(T.page,C.page),image:u.default.cornerstoneMath.point.subtract(T.image,C.image),client:u.default.cornerstoneMath.point.subtract(T.client,C.client),canvas:u.default.cornerstoneMath.point.subtract(T.canvas,C.canvas)},P+=Math.sqrt(y.page.x*y.page.x+y.page.y*y.page.y),P>O&&(k=!1,clearTimeout(x)),n="CornerstoneToolsTouchDrag",e.pointers.length>1&&(n="CornerstoneToolsMultiTouchDrag"),b={viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,startPoints:p,lastPoints:C,currentPoints:T,deltaPoints:y,numPointers:e.pointers.length,type:n,isTouchEvent:!0},(0,h.default)(o,n,b),C=(0,d.default)(T);break;case"panstart":$={x:e.deltaX,y:e.deltaY},T={page:u.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(o,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},T.canvas=t.pixelToCanvas(o,T.image),C=(0,d.default)(T);break;case"panend":return k=!1,(clearTimeout(x),C)?(T={page:u.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(o,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},T.canvas=t.pixelToCanvas(o,T.image),y={page:u.default.cornerstoneMath.point.subtract(T.page,C.page),image:u.default.cornerstoneMath.point.subtract(T.image,C.image),client:u.default.cornerstoneMath.point.subtract(T.client,C.client),canvas:u.default.cornerstoneMath.point.subtract(T.canvas,C.canvas)},n="CornerstoneToolsDragEnd",b={event:e.srcEvent,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,startPoints:p,lastPoints:C,currentPoints:T,deltaPoints:y,type:n,isTouchEvent:!0},(0,h.default)(o,n,b),l=e.pointers.length-e.changedPointers.length,2===l&&(I=!0),(0,c.default)(e)):!1;case"rotatemove":k=!1,clearTimeout(x),i=e.rotation-S,S=e.rotation,n="CornerstoneToolsTouchRotate",b={event:e.srcEvent,viewport:t.getViewport(o),image:t.getEnabledElement(o).image,element:o,rotation:i,type:n},(0,h.default)(o,n,b)}return!1}function r(e){l(e);var t=u.default.Hammer,o={inputClass:t.SUPPORT_POINTER_EVENTS?t.PointerEventInput:t.TouchInput},n=new t.Manager(e,o),r={pointers:0,direction:t.DIRECTION_ALL,threshold:0},i=new t.Pan(r),s=new t.Pinch({threshold:0}),d=new t.Rotate({threshold:0});s.recognizeWith(i),s.recognizeWith(d),d.recognizeWith(i);var f=new t.Tap({event:"doubletap",taps:2,interval:1500,threshold:50,posThreshold:50});f.recognizeWith(i),n.add([f,i,d,s]),n.on("tap doubletap panstart panmove panend pinchstart pinchmove rotatemove",a),v.default.enable(e),u.default.$(e).on("touchstart touchend",a),u.default.$(e).data("hammer",n)}function l(e){v.default.disable(e),u.default.$(e).off("touchstart touchend",a);var t=u.default.$(e).data("hammer");t&&t.off("tap doubletap panstart panmove panend pinchmove rotatemove",a)}Object.defineProperty(t,"__esModule",{value:!0});var i=o(0),u=n(i),s=o(34),d=n(s),f=o(32),c=n(f),g=o(53),v=n(g),m=o(3),h=n(m),p=void 0,T=void 0,C=void 0,y=void 0,b=void 0,M=void 0,x=void 0,P=void 0,w=1,S=0,I=!1,k=!1,$=void 0,_=700,O=5,D={enable:r,disable:l};t.default=D},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){return{visible:!0,active:!0,handles:{start:{x:e.currentPoints.image.x-20,y:e.currentPoints.image.y+10,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},start2:{x:e.currentPoints.image.x-20,y:e.currentPoints.image.y+10,highlight:!0,active:!1},end2:{x:e.currentPoints.image.x,y:e.currentPoints.image.y+20,highlight:!0,active:!1}}}}function r(e,t,o){var n=u.default.cornerstone,a={start:n.pixelToCanvas(e,t.handles.start),end:n.pixelToCanvas(e,t.handles.end)},r=u.default.cornerstoneMath.lineSegment.distanceToPoint(a,o);return r<5||(a.start=n.pixelToCanvas(e,t.handles.start2),a.end=n.pixelToCanvas(e,t.handles.end2),(r=u.default.cornerstoneMath.lineSegment.distanceToPoint(a,o))<5)}function l(e,t){var o=(0,w.getToolState)(e.currentTarget,S);if(void 0!==o){var n=t.canvasContext.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0);for(var a=void 0,r=T.default.getToolWidth(),l=y.default.getFont(),i=I.getConfiguration(),s=u.default.cornerstone,d=0;d=e.image.columns||s>=e.image.rows)){if(e.image.color)d=(0,x.default)(e.element,u,s,1,1),c=u+", "+s,g="R: "+d[0]+" G: "+d[1]+" B: "+d[2]+" A: "+d[3];else{d=t.getStoredPixels(e.element,u,s,1,1);var v=d[0],m=v*e.image.slope+e.image.intercept,h=(0,w.default)(e.image,v);c=u+", "+s,g="SP: "+v+" MO: "+parseFloat(m.toFixed(3)),h&&(g+=" SUV: "+parseFloat(h.toFixed(3)))}var T={x:e.currentPoints.image.x+3,y:e.currentPoints.image.y-3},y=t.pixelToCanvas(e.element,T);n.font=r,n.fillStyle=a,(0,b.default)(n,g,y.x,y.y+l+5,a),(0,b.default)(n,c,y.x,y.y,a),n.restore()}}function r(e){var t=f.default.cornerstone,o=e.element,n=t.getEnabledElement(o),a=n.image,r=n.canvas.getContext("2d");r.setTransform(1,0,0,1,0,0);var l=C.default.getActiveColor(),i=p.default.getFont(),u=$.getConfiguration();r.save(),u&&u.shadow&&(r.shadowColor=u.shadowColor||"#000000",r.shadowOffsetX=u.shadowOffsetX||1,r.shadowOffsetY=u.shadowOffsetY||1);var s=t.metaData.get("generalSeriesModule",a.imageId),d=void 0;s&&(d=s.modality);var c=void 0;c=!0===e.isTouchEvent?t.pageToPixel(o,e.currentPoints.page.x,e.currentPoints.page.y-4*p.default.getFontSize()):t.pageToPixel(o,e.currentPoints.page.x,e.currentPoints.page.y-p.default.getFontSize()/2);var g=void 0,v="";if(!(c.x<0||c.y<0||c.x>=a.columns||c.y>=a.rows)){if(a.color)g=(0,x.default)(o,c.x,c.y,1,1),v="R: "+g[0]+" G: "+g[1]+" B: "+g[2];else{g=t.getStoredPixels(o,c.x,c.y,1,1);var m=g[0],h=m*e.image.slope+e.image.intercept,T=parseFloat(h.toFixed(2));if("CT"===d)v+="HU: "+T;else if("PT"===d){v+=T;var y=(0,w.default)(e.image,m);y&&(v+=" SUV: "+parseFloat(y.toFixed(2)))}else v+=T}var M=t.pixelToCanvas(o,c);r.font=i,r.fillStyle=l;var P=void 0,S=r.measureText(v).width;P=!0===e.isTouchEvent?{x:-S/2-5,y:-p.default.getFontSize()-10-12}:{x:12,y:-(p.default.getFontSize()+10)/2},r.beginPath(),r.strokeStyle=l,r.arc(M.x,M.y,6,0,2*Math.PI),r.stroke(),(0,b.default)(r,v,M.x+P.x,M.y+P.y,l),r.restore()}}function l(e,t){var o=t.element;o.removeEventListener("cornerstoneimagerendered",u),f.default.$(o).off("CornerstoneToolsMouseDrag",s),f.default.$(o).off("CornerstoneToolsMouseUp",l),f.default.$(o).off("CornerstoneToolsMouseClick",l),f.default.cornerstone.updateImage(t.element)}function i(e,t){var o=t.element;if((0,I.default)(t.which,e.data.mouseButtonMask))return o.addEventListener("cornerstoneimagerendered",u),f.default.$(o).on("CornerstoneToolsMouseDrag",s),f.default.$(o).on("CornerstoneToolsMouseUp",l),f.default.$(o).on("CornerstoneToolsMouseClick",l),$.strategy(t),!1}function u(){k&&($.strategy(k),k=null)}function s(e,t){var o=t.element;return k=t,f.default.cornerstone.updateImage(o),!1}Object.defineProperty(t,"__esModule",{value:!0}),t.dragProbeTouch=t.dragProbe=void 0;var d=o(0),f=n(d),c=o(13),g=n(c),v=o(11),m=n(v),h=o(14),p=n(h),T=o(4),C=n(T),y=o(6),b=n(y),M=o(33),x=n(M),P=o(18),w=n(P),S=o(2),I=n(S),k=void 0,$=(0,g.default)(i);$.strategies={default:a,minimal:r},$.strategy=a;var _={fireOnTouchStart:!0},O=(0,m.default)(s,_);t.dragProbe=$,t.dragProbeTouch=O},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){return{visible:!0,active:!0,invalidated:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function r(e,t,o,n){var a=f.default.cornerstone,r=a.pixelToCanvas(e,t.handles.start),l=a.pixelToCanvas(e,t.handles.end),i={left:Math.min(r.x,l.x)+n/2,top:Math.min(r.y,l.y)+n/2,width:Math.abs(r.x-l.x)-n,height:Math.abs(r.y-l.y)-n},u={left:Math.min(r.x,l.x)-n/2,top:Math.min(r.y,l.y)-n/2,width:Math.abs(r.x-l.x)+n,height:Math.abs(r.y-l.y)+n},s=(0,I.default)(i,o);return!(!(0,I.default)(u,o)||s)}function l(e,t,o){return r(e,t,o,15)}function i(e,t,o){return r(e,t,o,25)}function u(e){var t=e.toString().split(".");return t[0]=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),t.join(".")}function s(e,t){var o=(0,D.getToolState)(e.currentTarget,E);if(o){var n=f.default.cornerstone,a=t.image,r=t.element,l=p.default.getToolWidth(),i=j.getConfiguration(),s=t.canvasContext.canvas.getContext("2d"),d=n.metaData.get("generalSeriesModule",a.imageId),c=void 0;d&&(c=d.modality),s.setTransform(1,0,0,1,0,0);for(var g=0;g=0&&o.data[g].active&&(n=r(t,g),void 0!==n?d(t,n):t.event.shiftKey?c.freehand=!0:a(t));return!1}}function c(e){var t=e.detail,o=(0,$.getToolState)(e.currentTarget,_);if(void 0!==o){var n=y.default.cornerstone,a=D.getConfiguration(),r=t.canvasContext.canvas.getContext("2d");r.setTransform(1,0,0,1,0,0);for(var l=void 0,i=M.default.getToolWidth(),u=P.default.getFillColor(),s=0;s0)){return{visible:!0,active:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0}}}}}function r(e,t,o){var n=s.default.cornerstone,a=n.pixelToCanvas(e,t.handles.start),r=n.pixelToCanvas(e,t.handles.end),l={left:Math.min(a.x,r.x),top:Math.min(a.y,r.y),width:Math.abs(a.x-r.x),height:Math.abs(a.y-r.y)},i=!1;return o.x>=l.left&&o.x<=l.left+l.width&&o.y>=l.top&&o.y<=l.top+l.height&&(i=!0),i}function l(e,t,o){var n=s.default.cornerstone,a=n.pixelToCanvas(e,t.handles.start),r=n.pixelToCanvas(e,t.handles.end),l={left:Math.min(a.x,r.x),top:Math.min(a.y,r.y),width:Math.abs(a.x-r.x),height:Math.abs(a.y-r.y)};return s.default.cornerstoneMath.rect.distanceToPoint(l,o)<5}function i(e,t){var o=(0,y.getToolState)(e.currentTarget,b);if(void 0!==o){var n=s.default.cornerstone,a=t.canvasContext.canvas.getContext("2d");a.setTransform(1,0,0,1,0,0);var r=void 0,l=m.default.getToolWidth();a.save();var i=o.data[0];if(i){r=i.active?p.default.getActiveColor():p.default.getToolColor();var u=n.pixelToCanvas(t.element,i.handles.start),d=n.pixelToCanvas(t.element,i.handles.end),f={left:Math.min(u.x,d.x),top:Math.min(u.y,d.y),width:Math.abs(u.x-d.x),height:Math.abs(u.y-d.y)};a.beginPath(),a.strokeStyle="transparent",a.rect(0,0,a.canvas.clientWidth,a.canvas.clientHeight),a.rect(f.width+f.left,f.top,-f.width,f.height),a.stroke(),a.fillStyle="rgba(0,0,0,0.7)",a.fill(),a.closePath(),a.beginPath(),a.strokeStyle=r,a.lineWidth=l,a.setLineDash([4]),a.strokeRect(f.left,f.top,f.width,f.height),a.setLineDash([]),(0,C.default)(a,t,i.handles,r),a.restore()}}}Object.defineProperty(t,"__esModule",{value:!0}),t.highlightTouch=t.highlight=void 0;var u=o(0),s=n(u),d=o(55),f=n(d),c=o(9),g=n(c),v=o(5),m=n(v),h=o(4),p=n(h),T=o(8),C=n(T),y=o(1),b="highlight",M=(0,f.default)({createNewMeasurement:a,onImageRendered:i,pointNearTool:l,pointInsideRect:r,toolType:b},!0),x=(0,g.default)({createNewMeasurement:a,onImageRendered:i,pointNearTool:l,pointInsideRect:r,toolType:b},!0);t.highlight=M,t.highlightTouch=x},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var o=t.image,n=o.stats,a=t.canvasContext.canvas.getContext("2d");a.setTransform(1,0,0,1,0,0);var r=[];Object.keys(n).forEach(function(e){var t=e+" : "+n[e];r.push(t)}),(0,u.default)(a,r,0,0,"orange"),r.forEach(function(e){console.log(e)})}Object.defineProperty(t,"__esModule",{value:!0});var r=o(24),l=n(r),i=o(6),u=n(i),s=(0,l.default)(a);t.default=s},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){return{visible:!0,active:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function r(e,t,o){var n=u.default.cornerstone,a={start:n.pixelToCanvas(e,t.handles.start),end:n.pixelToCanvas(e,t.handles.end)};return u.default.cornerstoneMath.lineSegment.distanceToPoint(a,o)<25}function l(e,t){var o=(0,b.getToolState)(e.currentTarget,M);if(o){var n=u.default.cornerstone,a=t.canvasContext.canvas.getContext("2d"),r=t.image,l=t.element;a.setTransform(1,0,0,1,0,0);var i=h.default.getToolWidth(),s=x.getConfiguration(),d=n.metaData.get("imagePlaneModule",r.imageId),f=void 0,c=void 0;d?(f=d.rowPixelSpacing||d.rowImagePixelSpacing,c=d.columnPixelSpacing||d.colImagePixelSpacing):(f=r.rowPixelSpacing,c=r.columnPixelSpacing);for(var g=0;g=2}},d=(0,u.default)(a);d.setConfiguration(s),t.default=d},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){return{visible:!0,active:!0,handles:{end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0}}}}function r(e,t,o){var n=u.default.cornerstone.pixelToCanvas(e,t.handles.end);return u.default.cornerstoneMath.point.distance(n,o)<5}function l(e,t){var o=(0,w.getToolState)(e.currentTarget,S);if(o){var n=u.default.cornerstone,a=t.canvasContext.canvas.getContext("2d");a.setTransform(1,0,0,1,0,0);for(var r=void 0,l=h.default.getFont(),i=h.default.getFontSize(),s=0;s=t.image.columns||c>=t.image.rows)return;if(t.image.color)m=f+", "+c,g=(0,M.default)(t.element,f,c,1,1),p="R: "+g[0]+" G: "+g[1]+" B: "+g[2];else{g=n.getStoredPixels(t.element,f,c,1,1);var C=g[0],b=C*t.image.slope+t.image.intercept,x=(0,P.default)(t.image,C);m=f+", "+c,p="SP: "+C+" MO: "+parseFloat(b.toFixed(3)),x&&(p+=" SUV: "+parseFloat(x.toFixed(3)))}var I={x:d.handles.end.x+3,y:d.handles.end.y-3},k=n.pixelToCanvas(t.element,I);a.font=l,a.fillStyle=r,(0,y.default)(a,p,k.x,k.y+i+5,r),(0,y.default)(a,m,k.x,k.y,r),a.restore()}}}Object.defineProperty(t,"__esModule",{value:!0}),t.probeTouch=t.probe=void 0;var i=o(0),u=n(i),s=o(7),d=n(s),f=o(9),c=n(f),g=o(4),v=n(g),m=o(14),h=n(m),p=o(8),T=n(p),C=o(6),y=n(C),b=o(33),M=n(b),x=o(18),P=n(x),w=o(1),S="probe",I=(0,d.default)({createNewMeasurement:a,onImageRendered:l,pointNearTool:r,toolType:S}),k=(0,c.default)({createNewMeasurement:a,onImageRendered:l,pointNearTool:r,toolType:S});t.probe=I,t.probeTouch=k},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){return{visible:!0,active:!0,invalidated:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function r(e,t,o){var n=d.default.cornerstone,a=n.pixelToCanvas(e,t.handles.start),r=n.pixelToCanvas(e,t.handles.end),l={left:Math.min(a.x,r.x),top:Math.min(a.y,r.y),width:Math.abs(a.x-r.x),height:Math.abs(a.y-r.y)};return d.default.cornerstoneMath.rect.distanceToPoint(l,o)<5}function l(e,t){for(var o=0,n=0,a=0,r=0,l=t.top;ll/2&&(C=-C);var b=void 0;if(!c.handles.textBox.hasMoved){b={x:g.x-p/2+C,y:g.y-T/2};var x=n.internal.getTransform(a);x.invert();var w=x.transformPoint(b.x,b.y);c.handles.textBox.x=w.x,c.handles.textBox.y=w.y}b=n.pixelToCanvas(t.element,c.handles.textBox);var I=(0,y.default)(r,h,b.x,b.y,i);if(c.handles.textBox.boundingBox=I,c.handles.textBox.hasMoved){var k={start:{},end:{}};k.end.x=b.x,k.end.y=b.y,k.start=g;var $=[{x:I.left+I.width/2,y:I.top},{x:I.left,y:I.top+I.height/2},{x:I.left+I.width/2,y:I.top+I.height},{x:I.left+I.width,y:I.top+I.height/2}];k.end=v.default.cornerstoneMath.point.findClosestPoint($,k.start),r.beginPath(),r.strokeStyle=i,r.lineWidth=u,r.setLineDash([2,3]),r.moveTo(k.start.x,k.start.y),r.lineTo(k.end.x,k.end.y),r.stroke()}}r.restore()}}}function d(e){function t(e){null===e?(0,N.removeToolState)(n,H,r):r.text=e,r.active=!1,o.updateImage(n)}var o=v.default.cornerstone,n=e.element,a=W.getConfiguration(),r=i(e);(0,N.addToolState)(n,H,r),o.updateImage(n),(0,_.default)(e,H,r,r.handles.end,function(){(0,k.default)(e,r.handles)&&(0,N.removeToolState)(n,H,r),void 0===r.text&&a.getTextCallback(t),o.updateImage(n)})}function f(e,t){function o(e,t,o){!0===o?(0,N.removeToolState)(a,H,e):e.text=t,e.active=!1,n.updateImage(a)}var n=v.default.cornerstone,a=t.element,r=void 0;if(!e.data||!e.data.mouseButtonMask||(0,L.default)(t.which,e.data.mouseButtonMask)){var l=W.getConfiguration(),i=t.currentPoints.canvas,s=(0,N.getToolState)(a,H);if(s){for(var d=0;d=t.markers.length&&(t.loop?a-=t.markers.length:a=-1):(a-=1)<0&&(t.loop?a+=t.markers.length:a=-1),t.current=t.markers[a],o}}}function r(e,t,o){if(t.handles.end.boundingBox){var n=d.default.cornerstoneMath.rect.distanceToPoint(t.handles.end.boundingBox,o),a=(0,h.default)(t.handles.end,o);return n<10||a}}function l(e,t){var o=(0,x.getToolState)(t.element,P);if(o){var n=t.canvasContext.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0);for(var a=w.getConfiguration(),r=0;ro.maxScale?e.scale=o.maxScale:o.minScale&&rn.maxScale?a.scale=n.maxScale:n.minScale&&a.scalel||s<0||s>r)){var C=(0,h.default)(m,r,l,u,s);(0,p.drawBrushPixels)(C,g,v,l),n.invalid=!0,f.default.cornerstone.updateImage(o)}}function r(e,t){y=t.currentPoints.image,b=!1}function l(e,t){a(t),b=!0,y=t.currentPoints.image}function i(e,t){y=t.currentPoints.image,f.default.cornerstone.updateImage(t.element)}function u(e,t){a(t),b=!0,y=t.currentPoints.image}function s(e,t){if(y){var o=t.image,n=o.rows,a=o.columns,r=y,l=r.x,i=r.y;if(!(l<0||l>a||i<0||i>n)){var u=M.getConfiguration(),s=u.radius,d=t.canvasContext,f=b?u.dragColor:u.hoverColor,c=t.element;d.setTransform(1,0,0,1,0,0);var g=(0,h.default)(s,n,a,l,i);(0,p.drawBrushOnCanvas)(g,d,f,c)}}}Object.defineProperty(t,"__esModule",{value:!0}),t.brush=void 0;var d=o(0),f=n(d),c=o(1),g=o(57),v=n(g),m=o(58),h=n(m),p=o(59),T="brush",C={draw:1,radius:3,hoverColor:"green",dragColor:"yellow"},y=void 0,b=!1,M=(0,v.default)({onMouseMove:i,onMouseDown:l,onMouseUp:r,onDrag:u,toolType:"brush",onImageRendered:s});M.setConfiguration(C),t.brush=M},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t,o){var n=k.getConfiguration(),a=n.tolerance,r=Number.MAX_VALUE,l=-Number.MAX_VALUE;e.forEach(function(e){var n=e[1]*o+e[0],a=t[n];r=Math.min(a,r),l=Math.max(a,l)}),w=r-a,P=l+a}function r(e,t,o,n){for(var a=k.getConfiguration(),r=a.draw,l=Math.round(x.x),i=Math.round(x.y),u=null,s=[],d=a.radius;0!==u&&d>a.minRadius;){u=0,s=(0,C.default)(d,o,n,l,i);for(var f=0;fP||ml||s<0||s>r)){var h=(0,C.default)(g,r,l,u,s);(0,y.drawBrushPixels)(h,f,c,l),n.invalid=!0,v.default.cornerstone.updateImage(o)}}function u(e,t){x=t.currentPoints.image;var o=k.getConfiguration();I=!1,S=o.radius,v.default.cornerstone.updateImage(t.element)}function s(e,t){var o=t.element,n=k.getConfiguration(),r=v.default.cornerstone.getLayer(o,n.brushLayerId),u=v.default.cornerstone.getLayers(o)[0],s=t.currentPoints.image,d=s.x,f=s.y,c=r.image,g=c.rows,m=c.columns,h=(0,C.default)(n.radius,g,m,d,f);0===n.draw?i(t):(a(h,u.image.getPixelData(),m),l(t)),I=!0,x=t.currentPoints.image}function d(e,t){x=t.currentPoints.image,v.default.cornerstone.updateImage(t.element)}function f(e,t){0===M.draw?i(t):l(t),I=!0,x=t.currentPoints.image}function c(e,t){if(x){var o=t.image,n=o.rows,a=o.columns,r=x,l=r.x,i=r.y;if(!(l<0||l>a||i<0||i>n)){var u=k.getConfiguration(),s=t.canvasContext,d=I?u.dragColor:u.hoverColor,f=t.element;S=S||u.radius,s.setTransform(1,0,0,1,0,0);var c=(0,C.default)(S,n,a,l,i);(0,y.drawBrushOnCanvas)(c,s,d,f)}}}Object.defineProperty(t,"__esModule",{value:!0}),t.adaptiveBrush=void 0;var g=o(0),v=n(g),m=o(1),h=o(57),p=n(h),T=o(58),C=n(T),y=o(59),b="brush",M={draw:1,radius:3,tolerance:5,minRadius:1,hoverColor:"green",dragColor:"yellow"},x=void 0,P=void 0,w=void 0,S=void 0,I=void 0,k=(0,p.default)({onMouseMove:d,onMouseDown:s,onMouseUp:u,onDrag:f,toolType:"adaptiveBrush",onImageRendered:c});k.setConfiguration(M),t.adaptiveBrush=k},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="1.1.2"}])}); +/*! cornerstone-tools - 2.0.0 - 2017-12-12 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstoneTools",[],t):"object"==typeof exports?exports.cornerstoneTools=t():e.cornerstoneTools=t()}(this,function(){return function(e){function t(n){if(a[n])return a[n].exports;var o=a[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var a={};return t.m=e,t.c=a,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=61)}([function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=window.cornerstone,o=window.cornerstoneMath,r=window.Hammer;t.default={set cornerstone(e){n=e},get cornerstone(){return n},set cornerstoneMath(e){o=e},get cornerstoneMath(){return o},set Hammer(e){r=e},get Hammer(){return r}}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={IMAGE_RENDERED:"cornerstoneimagerendered",NEW_IMAGE:"cornerstonenewimage",IMAGE_CACHE_PROMISE_REMOVED:"cornerstoneimagecachepromiseremoved",ELEMENT_DISABLED:"cornerstoneelementdisabled",MOUSE_DOWN:"cornerstonetoolsmousedown",MOUSE_UP:"cornerstonetoolsmouseup",MOUSE_DOWN_ACTIVATE:"cornerstonetoolsmousedownactivate",MOUSE_DRAG:"cornerstonetoolsmousedrag",MOUSE_MOVE:"cornerstonetoolsmousemove",MOUSE_CLICK:"cornerstonetoolsmouseclick",MOUSE_DOUBLE_CLICK:"cornerstonetoolsmousedoubleclick",MOUSE_WHEEL:"cornerstonetoolsmousewheel",TOUCH_START:"cornerstonetoolstouchstart",TOUCH_START_ACTIVE:"cornerstonetoolstouchstartactive",TOUCH_END:"cornerstonetoolstouchend",TOUCH_DRAG:"cornerstonetoolstouchdrag",TOUCH_DRAG_END:"cornerstonetoolstouchdragend",TOUCH_PINCH:"cornerstonetoolstouchpinch",TOUCH_ROTATE:"cornerstonetoolstouchrotate",TOUCH_PRESS:"cornerstonetoolstouchpress",TAP:"cornerstonetoolstap",DOUBLE_TAP:"cornerstonetoolsdoubletap",MULTI_TOUCH_START:"cornerstonetoolsmultitouchstart",MULTI_TOUCH_START_ACTIVE:"cornerstonetoolsmultitouchstartactive",MULTI_TOUCH_DRAG:"cornerstonetoolsmultitouchdrag",KEY_DOWN:"cornerstonetoolskeydown",KEY_UP:"cornerstonetoolskeyup",KEY_PRESS:"cornerstonetoolskeypress",MEASUREMENT_ADDED:"cornerstonetoolsmeasurementadded",MEASUREMENT_MODIFIED:"cornerstonetoolsmeasurementmodified",MEASUREMENT_REMOVED:"cornerstonemeasurementremoved",TOOL_DEACTIVATED:"cornerstonetoolstooldeactivated",CLIP_STOPPED:"cornerstonetoolsclipstopped",STACK_SCROLL:"cornerstonestackscroll",LINE_SAMPLE_UPDATED:"cornerstonelinesampleupdated"};t.default=n},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=v.default.cornerstone.getEnabledElement(e);return void 0===t.toolStateManager&&(t.toolStateManager=m.globalImageIdSpecificToolStateManager),t.toolStateManager}function r(e,t,a){o(e).add(e,t,a);var n=c.default.MEASUREMENT_ADDED,r={toolType:t,element:e,measurementData:a};(0,h.default)(e,n,r)}function i(e,t){return o(e).get(e,t)}function l(e,t,a){for(var n=o(e),r=n.get(e,t),i=-1,l=0;l2&&void 0!==arguments[2]?arguments[2]:null,n=void 0;return"function"==typeof window.CustomEvent?n=new CustomEvent(t,{detail:a,cancelable:!0}):(n=document.createEvent("CustomEvent"),n.initCustomEvent(t,!0,!0,a)),e.dispatchEvent(n)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,a){"use strict";function n(e){f=e}function o(){return f}function r(e){s=e}function i(){return s}function l(e){c=e}function d(){return c}function u(e){return e?c:s}Object.defineProperty(t,"__esModule",{value:!0});var s="white",c="greenyellow",f="transparent",v={setFillColor:n,getFillColor:o,setToolColor:r,getToolColor:i,setActiveColor:l,getActiveColor:d,getColorIfActive:u};t.default=v},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n,r,i){"[object Array]"!==Object.prototype.toString.call(t)&&(t=[t]);var l=o.default.getFont(),d=o.default.getFontSize(),u=o.default.getBackgroundColor();e.save(),e.font=l,e.textBaseline="top",e.strokeStyle=r;var s=0;t.forEach(function(t){var a=e.measureText(t).width;s=Math.max(s,a)}),e.fillStyle=u;var c={width:s+10,height:5+t.length*(d+5)};return i&&i.centering&&!0===i.centering.x&&(a-=c.width/2),i&&i.centering&&!0===i.centering.y&&(n-=c.height/2),c.left=a,c.top=n,i&&!0===i.debug&&(e.fillStyle="#FF0000"),e.fillRect(c.left,c.top,c.width,c.height),t.forEach(function(t,o){e.fillStyle=r,e.fillText(t,a+5,n+5+o*(d+5))}),e.restore(),c};var n=a(14),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,a){"use strict";function n(e){l=e}function o(){return l}function r(e){d=e}function i(){return d}Object.defineProperty(t,"__esModule",{value:!0});var l=1,d=2,u={setToolWidth:n,getToolWidth:o,setActiveWidth:r,getActiveWidth:i};t.default=u},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(t){var a=t.detail,n=a.element,r=(0,P.getToolOptions)(M,n);(0,x.default)(a.which,r.mouseButtonMask)&&(e.addNewMeasurement?e.addNewMeasurement(a):o(a),t.preventDefault(),t.stopPropagation())}function a(t){var a=t.detail;u.default.setCoords(a);var n=(0,_.getToolState)(a.element,M);if(n){for(var o=!1,r=0;r2&&void 0!==arguments[2]?arguments[2]:{};i.mouseButtonMask=n,(0,r.setToolOptions)(t,a,i),a.removeEventListener(o.default.MOUSE_DOWN_ACTIVATE,e),a.addEventListener(o.default.MOUSE_DOWN_ACTIVATE,e)},disable:function(t){t.removeEventListener(o.default.MOUSE_DOWN_ACTIVATE,e)},enable:function(t){t.removeEventListener(o.default.MOUSE_DOWN_ACTIVATE,e)},deactivate:function(t){t.removeEventListener(o.default.MOUSE_DOWN_ACTIVATE,e)},getConfiguration:function(){return a},setConfiguration:function(e){a=e}}};var n=a(1),o=function(e){return e&&e.__esModule?e:{default:e}}(n),r=a(3)},function(e,t,a){"use strict";function n(e){var t=r.default.cornerstoneMath;return e instanceof t.Vector3?e:new t.Vector3(e[0],e[1],e[2])}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n;var o=a(0),r=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,a){"use strict";function n(){function e(e){return d[e]}function t(e,t){d[e]=t}function a(){return d}function n(e){d=e}function o(e,t,a){var n=r.default.cornerstone.getEnabledElement(e);n.image&&!1!==d.hasOwnProperty(n.image.imageId)||(d[n.image.imageId]={});var o=d[n.image.imageId];!1===o.hasOwnProperty(t)&&(o[t]={data:[]}),o[t].data.push(a)}function i(e,t){var a=r.default.cornerstone.getEnabledElement(e);if(a.image&&!1!==d.hasOwnProperty(a.image.imageId)){var n=d[a.image.imageId];if(!1!==n.hasOwnProperty(t)){return n[t]}}}function l(e){var t=r.default.cornerstone.getEnabledElement(e);t.image&&!1!==d.hasOwnProperty(t.image.imageId)&&delete d[t.image.imageId]}var d={};return{get:i,add:o,clear:l,saveImageIdToolState:e,restoreImageIdToolState:t,saveToolState:a,restoreToolState:n,toolState:d}}Object.defineProperty(t,"__esModule",{value:!0}),t.globalImageIdSpecificToolStateManager=t.newImageIdSpecificToolStateManager=void 0;var o=a(0),r=function(e){return e&&e.__esModule?e:{default:e}}(o),i=n();t.newImageIdSpecificToolStateManager=n,t.globalImageIdSpecificToolStateManager=i},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e.boundingBox)return o.default.cornerstoneMath.point.insideRect(t,e.boundingBox)};var n=a(0),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,a){"use strict";function n(e){return parseFloat("."+e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var a=r.default.cornerstone,o=a.metaData.get("patientStudyModule",e.imageId),i=a.metaData.get("generalSeriesModule",e.imageId);if(o&&i){if("PT"===i.modality){var l=t*e.slope+e.intercept,d=o.patientWeight;if(d){var u=a.metaData.get("petIsotopeModule",e.imageId);if(u){var s=u.radiopharmaceuticalInfo,c=s.radiopharmaceuticalStartTime,f=s.radionuclideTotalDose,v=s.radionuclideHalfLife,m=i.seriesTime;if(c&&f&&v&&m){var g=n(m.fractionalSeconds||0)+m.seconds+60*m.minutes+60*m.hours*60,h=n(c.fractionalSeconds)+c.seconds+60*c.minutes+60*c.hours*60,p=g-h;return l*d/(f*Math.exp(-p*Math.log(2)/v))*1e3}}}}}};var o=a(0),r=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n){var o=void 0;if(t)return Object.keys(t).forEach(function(i){var d=t[i];if(d.hasOwnProperty("pointNearHandle")){if(d.pointNearHandle(e,d,a))return void(o=d)}else if(!0===d.hasBoundingBox){if((0,l.default)(d,a))return void(o=d)}else{var u=r.default.cornerstone.pixelToCanvas(e,d),s=r.default.cornerstoneMath.point.distance(u,a);if(s<=n)return void(o=d)}}),o};var o=a(0),r=n(o),i=a(19),l=n(i)},function(e,t,a){"use strict";function n(){var e=navigator.userAgent,t=e.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[],a=void 0;return/trident/i.test(t[1])?(a=/\brv[ :]+(\d+)/g.exec(e)||[],"IE "+(a[1]||"")):"Chrome"===t[1]&&null!==(a=e.match(/\b(OPR|Edge)\/(\d+)/))?a.slice(1).join(" ").replace("OPR","Opera"):(t=t[2]?[t[1],t[2]]:[navigator.appName,navigator.appVersion,"-?"],null!==(a=e.match(/version\/(\d+)/i))&&t.splice(1,1,a[1]),t.join(" "))}function o(e){d=e}function r(){return d||i()}function i(){var e=n(),t=e.split(" "),a=t[0],o=t[1],r=u[a];return r?r[o]?r[o]:r.default:u.default}function l(){return new RegExp("Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini").test(navigator.userAgent)}Object.defineProperty(t,"__esModule",{value:!0});var d=void 0,u={default:6,IE:{9:6,10:8,default:8},Firefox:{default:6},Opera:{10:8,11:6,12:6,default:6},Chrome:{default:6},Safari:{default:6}};t.getDefaultSimultaneousRequests=i,t.getMaxSimultaneousRequests=r,t.setMaxSimultaneousRequests=o,t.getBrowserInfo=n,t.isMobileDevice=l},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{activate:function(t){t.removeEventListener(o.default.MOUSE_WHEEL,e),t.addEventListener(o.default.MOUSE_WHEEL,e)},disable:function(t){t.removeEventListener(o.default.MOUSE_WHEEL,e)},enable:function(t){t.removeEventListener(o.default.MOUSE_WHEEL,e)},deactivate:function(t){t.removeEventListener(o.default.MOUSE_WHEEL,e)}}};var n=a(1),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n,o,i){function d(e){var o=e.detail;!1===n.hasMoved&&(n.hasMoved=!0),n.active=!0,n.x=o.currentPoints.image.x+v.x,n.y=o.currentPoints.image.y+v.y,i&&(n.x=Math.max(n.x,0),n.x=Math.min(n.x,o.image.width),n.y=Math.max(n.y,0),n.y=Math.min(n.y,o.image.height)),c.updateImage(f);var l=r.default.MEASUREMENT_MODIFIED,d={toolType:t,element:f,measurementData:a};(0,u.default)(f,l,d)}function s(){n.active=!1,f.removeEventListener(r.default.MOUSE_DRAG,d),f.removeEventListener(r.default.MOUSE_UP,s),f.removeEventListener(r.default.MOUSE_CLICK,s),c.updateImage(f),"function"==typeof o&&o()}var c=l.default.cornerstone,f=e.element,v={x:n.x-e.currentPoints.image.x,y:n.y-e.currentPoints.image.y};f.addEventListener(r.default.MOUSE_DRAG,d),f.addEventListener(r.default.MOUSE_UP,s),f.addEventListener(r.default.MOUSE_CLICK,s)};var o=a(1),r=n(o),i=a(0),l=n(i),d=a(5),u=n(d)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n,o,i){function d(e){var o=e.detail;n.active=!0,n.x=o.currentPoints.image.x,n.y=o.currentPoints.image.y,i&&(n.x=Math.max(n.x,0),n.x=Math.min(n.x,o.image.width),n.y=Math.max(n.y,0),n.y=Math.min(n.y,o.image.height)),m.updateImage(g);var l=r.default.MEASUREMENT_MODIFIED,d={toolType:t,element:g,measurementData:a};(0,u.default)(g,l,d)}function s(e){g.removeEventListener(r.default.MOUSE_MOVE,s),g.removeEventListener(r.default.MOUSE_DRAG,s),g.addEventListener(r.default.MOUSE_MOVE,d),g.addEventListener(r.default.MOUSE_DRAG,d),g.addEventListener(r.default.MOUSE_CLICK,v),e.type===r.default.MOUSE_DRAG&&g.addEventListener(r.default.MOUSE_UP,v)}function c(e){e.detail.measurementData===a&&v()}function f(e){e.detail.toolType===t&&(g.removeEventListener(r.default.MOUSE_MOVE,d),g.removeEventListener(r.default.MOUSE_DRAG,d),g.removeEventListener(r.default.MOUSE_CLICK,v),g.removeEventListener(r.default.MOUSE_UP,v),g.removeEventListener(r.default.MEASUREMENT_REMOVED,c),g.removeEventListener(r.default.TOOL_DEACTIVATED,f),n.active=!1,m.updateImage(g))}function v(){g.removeEventListener(r.default.MOUSE_MOVE,d),g.removeEventListener(r.default.MOUSE_DRAG,d),g.removeEventListener(r.default.MOUSE_CLICK,v),g.removeEventListener(r.default.MOUSE_UP,v),g.removeEventListener(r.default.MEASUREMENT_REMOVED,c),g.removeEventListener(r.default.TOOL_DEACTIVATED,f),n.active=!1,m.updateImage(g),"function"==typeof o&&o()}var m=l.default.cornerstone,g=e.element;g.addEventListener(r.default.MOUSE_DRAG,s),g.addEventListener(r.default.MOUSE_MOVE,s),g.addEventListener(r.default.MEASUREMENT_REMOVED,c),g.addEventListener(r.default.TOOL_DEACTIVATED,f)};var o=a(1),r=n(o),i=a(0),l=n(i),d=a(5),u=n(d)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t={};return{disable:function(t){t.removeEventListener(r.default.IMAGE_RENDERED,e)},enable:function(t){t.removeEventListener(r.default.IMAGE_RENDERED,e),t.addEventListener(r.default.IMAGE_RENDERED,e),l.default.cornerstone.updateImage(t)},getConfiguration:function(){return t},setConfiguration:function(e){t=e}}};var o=a(1),r=n(o),i=a(0),l=n(i)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n,o,i){function d(e){var o=e.detail;n.x=o.currentPoints.image.x+h.x,n.y=o.currentPoints.image.y+h.y,i&&(n.x=Math.max(n.x,0),n.x=Math.min(n.x,o.image.width),n.y=Math.max(n.y,0),n.y=Math.min(n.y,o.image.height)),v.updateImage(m);var l=r.default.MEASUREMENT_MODIFIED,d={toolType:t,element:m,measurementData:a};(0,u.default)(m,l,d)}function s(e){var t=e.detail;if(m.removeEventListener(r.default.TOUCH_DRAG,d),m.removeEventListener(r.default.TOUCH_PINCH,s),m.removeEventListener(r.default.TOUCH_END,s),m.removeEventListener(r.default.TAP,s),m.removeEventListener(r.default.TOUCH_START,c),m.removeEventListener(r.default.TOOL_DEACTIVATED,f),e.type===r.default.TOUCH_PINCH||e.type===r.default.TOUCH_PRESS)return n.active=!1,v.updateImage(m),void o();n.active=!1,a.active=!1,n.x=t.currentPoints.image.x+h.x,n.y=t.currentPoints.image.y+h.y,i&&(n.x=Math.max(n.x,0),n.x=Math.min(n.x,t.image.width),n.y=Math.max(n.y,0),n.y=Math.min(n.y,t.image.height)),v.updateImage(m),"function"==typeof o&&o()}function c(e){return e.stopImmediatePropagation(),!1}function f(){m.removeEventListener(r.default.TOUCH_DRAG,d),m.removeEventListener(r.default.TOUCH_PINCH,s),m.removeEventListener(r.default.TOUCH_END,s),m.removeEventListener(r.default.TAP,s),m.removeEventListener(r.default.TOUCH_START,c),m.removeEventListener(r.default.TOOL_DEACTIVATED,f),n.active=!1,a.active=!1,n.x=e.currentPoints.image.x+h.x,n.y=e.currentPoints.image.y+h.y,i&&(n.x=Math.max(n.x,0),n.x=Math.min(n.x,e.image.width),n.y=Math.max(n.y,0),n.y=Math.min(n.y,e.image.height)),v.updateImage(m)}var v=l.default.cornerstone,m=e.element,g=v.pageToPixel(m,e.currentPoints.page.x,e.currentPoints.page.y+50),h={x:n.x-g.x,y:n.y-g.y};n.active=!0,a.active=!0,m.addEventListener(r.default.TOUCH_DRAG,d),m.addEventListener(r.default.TOUCH_PINCH,s),m.addEventListener(r.default.TOUCH_END,s),m.addEventListener(r.default.TAP,s),m.addEventListener(r.default.TOUCH_START,c),m.addEventListener(r.default.TOOL_DEACTIVATED,f)};var o=a(1),r=n(o),i=a(0),l=n(i),d=a(5),u=n(d)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var a=(0,f.default)(t.rowCosines),n=(0,f.default)(t.columnCosines),o=(0,f.default)(t.imagePositionPatient),r=e.clone().sub(o);return{x:a.dot(r)/t.columnPixelSpacing,y:n.dot(r)/t.rowPixelSpacing}}function r(e,t){var a=(0,f.default)(t.rowCosines),n=(0,f.default)(t.columnCosines),o=(0,f.default)(t.imagePositionPatient),r=a.clone().multiplyScalar(e.x);r.multiplyScalar(t.columnPixelSpacing);var i=n.clone().multiplyScalar(e.y);i.multiplyScalar(t.rowPixelSpacing);var l=r.add(i);return l.add(o),l}function i(e){var t=r({x:0,y:0},e),a=r({x:e.columns,y:0},e),n=r({x:0,y:e.rows},e),o=r({x:e.columns,y:e.rows},e);return{top:new s.default.cornerstoneMath.Line3(t,a),left:new s.default.cornerstoneMath.Line3(t,n),right:new s.default.cornerstoneMath.Line3(a,o),bottom:new s.default.cornerstoneMath.Line3(n,o)}}function l(e,t){var a=[];return Object.keys(t).forEach(function(n){var o=t[n],r=e.intersectLine(o);r&&a.push(r)}),a}function d(e,t){var a=(0,f.default)(e.rowCosines),n=(0,f.default)(e.columnCosines),o=(0,f.default)(e.imagePositionPatient),d=(0,f.default)(t.rowCosines),u=(0,f.default)(t.columnCosines),c=(0,f.default)(t.imagePositionPatient),v=a.clone().cross(n),m=new s.default.cornerstoneMath.Plane;m.setFromNormalAndCoplanarPoint(v,o);var g=d.clone().cross(u),h=new s.default.cornerstoneMath.Plane;h.setFromNormalAndCoplanarPoint(g,c);var p=h.clone().intersectPlane(m),E=p.origin,T=p.direction,M=r({x:t.columns,y:t.rows},t),y=c.distanceTo(M),O=new s.default.cornerstoneMath.Line3;O.start=E,O.end=E.clone().add(T.multiplyScalar(y));var x=i(t),_=l(O,x);if(2===_.length)return{start:_[0],end:_[1]}}Object.defineProperty(t,"__esModule",{value:!0}),t.projectPatientPointToImagePlane=o,t.imagePointToPatientPoint=r,t.planePlaneIntersection=d;var u=a(0),s=n(u),c=a(17),f=n(c)},function(e,t,a){"use strict";function n(e,t,a,n,o,r){if(!v.hasOwnProperty(a))throw new Error("Request type must be one of interaction, thumbnail, or prefetch");if(e&&t){var i={type:a,imageId:t,preventCache:n,doneCallback:o,failCallback:r},l=c.default.cornerstone.imageCache.getImageLoadObject(t);if(l)return void l.promise.then(function(e){o(e)},function(e){r(e)});v[a].push(i)}}function o(e){if(!v.hasOwnProperty(e))throw new Error("Request type must be one of interaction, thumbnail, or prefetch");v[e]=[]}function r(){h&&setTimeout(function(){l()},p)}function i(e){var t=c.default.cornerstone,a=e.type;m[a]++,h=!0;var n=e.imageId,o=e.doneCallback,i=e.failCallback,l=t.imageCache.getImageLoadObject(n);if(l)return void l.promise.then(function(e){m[a]--,o(e),r()},function(e){m[a]--,i(e),r()});var d=function(e){return"prefetch"===e.type?-5:"interactive"===e.type?0:"thumbnail"===e.type?5:void 0}(e),u=void 0;u=!0===e.preventCache?t.loadImage(n,{priority:d,type:e.type}):t.loadAndCacheImage(n,{priority:d,type:e.type}),u.then(function(e){m[a]--,o(e),r()},function(e){m[a]--,i(e),r()})}function l(){var e=(0,f.getMaxSimultaneousRequests)();g={interaction:Math.max(e,1),thumbnail:Math.max(e-2,1),prefetch:Math.max(e-1,1)};for(var t=m.interaction+m.thumbnail+m.prefetch,a=e-t,n=0;n2&&void 0!==arguments[2]&&arguments[2],n=(0,r.getToolState)(e,"stack");if(n&&n.data&&n.data.length){var i=n.data[0],l=i.currentImageIdIndex+t;if(a){l%=i.imageIds.length}else l=Math.min(i.imageIds.length-1,l),l=Math.max(0,l);(0,o.default)(e,l)}};var n=a(44),o=function(e){return e&&e.__esModule?e:{default:e}}(n),r=a(2)},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var a=Math.pow(10,t);return Math.round(e*a)/a}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var a=e.width/2,n=e.height/2;if(a<=0||n<=0)return!1;var o={x:e.left+a,y:e.top+n},r={x:t.x-o.x,y:t.y-o.y};return r.x*r.x/(a*a)+r.y*r.y/(n*n)<=1}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.cancelBubble=!0,e.returnValue=!1,!1}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n,r){if(!e)throw new Error("getRGBPixels: parameter element must not be undefined");t=Math.round(t),a=Math.round(a);var i=o.default.cornerstone.getEnabledElement(e),l=[],d=0,u=i.image.getPixelData(),s=void 0,c=void 0,f=void 0;if(i.image.color)for(c=0;c=l.stacks.length&&(c=0),c<0&&(c=l.stacks.length-1)):(c=Math.min(l.stacks.length-1,c),c=Math.max(0,c)),c!==l.currentStackIndex){var f=o.getViewport(e),v=l.stacks[c],m=d.default.getStartLoadHandler(),g=d.default.getEndLoadHandler(),h=d.default.getErrorLoadingHandler();m&&m(e);var p=void 0;p=!0===v.preventCache?o.loadImage(v.imageIds[s]):o.loadAndCacheImage(v.imageIds[s]),p.then(function(t){l.currentImageIdIndex!==s&&(v.currentImageIdIndex=s,l.currentStackIndex=c,o.displayImage(e,t,f),g&&g(e,t))},function(t){var a=v.imageIds[s];h&&h(e,a,t)})}}};var o=a(0),r=n(o),i=a(2),l=a(12),d=n(l)},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var a=(0,n.planePlaneIntersection)(e,t);if(a)return{start:(0,n.projectPatientPointToImagePlane)(a.start,e),end:(0,n.projectPatientPointToImagePlane)(a.end,e)}};var n=a(28)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n){var o=r.default.cornerstone,i=o.getEnabledElement(a).image,d=o.getEnabledElement(n).image;if(i&&d){var s=o.metaData.get("imagePlaneModule",i.imageId),f=o.metaData.get("imagePlaneModule",d.imageId);if(s&&f&&s.rowCosines&&s.columnCosines&&s.imagePositionPatient&&f.rowCosines&&f.columnCosines&&f.imagePositionPatient&&s.frameOfReferenceUID===f.frameOfReferenceUID){s.rowCosines=(0,v.default)(s.rowCosines),s.columnCosines=(0,v.default)(s.columnCosines),s.imagePositionPatient=(0,v.default)(s.imagePositionPatient),f.rowCosines=(0,v.default)(f.rowCosines),f.columnCosines=(0,v.default)(f.columnCosines),f.imagePositionPatient=(0,v.default)(f.imagePositionPatient);var m=s.rowCosines.clone().cross(s.columnCosines),g=f.rowCosines.clone().cross(f.columnCosines),h=m.angleTo(g);if(!((h=Math.abs(h))<.5)){var p=(0,l.default)(s,f);if(p){var E=o.pixelToCanvas(t.element,p.start),T=o.pixelToCanvas(t.element,p.end),M=u.default.getActiveColor(),y=c.default.getToolWidth();e.setTransform(1,0,0,1,0,0),e.save(),e.beginPath(),e.strokeStyle=M,e.lineWidth=y,e.moveTo(E.x,E.y),e.lineTo(T.x,T.y),e.stroke(),e.restore()}}}}};var o=a(0),r=n(o),i=a(41),l=n(i),d=a(6),u=n(d),s=a(8),c=n(s),f=a(17),v=n(f)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=a(64),r=n(o),i=a(65),l=n(i),d={getOrientationString:r.default,invertOrientationString:l.default};t.default=d},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){function a(a){if(m.currentImageIdIndex===t){try{i.getEnabledElement(e)}catch(e){return}u?(u.currentImageIdIndex=t,u.render(e,o.data)):i.displayImage(e,a),p&&p(e,a)}}function n(a){var n=m.imageIds[t];E&&E(e,n,a)}var o=(0,d.getToolState)(e,"stack");if(o&&o.data&&o.data.length){var i=l.default.cornerstone,u=void 0;if(o.data.length>1){var c=(0,d.getToolState)(e,"stackRenderer");c&&c.data&&c.data.length&&(u=c.data[0])}var m=o.data[0];t<0&&(t+=m.imageIds.length);var h=f.default.getStartLoadHandler(),p=f.default.getEndLoadHandler(),E=f.default.getErrorLoadingHandler();if(t!==m.currentImageIdIndex){h&&h(e);var T={newImageIdIndex:t,direction:t-m.currentImageIdIndex};m.currentImageIdIndex=t;var M=m.imageIds[t],y=v.stackScroll.getConfiguration();y&&y.retryLoadOnScroll;var O=Boolean(m.preventCache),x=void 0;x=O?i.loadImage(M):i.loadAndCacheImage(M),x.then(a,n),s.default.startGrabbing(),(0,g.default)(e,r.default.STACK_SCROLL,T)}}};var o=a(1),r=n(o),i=a(0),l=n(i),d=a(2),u=a(29),s=n(u),c=a(12),f=n(c),v=a(45),m=a(5),g=n(m)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.detail,a=t.element;a.removeEventListener(s.default.MOUSE_DRAG,l),a.removeEventListener(s.default.MOUSE_UP,o),a.removeEventListener(s.default.MOUSE_CLICK,o)}function r(e){var t=e.detail,a=t.element,n=(0,_.getToolOptions)(b,a);if((0,M.default)(t.which,n.mouseButtonMask)){var r={deltaY:0};return a.addEventListener(s.default.MOUSE_DRAG,r,l),a.addEventListener(s.default.MOUSE_UP,o),a.addEventListener(s.default.MOUSE_CLICK,o),e.stopImmediatePropagation(),!1}}function i(e){var t=e.detail,a=-t.direction,n=S.getConfiguration(),o=!1;n&&n.loop&&(o=n.loop),(0,O.default)(t.element,a,o)}function l(e){var t=e.detail,a=t.element,n=(0,x.getToolState)(a,"stack");if(n&&n.data&&n.data.length){var o=n.data[0],r=S.getConfiguration(),i=Math.max(2,a.offsetHeight/Math.max(o.imageIds.length,8));if(r&&r.stackScrollSpeed&&(i=r.stackScrollSpeed),e.data.deltaY=e.data.deltaY||0,e.data.deltaY+=t.deltaPoints.page.y,Math.abs(e.data.deltaY)>=i){var l=e.data.deltaY/i,d=Math.round(l),u=e.data.deltaY%i;e.data.deltaY=u,(0,O.default)(a,d)}e.preventDefault(),e.stopPropagation()}}function d(e){var t=e.detail,a=L.getConfiguration();a&&a.testPointers(t)&&l(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.stackScrollMultiTouch=t.stackScrollTouchDrag=t.stackScrollWheel=t.stackScroll=void 0;var u=a(1),s=n(u),c=a(13),f=n(c),v=a(30),m=n(v),g=a(16),h=n(g),p=a(23),E=n(p),T=a(4),M=n(T),y=a(31),O=n(y),x=a(2),_=a(3),b="stackScroll",S=(0,h.default)(r,b),P=(0,E.default)(i),C={eventData:{deltaY:0}},I=(0,f.default)(l,C),w={testPointers:function(e){return e.numPointers>=3}},L=(0,m.default)(d,C);L.setConfiguration(w),t.stackScroll=S,t.stackScrollWheel=P,t.stackScrollTouchDrag=I,t.stackScrollMultiTouch=L},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n,r){if(!e)throw new Error("getLuminance: parameter element must not be undefined");t=Math.round(t),a=Math.round(a);var i=o.default.cornerstone.getEnabledElement(e),l=i.image,d=[],u=0,s=l.getPixelData(),c=void 0,f=void 0,v=void 0;if(l.color)for(f=0;fr.y?t.y-=s:t.y3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=Math.round(n),i=Math.round(o);if(1===e)return[[r,i]];for(var l=[],d=0,u=-e;u<=e;u++){var s=i+u;if(!(s>t||s<0))for(var c=-e;c<=e;c++){var f=r+c;f>a||f<0||c*c+u*u1e-4&&d.x>d.y&&d.x>d.z)a+=n,d.x=0;else if(d.y>1e-4&&d.y>d.x&&d.y>d.z)a+=o,d.y=0;else{if(!(d.z>1e-4&&d.z>d.x&&d.z>d.y))break;a+=i,d.z=0}return a};var o=a(0),r=n(o),i=a(17),l=n(i)},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.replace("H","f");return t=t.replace("F","h"),t=t.replace("R","l"),t=t.replace("L","r"),t=t.replace("A","p"),t=t.replace("P","a"),t=t.toUpperCase()}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a){return o.default.cornerstone.setToPixelCoordinateSystem(e,t,.1),{fontSize:a/e.viewport.scale/.1,lineHeight:a/e.viewport.scale/.1,fontScale:.1}};var n=a(0),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=d.default.cornerstone,a=[];e.timeSeries.stacks.forEach(function(n){var o=void 0;o=!0===n.preventCache?t.loadImage(n.imageIds[e.imageIdIndex]):t.loadAndCacheImage(n.imageIds[e.imageIdIndex]),o.then(function(t){var n=Math.round(e.handles.end.x)+Math.round(e.handles.end.y)*t.width,o=t.getPixelData()[n];a.push(o)})}),e.lineSample.set(a)}function r(e){var t=(0,v.getToolState)(e.element,"timeSeries");if(void 0!==t&&void 0!==t.data&&0!==t.data.length){var a=t.data[0],n={timeSeries:a,lineSample:new p.default,imageIdIndex:a.stacks[a.currentStackIndex].currentImageIdIndex,visible:!0,handles:{end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0}}};return o(n),g.default.add(n),n}}function i(e){var t=d.default.cornerstone,a=e.detail,n=(0,v.getToolState)(e.currentTarget,O);if(n){var o=a.canvasContext;o.setTransform(1,0,0,1,0,0);for(var r=T.default.getFont(),i=0;i0?(0,l.default)(e,1,!0):(0,l.default)(e,-1,!0)},1e3/Math.abs(o.framesPerSecond)))}}function o(e){var t=(0,r.getToolState)(e,d);if(t&&t.data&&t.data.length){var a=t.data[0];clearInterval(a.intervalId),a.intervalId=void 0}}Object.defineProperty(t,"__esModule",{value:!0});var r=a(2),i=a(40),l=function(e){return e&&e.__esModule?e:{default:e}}(i),d="timeSeriesPlayer",u={start:n,stop:o};t.default=u},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.detail,a=t.element;a.removeEventListener(s.default.MOUSE_DRAG,i),a.removeEventListener(s.default.MOUSE_UP,o),a.removeEventListener(s.default.MOUSE_CLICK,o)}function r(e){var t=e.detail,a=t.element,n=(0,O.getToolOptions)(x,a);if((0,M.default)(t.which,n.mouseButtonMask))return n.deltaY=0,(0,O.setToolOptions)(x,a,n),a.addEventListener(s.default.MOUSE_DRAG,i),a.addEventListener(s.default.MOUSE_UP,o),a.addEventListener(s.default.MOUSE_CLICK,o),e.stopImmediatePropagation(),!1}function i(e){var t=e.detail,a=t.element;e.data.deltaY+=t.deltaPoints.page.y;var n=(0,y.getToolState)(t.element,"timeSeries");if(void 0!==n&&void 0!==n.data&&0!==n.data.length){var o=n.data[0],r=a.offsetHeight/o.stacks.length;if(void 0!==e.data.options&&void 0!==e.data.options.timeSeriesScrollSpeed&&(r=e.data.options.timeSeriesScrollSpeed),e.data.deltaY>=r||e.data.deltaY<=-r){var i=Math.round(e.data.deltaY/r),l=e.data.deltaY%r;(0,E.default)(t.element,i),e.data.deltaY=l}return!1}}function l(e){var t=e.detail,a=-t.direction;(0,E.default)(t.element,a)}function d(e){var t=e.originalEvent.detail,a={deltaY:0};a.deltaY+=t.deltaPoints.page.y;var n=(0,y.getToolState)(t.element,"stack");if(void 0!==n&&void 0!==n.data&&0!==n.data.length){if(a.deltaY>=3||a.deltaY<=-3){var o=a.deltaY/3,r=a.deltaY%3;(0,E.default)(a.element,o),a.deltaY=r}return!1}}Object.defineProperty(t,"__esModule",{value:!0}),t.timeSeriesScrollTouchDrag=t.timeSeriesScrollWheel=t.timeSeriesScroll=void 0;var u=a(1),s=n(u),c=a(16),f=n(c),v=a(13),m=n(v),g=a(23),h=n(g),p=a(40),E=n(p),T=a(4),M=n(T),y=a(2),O=a(3),x="timeSeriesScroll",_=(0,f.default)(r,x),b=(0,h.default)(l),S=(0,m.default)(d);t.timeSeriesScroll=_,t.timeSeriesScrollWheel=b,t.timeSeriesScrollTouchDrag=S},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a){if(a!==t){var n=o.default.cornerstone,r=n.getViewport(t),i=n.getViewport(a);i.voi.windowWidth===r.voi.windowWidth&&i.voi.windowCenter===r.voi.windowCenter&&i.invert===r.invert||(i.voi.windowWidth=r.voi.windowWidth,i.voi.windowCenter=r.voi.windowCenter,i.invert=r.invert,e.setViewport(a,i))}};var n=a(0),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a){a!==t&&o.default.cornerstone.updateImage(a)};var n=a(0),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return e.filter(function(e,t,a){return a.indexOf(e)===t})}function r(e,t){function a(e,t){s.length&&f.length&&(v=!0,f.forEach(function(a){var n=f.indexOf(a);if(-1!==n){var o=m.imageIds.targetElements[n],r=s.indexOf(e);if(-1!==r){var i=m.imageIds.sourceElements[r],l=void 0;i===o?l=0:void 0!==m.distances[i]&&(l=m.distances[i][o]),g(d,e,a,t,l)}}}),v=!1)}function n(e){var t=e.detail;!0!==v&&a(e.currentTarget,t)}function r(e){var t=e.detail.element;d.remove(t)}var i=u.default.cornerstone,d=this,s=[],f=[],v=!1,m={},g=t;this.setHandler=function(e){g=e},this.getHandler=function(){return g},this.getDistances=function(){s.length&&f.length&&(m.distances={},m.imageIds={sourceElements:[],targetElements:[]},s.forEach(function(e){var t=i.getEnabledElement(e);if(t&&t.image){var a=t.image.imageId,n=i.metaData.get("imagePlaneModule",a);if(n&&n.imagePositionPatient){var o=(0,c.default)(n.imagePositionPatient);m.hasOwnProperty(t)||(m.distances[a]={},m.imageIds.sourceElements.push(a),f.forEach(function(t){var n=i.getEnabledElement(t);if(n&&n.image){var r=n.image.imageId;if(m.imageIds.targetElements.push(r),e!==t&&a!==r&&!m.distances[a].hasOwnProperty(r)){var l=i.metaData.get("imagePlaneModule",r);if(l&&l.imagePositionPatient){var d=(0,c.default)(l.imagePositionPatient);m.distances[a][r]=d.clone().sub(o)}}}}),Object.keys(m.distances[a]).length||delete m.distances[a])}}}))},this.addSource=function(t){-1===s.indexOf(t)&&(s.push(t),t.addEventListener(e,n),d.getDistances(),d.updateDisableHandlers())},this.addTarget=function(e){-1===f.indexOf(e)&&(f.push(e),d.getDistances(),g(d,e,e,0),d.updateDisableHandlers())},this.add=function(e){d.addSource(e),d.addTarget(e)},this.removeSource=function(t){var o=s.indexOf(t);-1!==o&&(s.splice(o,1),t.removeEventListener(e,n),d.getDistances(),a(t),d.updateDisableHandlers())},this.removeTarget=function(e){var t=f.indexOf(e);-1!==t&&(f.splice(t,1),d.getDistances(),g(d,e,e,0),d.updateDisableHandlers())},this.remove=function(e){d.removeTarget(e),d.removeSource(e)},this.getSourceElements=function(){return s},this.getTargetElements=function(){return f},this.displayImage=function(e,t,a){v=!0,i.displayImage(e,t,a),v=!1},this.setViewport=function(e,t){v=!0,i.setViewport(e,t),v=!1},this.updateDisableHandlers=function(){o(s.concat(f)).forEach(function(e){e.removeEventListener(l.default.ELEMENT_DISABLED,r),e.addEventListener(l.default.ELEMENT_DISABLED,r)})},this.destroy=function(){o(s.concat(f)).forEach(function(e){d.remove(e)})}}Object.defineProperty(t,"__esModule",{value:!0});var i=a(1),l=n(i),d=a(0),u=n(d),s=a(17),c=n(s);t.default=r},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,n){if(t!==a&&n&&n.direction){var o=r.default.cornerstone,l=(0,i.getToolState)(a,"stack"),u=l.data[0],s=u.currentImageIdIndex+n.direction;if(s=Math.min(Math.max(s,0),u.imageIds.length-1),u.currentImageIdIndex!==s){var c=d.default.getStartLoadHandler(),f=d.default.getEndLoadHandler(),v=d.default.getErrorLoadingHandler();c&&c(a);var m=void 0;m=!0===u.preventCache?o.loadImage(u.imageIds[s]):o.loadAndCacheImage(u.imageIds[s]),m.then(function(t){var n=o.getViewport(a);u.currentImageIdIndex=s,e.displayImage(a,t,n),f&&f(a,t)},function(e){var t=u.imageIds[s];v&&v(a,t,e)})}}};var o=a(0),r=n(o),i=a(2),l=a(12),d=n(l)},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a){if(a!==t){var n=r.default.cornerstone,o=n.getEnabledElement(t).image,l=n.metaData.get("imagePlaneModule",o.imageId);if(void 0!==l&&void 0!==l.imagePositionPatient){var u=(0,s.default)(l.imagePositionPatient),c=(0,i.getToolState)(a,"stack"),f=c.data[0],v=Number.MAX_VALUE,m=-1;if(f.imageIds.forEach(function(e,t){var a=n.metaData.get("imagePlaneModule",e);if(void 0!==a&&void 0!==a.imagePositionPatient){var o=(0,s.default)(a.imagePositionPatient),r=o.distanceToSquared(u);r=0))return t.add(a,n,r);!1===o.hasOwnProperty(n)&&(o[n]={data:[]}),o[n].data.push(r)}function n(a,n){return e.indexOf(n)>=0?(!1===o.hasOwnProperty(n)&&(o[n]={data:[]}),o[n]):t.get(a,n)}var o={};return{get:n,add:a}}function o(e,t){t=t||["timeSeries"];var a=(0,i.getElementToolStateManager)(e);void 0===a&&(a=r.globalImageIdSpecificToolStateManager);var o=n(t,a);l.push(o),(0,i.setElementToolStateManager)(e,o)}Object.defineProperty(t,"__esModule",{value:!0}),t.newTimeSeriesSpecificToolStateManager=t.addTimeSeriesStateManager=void 0;var r=a(18),i=a(2),l=[];t.addTimeSeriesStateManager=o,t.newTimeSeriesSpecificToolStateManager=n},function(e,t,a){"use strict";function n(e,t){function a(){return i}function n(e){i=e}function o(a,n,o){if(!(e.indexOf(n)>=0))return t.add(a,n,o);!1===i.hasOwnProperty(n)&&(i[n]={data:[]}),i[n].data.push(o)}function r(a,n){return e.indexOf(n)>=0?(!1===i.hasOwnProperty(n)&&(i[n]={data:[]}),i[n]):t.get(a,n)}var i={};return{get:r,add:o,saveToolState:a,restoreToolState:n,toolState:i}}function o(e,t){var a=(0,i.getElementToolStateManager)(e);a||(a=r.globalImageIdSpecificToolStateManager);var o=["stack","stackPrefetch","playClip","volume","slab","referenceLines","crosshairs","stackRenderer"];t&&(o=o.concat(t));var d=n(o,a);l.push(d),(0,i.setElementToolStateManager)(e,d)}Object.defineProperty(t,"__esModule",{value:!0}),t.addStackStateManager=t.newStackSpecificToolStateManager=t.stackSpecificStateManager=void 0;var r=a(18),i=a(2),l=[],d={newStackSpecificToolStateManager:n,addStackStateManager:o};t.stackSpecificStateManager=d,t.newStackSpecificToolStateManager=n,t.addStackStateManager=o},function(e,t,a){"use strict";function n(){function e(e,t,a){!1===n.hasOwnProperty(e)&&(n[e]={});var o=n[e];!1===o.hasOwnProperty(t)&&(o[t]={data:[]}),o[t].data.push(a)}function t(e,t){if(!1!==n.hasOwnProperty(e)){var a=n[e];if(!1!==a.hasOwnProperty(t)){return a[t]}}}function a(e,t,a){if(!1!==n.hasOwnProperty(e)){var o=n[e];if(!1!==o.hasOwnProperty(t)){for(var r=o[t],i=-1,l=0;lt&&n.push(e)}),{low:e.indexOf(C(a)),high:e.indexOf(I(n))}}function i(e){function t(e){var t=d.indicesToRequest.indexOf(e);t>-1&&d.indicesToRequest.splice(t,1)}function a(e){t(i.imageIds.indexOf(e.imageId))}function n(t){console.log("prefetch errored: "+t),f&&f(e,s,t,"stackPrefetch")}var o=(0,y.getToolState)(e,"stack");if(o&&o.data&&o.data.length){var i=o.data[0],l=(0,y.getToolState)(e,x);if(l){var d=l.data[0]||{};if(d.indicesToRequest&&d.indicesToRequest.length||(d.enabled=!1),!1!==d.enabled){l.data[0].indicesToRequest.sort(function(e,t){return e-t});if(d.indicesToRequest.slice().forEach(function(e){var a=i.imageIds[e];if(a){h.default.cornerstone.imageCache.getImageLoadObject(a)&&t(e)}}),d.indicesToRequest.length){E.default.clearRequestStack(_);for(var u=r(d.indicesToRequest,i.currentImageIdIndex),s=void 0,c=void 0,f=M.default.getErrorLoadingHandler(),v=u.low,m=u.high;v>=0||mb.maxImagesToPrefetch,T=d.indicesToRequest[m]-g>b.maxImagesToPrefetch,O=!p&&v>=0,S=!T&&m0&&(o=l.isTimeVarying?r/l.length|0:l[0],l.push(o)),l}function r(e){var t=e.intervalId;void 0!==t&&(e.intervalId=void 0,e.usingFrameTimeVector?clearTimeout(t):clearInterval(t))}function i(e){var t={element:e};(0,p.default)(e,s.default.CLIP_STOPPED,t)}function l(e,t){var a=void 0,n=void 0;if(void 0===e)throw new Error("playClip: element must not be undefined");var l=(0,g.getToolState)(e,"stack");if(l&&l.data&&l.data.length){var d=f.default.cornerstone,u=void 0;if(l.data.length>1){var s=(0,g.getToolState)(e,"stackRenderer");s&&s.data&&s.data.length&&(u=s.data[0])}var c=l.data[0],v=(0,g.getToolState)(e,E);v&&v.data&&v.data.length?(a=v.data[0],r(a)):(a={intervalId:void 0,framesPerSecond:30,lastFrameTimeStamp:void 0,frameRate:0,frameTimeVector:void 0,ignoreFrameTimeVector:!1,usingFrameTimeVector:!1,speed:1,reverse:!1,loop:!0},(0,g.addToolState)(e,E,a)),(t<0||t>0)&&(a.framesPerSecond=Number(t),a.reverse=a.framesPerSecond<0,a.ignoreFrameTimeVector=!0),!0!==a.ignoreFrameTimeVector&&a.frameTimeVector&&a.frameTimeVector.length===c.imageIds.length&&(n=o(a.frameTimeVector,a.speed));var h=function(){var t=void 0,n=void 0,o=void 0,s=void 0,f=c.currentImageIdIndex,v=c.imageIds.length;if(a.reverse?f--:f++,!a.loop&&(f<0||f>=v))return r(a),void i(e);f>=v&&(f=0),f<0&&(f=v-1),f!==c.currentImageIdIndex&&(n=m.default.getStartLoadHandler(),o=m.default.getEndLoadHandler(),s=m.default.getErrorLoadingHandler(),n&&n(e),t=!0===c.preventCache?d.loadImage(c.imageIds[f]):d.loadAndCacheImage(c.imageIds[f]),t.then(function(t){try{c.currentImageIdIndex=f,u?(u.currentImageIdIndex=f,u.render(e,l.data)):d.displayImage(e,t),o&&o(e,t)}catch(e){return}},function(t){var a=c.imageIds[f];s&&s(e,a,t)}))};n&&n.length>0&&n.isTimeVarying?(a.usingFrameTimeVector=!0,a.intervalId=setTimeout(function e(){a.intervalId=setTimeout(e,n[c.currentImageIdIndex]),h()},0)):(a.usingFrameTimeVector=!1,a.intervalId=setInterval(h,1e3/Math.abs(a.framesPerSecond)))}}function d(e){var t=(0,g.getToolState)(e,E);t&&t.data&&t.data.length&&r(t.data[0])}Object.defineProperty(t,"__esModule",{value:!0}),t.stopClip=t.playClip=void 0;var u=a(1),s=n(u),c=a(0),f=n(c),v=a(12),m=n(v),g=a(2),h=a(5),p=n(h),E="playClip";t.playClip=l,t.stopClip=d},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=c.default.cornerstone,a=e.currentTarget,n={event:window.event||e,element:a,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,currentPoints:{page:{x:m,y:g},image:t.pageToPixel(a,m,g)},keyCode:e.keyCode,which:e.which};n.currentPoints.canvas=t.pixelToCanvas(a,n.currentPoints.image);var o={keydown:u.default.KEY_DOWN,keypress:u.default.KEY_PRESS,keyup:u.default.KEY_UP};(0,v.default)(a,o[e.type],n)}function r(e){m=e.pageX,g=e.pageY}function i(e){h.forEach(function(t){e.removeEventListener(t,o),e.addEventListener(t,o)}),e.removeEventListener("mousemove",r),e.addEventListener("mousemove",r)}function l(e){h.forEach(function(t){e.removeEventListener(t,o)}),e.removeEventListener("mousemove",r)}Object.defineProperty(t,"__esModule",{value:!0});var d=a(1),u=n(d),s=a(0),c=n(s),f=a(5),v=n(f),m=void 0,g=void 0,h=["keydown","keypress","keyup"],p={enable:i,disable:l};t.default=p},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return"number"!=typeof e.buttons?e.which:0===e.buttons?0:e.buttons%2==1?1:e.buttons%4==2?3:e.buttons%8==4?2:0}function r(){y=!1}function i(e){var t=m.default.cornerstone,a=e.currentTarget,n=f.default.MOUSE_DOUBLE_CLICK,o={page:m.default.cornerstoneMath.point.pageToPoint(e),image:t.pageToPixel(a,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};o.canvas=t.pixelToCanvas(a,o.image);var r=(0,h.default)(o),i={event:e,which:e.which,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,startPoints:o,lastPoints:r,currentPoints:o,deltaPoints:{x:0,y:0},type:n};(0,M.default)(a,n,i)}function l(e){function t(e){var t=f.default.MOUSE_DRAG,a={page:m.default.cornerstoneMath.point.pageToPoint(e),image:n.pageToPixel(i,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};a.canvas=n.pixelToCanvas(i,a.image);var o={page:m.default.cornerstoneMath.point.subtract(a.page,s.page),image:m.default.cornerstoneMath.point.subtract(a.image,s.image),client:m.default.cornerstoneMath.point.subtract(a.client,s.client),canvas:m.default.cornerstoneMath.point.subtract(a.canvas,s.canvas)},r={which:v,viewport:n.getViewport(i),image:n.getEnabledElement(i).image,element:i,startPoints:u,lastPoints:s,currentPoints:a,deltaPoints:o,type:t,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey};return(0,M.default)(r.element,t,r),s=(0,h.default)(a),(0,E.default)(e)}function a(e){clearTimeout(O);var o=f.default.MOUSE_UP;y&&(o=f.default.MOUSE_CLICK);var r={page:m.default.cornerstoneMath.point.pageToPoint(e),image:n.pageToPixel(i,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};r.canvas=n.pixelToCanvas(i,r.image);var l={page:m.default.cornerstoneMath.point.subtract(r.page,s.page),image:m.default.cornerstoneMath.point.subtract(r.image,s.image),client:m.default.cornerstoneMath.point.subtract(r.client,s.client),canvas:m.default.cornerstoneMath.point.subtract(r.canvas,s.canvas)},c={event:e,which:v,viewport:n.getViewport(i),image:n.getEnabledElement(i).image,element:i,startPoints:u,lastPoints:s,currentPoints:r,deltaPoints:l,type:o};(0,M.default)(c.element,o,c),document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",a),i.addEventListener("mousemove",d),y=!0}O=setTimeout(r,x);var n=m.default.cornerstone,i=e.currentTarget,l=f.default.MOUSE_DOWN;i.removeEventListener("mousemove",d);var u={page:m.default.cornerstoneMath.point.pageToPoint(e),image:n.pageToPixel(i,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};u.canvas=n.pixelToCanvas(i,u.image);var s=(0,h.default)(u),c={event:e,which:o(e),viewport:n.getViewport(i),image:n.getEnabledElement(i).image,element:i,startPoints:u,lastPoints:s,currentPoints:u,deltaPoints:{x:0,y:0},type:l};(0,M.default)(c.element,l,c)&&(c.type=f.default.MOUSE_DOWN_ACTIVATE,(0,M.default)(c.element,f.default.MOUSE_DOWN_ACTIVATE,c));var v=o(e);return document.addEventListener("mousemove",t),document.addEventListener("mouseup",a),(0,E.default)(e)}function d(e){var t=m.default.cornerstone,a=e.currentTarget,n=f.default.MOUSE_MOVE,o={page:m.default.cornerstoneMath.point.pageToPoint(e),image:t.pageToPixel(a,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};o.canvas=t.pixelToCanvas(a,o.image);var r=(0,h.default)(o),i={page:m.default.cornerstoneMath.point.pageToPoint(e),image:t.pageToPixel(a,e.pageX,e.pageY),client:{x:e.clientX,y:e.clientY}};i.canvas=t.pixelToCanvas(a,i.image);var l={page:m.default.cornerstoneMath.point.subtract(i.page,r.page),image:m.default.cornerstoneMath.point.subtract(i.image,r.image),client:m.default.cornerstoneMath.point.subtract(i.client,r.client),canvas:m.default.cornerstoneMath.point.subtract(i.canvas,r.canvas)},d={viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,startPoints:o,lastPoints:r,currentPoints:i,deltaPoints:l,type:n};(0,M.default)(a,n,d),r=(0,h.default)(i)}function u(e){e.removeEventListener("mousedown",l),e.removeEventListener("mousemove",d),e.removeEventListener("dblclick",i)}function s(e){u(e),e.addEventListener("mousedown",l),e.addEventListener("mousemove",d),e.addEventListener("dblclick",i)}Object.defineProperty(t,"__esModule",{value:!0});var c=a(1),f=n(c),v=a(0),m=n(v),g=a(36),h=n(g),p=a(34),E=n(p),T=a(5),M=n(T),y=!0,O=void 0,x=200,_={enable:s,disable:u};t.default=_},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){if(!("mousewheel"===e.type&&0===e.wheelDeltaY||"DOMMouseScroll"===e.type&&1===e.axis)){e.preventDefault();var t=s.default.cornerstone,a=e.currentTarget,n=void 0,o=void 0;void 0!==e.pageX&&void 0!==e.pageY?(n=e.pageX,o=e.pageY):(n=e.x,o=e.y);var r=t.pageToPixel(a,n,o);e=window.event&&window.event.wheelDelta?window.event:e;var i=void 0;i=e.wheelDelta?-e.wheelDelta:e.deltaY?-e.deltaY:e.detail?-e.detail:e.wheelDelta;var l=i<0?-1:1,u={element:a,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,direction:l,pageX:n,pageY:o,imageX:r.x,imageY:r.y};(0,f.default)(a,d.default.MOUSE_WHEEL,u)}}function r(e){i(e),v.forEach(function(t){e.addEventListener(t,o)})}function i(e){v.forEach(function(t){e.removeEventListener(t,o)})}Object.defineProperty(t,"__esModule",{value:!0});var l=a(1),d=n(l),u=a(0),s=n(u),c=a(5),f=n(c),v=["mousewheel","DOMMouseScroll"],m={enable:r,disable:i};t.default=m},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=s.default.cornerstone,a=e.currentTarget||e.srcEvent.currentTarget,n=void 0,o=void 0,r=void 0,i=void 0,l=void 0;switch(e.preventDefault(),(e.pointers&&e.pointers.length>1||e.touches&&e.touches.length>1)&&(L=!1,clearTimeout(S)),e.type){case"tap":L=!1,clearTimeout(S),y={page:s.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(a,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},y.canvas=t.pixelToCanvas(a,y.image),n=d.default.TAP,_={event:e,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,currentPoints:y,type:n,isTouchEvent:!0},(0,E.default)(a,n,_);break;case"doubletap":L=!1,clearTimeout(S),y={page:s.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(a,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},y.canvas=t.pixelToCanvas(a,y.image),n=d.default.DOUBLE_TAP,_={event:e,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,currentPoints:y,type:n,isTouchEvent:!0},(0,E.default)(a,n,_);break;case"pinchstart":L=!1,clearTimeout(S),C=1;break;case"pinchmove":if(L=!1,clearTimeout(S),!0===w){C=e.scale,w=!1;break}o=(e.scale-C)/C,M={page:e.center,image:t.pageToPixel(a,e.center.x,e.center.y)},M.canvas=t.pixelToCanvas(a,M.image),n=d.default.TOUCH_PINCH,_={event:e,startPoints:M,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,direction:e.scale<1?1:-1,scaleChange:o,type:n,isTouchEvent:!0},(0,E.default)(a,n,_),C=e.scale;break;case"touchstart":C=1,clearTimeout(S),clearTimeout(b),b=setTimeout(function(){M={page:s.default.cornerstoneMath.point.pageToPoint(e.touches[0]),image:t.pageToPixel(a,e.touches[0].pageX,e.touches[0].pageY),client:{x:e.touches[0].clientX,y:e.touches[0].clientY}},M.canvas=t.pixelToCanvas(a,M.image),n=d.default.TOUCH_START,e.touches.length>1&&(n=d.default.MULTI_TOUCH_START),_={event:e,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,startPoints:M,currentPoints:M,type:n,isTouchEvent:!0},!0===(0,E.default)(a,n,_)&&(n=d.default.TOUCH_START_ACTIVE,e.touches.length>1&&(n=d.default.MULTI_TOUCH_START_ACTIVE),_.type=n,(0,E.default)(a,n,_)),O=(0,f.default)(M)},50),L=!0,P=0,S=setTimeout(function(){L&&(y={page:s.default.cornerstoneMath.point.pageToPoint(e.touches[0]),image:t.pageToPixel(a,e.touches[0].pageX,e.touches[0].pageY),client:{x:e.touches[0].clientX,y:e.touches[0].clientY}},y.canvas=t.pixelToCanvas(a,M.image),n=d.default.TOUCH_PRESS,_={event:e,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,currentPoints:y,type:n,isTouchEvent:!0},(0,E.default)(a,n,_))},U);break;case"touchend":C=1,L=!1,clearTimeout(S),setTimeout(function(){M={page:s.default.cornerstoneMath.point.pageToPoint(e.changedTouches[0]),image:t.pageToPixel(a,e.changedTouches[0].pageX,e.changedTouches[0].pageY),client:{x:e.changedTouches[0].clientX,y:e.changedTouches[0].clientY}},M.canvas=t.pixelToCanvas(a,M.image),n=d.default.TOUCH_END,_={event:e,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,startPoints:M,currentPoints:M,type:n,isTouchEvent:!0},(0,E.default)(a,n,_)},50);break;case"panmove":r={x:e.deltaX-D.x,y:e.deltaY-D.y},D={x:e.deltaX,y:e.deltaY},y={page:{x:O.page.x+r.x,y:O.page.y+r.y},image:t.pageToPixel(a,O.page.x+r.x,O.page.y+r.y),client:{x:O.client.x+r.x,y:O.client.y+r.y}},y.canvas=t.pixelToCanvas(a,y.image),x={page:s.default.cornerstoneMath.point.subtract(y.page,O.page),image:s.default.cornerstoneMath.point.subtract(y.image,O.image),client:s.default.cornerstoneMath.point.subtract(y.client,O.client),canvas:s.default.cornerstoneMath.point.subtract(y.canvas,O.canvas)},P+=Math.sqrt(x.page.x*x.page.x+x.page.y*x.page.y),P>A&&(L=!1,clearTimeout(S)),n=d.default.TOUCH_DRAG,e.pointers.length>1&&(n=d.default.MULTI_TOUCH_DRAG),_={viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,startPoints:M,lastPoints:O,currentPoints:y,deltaPoints:x,numPointers:e.pointers.length,type:n,isTouchEvent:!0},(0,E.default)(a,n,_),O=(0,f.default)(y);break;case"panstart":D={x:e.deltaX,y:e.deltaY},y={page:s.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(a,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},y.canvas=t.pixelToCanvas(a,y.image),O=(0,f.default)(y);break;case"panend":return L=!1,(clearTimeout(S),O)?(y={page:s.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),image:t.pageToPixel(a,e.pointers[0].pageX,e.pointers[0].pageY),client:{x:e.pointers[0].clientX,y:e.pointers[0].clientY}},y.canvas=t.pixelToCanvas(a,y.image),x={page:s.default.cornerstoneMath.point.subtract(y.page,O.page),image:s.default.cornerstoneMath.point.subtract(y.image,O.image),client:s.default.cornerstoneMath.point.subtract(y.client,O.client),canvas:s.default.cornerstoneMath.point.subtract(y.canvas,O.canvas)},n=d.default.TOUCH_DRAG_END,_={event:e.srcEvent,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,startPoints:M,lastPoints:O,currentPoints:y,deltaPoints:x,type:n,isTouchEvent:!0},(0,E.default)(a,n,_),i=e.pointers.length-e.changedPointers.length,2===i&&(w=!0),(0,m.default)(e)):!1;case"rotatemove":L=!1,clearTimeout(S),l=e.rotation-I,I=e.rotation,n=d.default.TOUCH_ROTATE,_={event:e.srcEvent,viewport:t.getViewport(a),image:t.getEnabledElement(a).image,element:a,rotation:l,type:n},(0,E.default)(a,n,_)}return!1}function r(e){i(e);var t=s.default.Hammer,a={inputClass:t.SUPPORT_POINTER_EVENTS?t.PointerEventInput:t.TouchInput},n=new t.Manager(e,a),r={pointers:0,direction:t.DIRECTION_ALL,threshold:0},l=new t.Pan(r),d=new t.Pinch({threshold:0}),u=new t.Rotate({threshold:0});d.recognizeWith(l),d.recognizeWith(u),u.recognizeWith(l);var c=new t.Tap({event:"doubletap",taps:2,interval:1500,threshold:50,posThreshold:50});c.recognizeWith(l),n.add([c,l,u,d]),n.on("tap doubletap panstart panmove panend pinchstart pinchmove rotatemove",o),h.default.enable(e),["touchstart","touchend"].forEach(function(t){e.addEventListener(t,o)});var f=(0,T.getToolOptions)(R,e);f.hammer=n,(0,T.setToolOptions)(R,e,f)}function i(e){h.default.disable(e),["touchstart","touchend"].forEach(function(t){e.removeEventListener(t,o)});var t=(0,T.getToolOptions)(R,e),a=t.hammer;a&&a.off("tap doubletap panstart panmove panend pinchstart pinchmove rotatemove",o)}Object.defineProperty(t,"__esModule",{value:!0});var l=a(1),d=n(l),u=a(0),s=n(u),c=a(36),f=n(c),v=a(34),m=n(v),g=a(54),h=n(g),p=a(5),E=n(p),T=a(3),M=void 0,y=void 0,O=void 0,x=void 0,_=void 0,b=void 0,S=void 0,P=void 0,C=1,I=0,w=!1,L=!1,D=void 0,U=700,A=5,R="touchInput",k={enable:r,disable:i};t.default=k},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return{visible:!0,active:!0,handles:{start:{x:e.currentPoints.image.x-20,y:e.currentPoints.image.y+10,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},start2:{x:e.currentPoints.image.x-20,y:e.currentPoints.image.y+10,highlight:!0,active:!1},end2:{x:e.currentPoints.image.x,y:e.currentPoints.image.y+20,highlight:!0,active:!1}}}}function r(e,t,a){var n=d.default.cornerstone,o={start:n.pixelToCanvas(e,t.handles.start),end:n.pixelToCanvas(e,t.handles.end)},r=d.default.cornerstoneMath.lineSegment.distanceToPoint(o,a);return r<5||(o.start=n.pixelToCanvas(e,t.handles.start2),o.end=n.pixelToCanvas(e,t.handles.end2),(r=d.default.cornerstoneMath.lineSegment.distanceToPoint(o,a))<5)}function i(e){var t=e.detail,a=(0,b.getToolState)(e.currentTarget,S);if(void 0!==a){var n=t.canvasContext.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0);for(var o=void 0,r=E.default.getToolWidth(),i=M.default.getFont(),l=P.getConfiguration(),u=d.default.cornerstone,s=0;s=e.image.columns||u>=e.image.rows)){if(e.image.color)s=(0,b.default)(e.element,d,u,1,1),c=d+", "+u,f="R: "+s[0]+" G: "+s[1]+" B: "+s[2]+" A: "+s[3];else{s=t.getStoredPixels(e.element,d,u,1,1);var m=s[0],g=m*e.image.slope+e.image.intercept,h=(0,P.default)(e.image,m);c=d+", "+u,f="SP: "+m+" MO: "+parseFloat(g.toFixed(3)),h&&(f+=" SUV: "+parseFloat(h.toFixed(3)))}var p={x:e.currentPoints.image.x+3,y:e.currentPoints.image.y-3},E=t.pixelToCanvas(e.element,p);n.font=r,n.fillStyle=o,(0,x.default)(n,f,E.x,E.y+i+5,o),(0,x.default)(n,c,E.x,E.y,o),n.restore()}}function r(e){var t=v.default.cornerstone,a=e.element,n=t.getEnabledElement(a),o=n.image,r=n.canvas.getContext("2d");r.setTransform(1,0,0,1,0,0);var i=y.default.getActiveColor(),l=T.default.getFont(),d=U.getConfiguration();r.save(),d&&d.shadow&&(r.shadowColor=d.shadowColor||"#000000",r.shadowOffsetX=d.shadowOffsetX||1,r.shadowOffsetY=d.shadowOffsetY||1);var u=t.metaData.get("generalSeriesModule",o.imageId),s=void 0;u&&(s=u.modality);var c=void 0;c=!0===e.isTouchEvent?t.pageToPixel(a,e.currentPoints.page.x,e.currentPoints.page.y-4*T.default.getFontSize()):t.pageToPixel(a,e.currentPoints.page.x,e.currentPoints.page.y-T.default.getFontSize()/2);var f=void 0,m="";if(!(c.x<0||c.y<0||c.x>=o.columns||c.y>=o.rows)){if(o.color)f=(0,b.default)(a,c.x,c.y,1,1),m="R: "+f[0]+" G: "+f[1]+" B: "+f[2];else{f=t.getStoredPixels(a,c.x,c.y,1,1);var g=f[0],h=g*e.image.slope+e.image.intercept,p=parseFloat(h.toFixed(2));if("CT"===s)m+="HU: "+p;else if("PT"===s){m+=p;var E=(0,P.default)(e.image,g);E&&(m+=" SUV: "+parseFloat(E.toFixed(2)))}else m+=p}var M=t.pixelToCanvas(a,c);r.font=l,r.fillStyle=i;var O=void 0,_=r.measureText(m).width;O=!0===e.isTouchEvent?{x:-_/2-5,y:-T.default.getFontSize()-10-12}:{x:12,y:-(T.default.getFontSize()+10)/2},r.beginPath(),r.strokeStyle=i,r.arc(M.x,M.y,6,0,2*Math.PI),r.stroke(),(0,x.default)(r,m,M.x+O.x,M.y+O.y,i),r.restore()}}function i(e){var t=e.detail,a=t.element;a.removeEventListener(c.default.IMAGE_RENDERED,d),a.removeEventListener(c.default.MOUSE_DRAG,u),a.removeEventListener(c.default.MOUSE_UP,i),a.removeEventListener(c.default.MOUSE_CLICK,i),v.default.cornerstone.updateImage(t.element)}function l(e){var t=e.detail,a=t.element,n=(0,w.getToolOptions)(L,a);(0,I.default)(t.which,n.mouseButtonMask)&&(a.addEventListener(c.default.IMAGE_RENDERED,d),a.addEventListener(c.default.MOUSE_DRAG,u),a.addEventListener(c.default.MOUSE_UP,i),a.addEventListener(c.default.MOUSE_CLICK,i),U.strategy(t),e.preventDefault(),e.stopPropagation())}function d(){D&&(U.strategy(D),D=null)}function u(e){var t=e.detail,a=t.element;D=t,v.default.cornerstone.updateImage(a),e.preventDefault(),e.stopPropagation()}Object.defineProperty(t,"__esModule",{value:!0}),t.dragProbeTouch=t.dragProbe=void 0;var s=a(1),c=n(s),f=a(0),v=n(f),m=a(16),g=n(m),h=a(13),p=n(h),E=a(14),T=n(E),M=a(6),y=n(M),O=a(7),x=n(O),_=a(35),b=n(_),S=a(20),P=n(S),C=a(4),I=n(C),w=a(3),L="dragProbe",D=void 0,U=(0,g.default)(l,L);U.strategies={default:o,minimal:r},U.strategy=o;var A={fireOnTouchStart:!0},R=(0,p.default)(u,A);t.dragProbe=U,t.dragProbeTouch=R},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return{visible:!0,active:!0,invalidated:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function r(e,t,a,n){var o=c.default.cornerstone,r=o.pixelToCanvas(e,t.handles.start),i=o.pixelToCanvas(e,t.handles.end),l={left:Math.min(r.x,i.x)+n/2,top:Math.min(r.y,i.y)+n/2,width:Math.abs(r.x-i.x)-n,height:Math.abs(r.y-i.y)-n},d={left:Math.min(r.x,i.x)-n/2,top:Math.min(r.y,i.y)-n/2,width:Math.abs(r.x-i.x)+n,height:Math.abs(r.y-i.y)+n},u=(0,P.default)(l,a);return!(!(0,P.default)(d,a)||u)}function i(e,t,a){return r(e,t,a,15)}function l(e,t,a){return r(e,t,a,25)}function d(e){var t=e.toString().split(".");return t[0]=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),t.join(".")}function u(e){var t=e.detail,a=(0,D.getToolState)(e.currentTarget,U);if(a){var n=c.default.cornerstone,o=t.image,r=t.element,i=p.default.getToolWidth(),l=A.getConfiguration(),u=t.canvasContext.canvas.getContext("2d"),s=n.metaData.get("generalSeriesModule",o.imageId),f=void 0;s&&(f=s.modality),u.setTransform(1,0,0,1,0,0);for(var v=0;v=0&&c.data[g].active&&(f=r(t,g),void 0!==f?s(t,f):t.event.shiftKey?m.freehand=!0:o(t));e.preventDefault(),e.stopPropagation()}}function f(e){var t=e.detail,a=(0,L.getToolState)(e.currentTarget,U);if(void 0!==a){var n=O.default.cornerstone,o=R.getConfiguration(),r=t.canvasContext.canvas.getContext("2d");r.setTransform(1,0,0,1,0,0);for(var i=void 0,l=_.default.getToolWidth(),d=S.default.getFillColor(),u=0;u0)){return{visible:!0,active:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0}}}}}function r(e,t,a){var n=u.default.cornerstone,o=n.pixelToCanvas(e,t.handles.start),r=n.pixelToCanvas(e,t.handles.end),i={left:Math.min(o.x,r.x),top:Math.min(o.y,r.y),width:Math.abs(o.x-r.x),height:Math.abs(o.y-r.y)},l=!1;return a.x>=i.left&&a.x<=i.left+i.width&&a.y>=i.top&&a.y<=i.top+i.height&&(l=!0),l}function i(e,t,a){var n=u.default.cornerstone,o=n.pixelToCanvas(e,t.handles.start),r=n.pixelToCanvas(e,t.handles.end),i={left:Math.min(o.x,r.x),top:Math.min(o.y,r.y),width:Math.abs(o.x-r.x),height:Math.abs(o.y-r.y)};return u.default.cornerstoneMath.rect.distanceToPoint(i,a)<5}function l(e){var t=e.detail,a=(0,M.getToolState)(e.currentTarget,y);if(void 0!==a){var n=u.default.cornerstone,o=t.canvasContext.canvas.getContext("2d");o.setTransform(1,0,0,1,0,0);var r=void 0,i=g.default.getToolWidth();o.save();var l=a.data[0];if(l){r=l.active?p.default.getActiveColor():p.default.getToolColor();var d=n.pixelToCanvas(t.element,l.handles.start),s=n.pixelToCanvas(t.element,l.handles.end),c={left:Math.min(d.x,s.x),top:Math.min(d.y,s.y),width:Math.abs(d.x-s.x),height:Math.abs(d.y-s.y)};o.beginPath(),o.strokeStyle="transparent",o.rect(0,0,o.canvas.clientWidth,o.canvas.clientHeight),o.rect(c.width+c.left,c.top,-c.width,c.height),o.stroke(),o.fillStyle="rgba(0,0,0,0.7)",o.fill(),o.closePath(),o.beginPath(),o.strokeStyle=r,o.lineWidth=i,o.setLineDash([4]),o.strokeRect(c.left,c.top,c.width,c.height),o.setLineDash([]),(0,T.default)(o,t,l.handles,r),o.restore()}}}Object.defineProperty(t,"__esModule",{value:!0}),t.highlightTouch=t.highlight=void 0;var d=a(0),u=n(d),s=a(56),c=n(s),f=a(11),v=n(f),m=a(8),g=n(m),h=a(6),p=n(h),E=a(10),T=n(E),M=a(2),y="highlight",O=(0,c.default)({createNewMeasurement:o,onImageRendered:l,pointNearTool:i,pointInsideRect:r,toolType:y},!0),x=(0,v.default)({createNewMeasurement:o,onImageRendered:l,pointNearTool:i,pointInsideRect:r,toolType:y},!0);t.highlight=O,t.highlightTouch=x},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.detail,a=t.image,n=a.stats,o=t.canvasContext.canvas.getContext("2d");o.setTransform(1,0,0,1,0,0);var r=[];Object.keys(n).forEach(function(e){var t=e+" : "+n[e];r.push(t)}),(0,d.default)(o,r,0,0,"orange"),r.forEach(function(e){console.log(e)})}Object.defineProperty(t,"__esModule",{value:!0});var r=a(26),i=n(r),l=a(7),d=n(l),u=(0,i.default)(o);t.default=u},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return{visible:!0,active:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function r(e,t,a){var n=d.default.cornerstone,o={start:n.pixelToCanvas(e,t.handles.start),end:n.pixelToCanvas(e,t.handles.end)};return d.default.cornerstoneMath.lineSegment.distanceToPoint(o,a)<25}function i(e){var t=e.detail,a=(0,y.getToolState)(e.currentTarget,O);if(a){var n=d.default.cornerstone,o=t.canvasContext.canvas.getContext("2d"),r=t.image,i=t.element;o.setTransform(1,0,0,1,0,0);var l=h.default.getToolWidth(),u=x.getConfiguration(),s=n.metaData.get("imagePlaneModule",r.imageId),c=void 0,f=void 0;s?(c=s.rowPixelSpacing||s.rowImagePixelSpacing,f=s.columnPixelSpacing||s.colImagePixelSpacing):(c=r.rowPixelSpacing,f=r.columnPixelSpacing);for(var v=0;v=2}},s=(0,d.default)(o);s.setConfiguration(u),t.default=s},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return{visible:!0,active:!0,handles:{end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0}}}}function r(e,t,a){var n=d.default.cornerstone.pixelToCanvas(e,t.handles.end);return d.default.cornerstoneMath.point.distance(n,a)<5}function i(e){var t=e.detail,a=(0,b.getToolState)(e.currentTarget,S);if(a){var n=d.default.cornerstone,o=t.canvasContext.canvas.getContext("2d");o.setTransform(1,0,0,1,0,0);for(var r=void 0,i=h.default.getFont(),l=h.default.getFontSize(),u=0;u=t.image.columns||f>=t.image.rows)return;if(t.image.color)g=c+", "+f,v=(0,O.default)(t.element,c,f,1,1),p="R: "+v[0]+" G: "+v[1]+" B: "+v[2];else{v=n.getStoredPixels(t.element,c,f,1,1);var T=v[0],y=T*t.image.slope+t.image.intercept,x=(0,_.default)(t.image,T);g=c+", "+f,p="SP: "+T+" MO: "+parseFloat(y.toFixed(3)),x&&(p+=" SUV: "+parseFloat(x.toFixed(3)))}var P={x:s.handles.end.x+3,y:s.handles.end.y-3},C=n.pixelToCanvas(t.element,P);o.font=i,o.fillStyle=r,(0,M.default)(o,p,C.x,C.y+l+5,r),(0,M.default)(o,g,C.x,C.y,r),o.restore()}}}Object.defineProperty(t,"__esModule",{value:!0}),t.probeTouch=t.probe=void 0;var l=a(0),d=n(l),u=a(9),s=n(u),c=a(11),f=n(c),v=a(6),m=n(v),g=a(14),h=n(g),p=a(10),E=n(p),T=a(7),M=n(T),y=a(35),O=n(y),x=a(20),_=n(x),b=a(2),S="probe",P=(0,s.default)({createNewMeasurement:o,onImageRendered:i,pointNearTool:r,toolType:S}),C=(0,f.default)({createNewMeasurement:o,onImageRendered:i,pointNearTool:r,toolType:S});t.probe=P,t.probeTouch=C},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return{visible:!0,active:!0,invalidated:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function r(e,t,a){var n=s.default.cornerstone,o=n.pixelToCanvas(e,t.handles.start),r=n.pixelToCanvas(e,t.handles.end),i={left:Math.min(o.x,r.x),top:Math.min(o.y,r.y),width:Math.abs(o.x-r.x),height:Math.abs(o.y-r.y)};return s.default.cornerstoneMath.rect.distanceToPoint(i,a)<5}function i(e,t){for(var a=0,n=0,o=0,r=0,i=t.top;i2&&void 0!==arguments[2]?arguments[2]:"image/png",n=e.querySelector("canvas"),o=document.createElement("a");if(o.download=t,o.href=n.toDataURL(a,1),document.createEvent){var r=document.createEvent("MouseEvents");r.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(r)}else o.fireEvent&&o.fireEvent("onclick")}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){e(prompt("Enter your annotation:"))}function r(e,t,a){a(prompt("Change your annotation:"))}function i(e){function t(e){null===e?(0,B.removeToolState)(n,G,r):r.text=e,r.active=!1,a.updateImage(n)}var a=h.default.cornerstone,n=e.element,o=F.getConfiguration(),r=l(e);(0,B.addToolState)(n,G,r),a.updateImage(n),(0,D.default)(e,G,r,r.handles.end,function(){(0,w.default)(e,r.handles)&&(0,B.removeToolState)(n,G,r),void 0===r.text&&o.getTextCallback(t),a.updateImage(n)})}function l(e){return{visible:!0,active:!0,handles:{end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}function d(e,t,a){if(t.handles.end){var n=h.default.cornerstone.pixelToCanvas(e,t.handles.end);return h.default.cornerstoneMath.point.distance(n,a)<25}}function u(e){var t=e.detail,a=(0,B.getToolState)(e.currentTarget,G);if(a){var n=h.default.cornerstone,o=t.enabledElement,r=t.canvasContext.canvas.getContext("2d");r.setTransform(1,0,0,1,0,0);for(var i=t.canvasContext.canvas.width,l=void 0,d=S.default.getToolWidth(),u=_.default.getFont(),s=F.getConfiguration(),c=0;ci/2&&(T=-T);var M=void 0;if(!f.handles.textBox.hasMoved){M={x:v.x-p/2+T,y:v.y-E/2};var y=n.internal.getTransform(o);y.invert();var x=y.transformPoint(M.x,M.y);f.handles.textBox.x=x.x,f.handles.textBox.y=x.y}M=n.pixelToCanvas(t.element,f.handles.textBox);var b=(0,O.default)(r,g,M.x,M.y,l);if(f.handles.textBox.boundingBox=b,f.handles.textBox.hasMoved){var P={start:{},end:{}};P.end.x=M.x,P.end.y=M.y,P.start=v;var I=[{x:b.left+b.width/2,y:b.top},{x:b.left,y:b.top+b.height/2},{x:b.left+b.width/2,y:b.top+b.height},{x:b.left+b.width,y:b.top+b.height/2}];P.end=h.default.cornerstoneMath.point.findClosestPoint(I,P.start),r.beginPath(),r.strokeStyle=l,r.lineWidth=d,r.setLineDash([2,3]),r.moveTo(P.start.x,P.start.y),r.lineTo(P.end.x,P.end.y),r.stroke()}}r.restore()}}}function s(e){function t(e){null===e?(0,B.removeToolState)(n,G,r):r.text=e,r.active=!1,a.updateImage(n)}var a=h.default.cornerstone,n=e.element,o=F.getConfiguration(),r=l(e);(0,B.addToolState)(n,G,r),a.updateImage(n),(0,D.default)(e,G,r,r.handles.end,function(){(0,w.default)(e,r.handles)&&(0,B.removeToolState)(n,G,r),void 0===r.text&&o.getTextCallback(t),a.updateImage(n)})}function c(e){function t(e,t,a){!0===a?(0,B.removeToolState)(o,G,e):e.text=t,e.active=!1,n.updateImage(o)}var a=e.detail,n=h.default.cornerstone,o=a.element,r=void 0,i=(0,W.getToolOptions)(G,o);if((0,N.default)(a.which,i.mouseButtonMask)){var l=F.getConfiguration(),u=a.currentPoints.canvas,s=(0,B.getToolState)(o,G);if(s){for(var c=0;c=t.markers.length&&(t.loop?o-=t.markers.length:o=-1):(o-=1)<0&&(t.loop?o+=t.markers.length:o=-1),t.current=t.markers[o],a}}}function r(e,t,a){if(t.handles.end.boundingBox){var n=f.default.cornerstoneMath.rect.distanceToPoint(t.handles.end.boundingBox,a),o=(0,E.default)(t.handles.end,a);return n<10||o}}function i(e){var t=e.detail,a=(0,b.getToolState)(t.element,P);if(a){var n=t.canvasContext.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0);for(var o=C.getConfiguration(),r=0;ra.maxScale?e.scale=a.maxScale:a.minScale&&rn.maxScale?o.scale=n.maxScale:n.minScale&&o.scalei||u<0||u>r)){var T=(0,h.default)(g,r,i,d,u);(0,p.drawBrushPixels)(T,v,m,i),n.invalid=!0,c.default.cornerstone.updateImage(a)}}function r(e){var t=e.detail;M=t.currentPoints.image,y=!1}function i(e){var t=e.detail;o(t),y=!0,M=t.currentPoints.image}function l(e){var t=e.detail;M=t.currentPoints.image,c.default.cornerstone.updateImage(t.element)}function d(e){var t=e.detail;o(t),y=!0,M=t.currentPoints.image}function u(e){var t=e.detail;if(M){var a=t.image,n=a.rows,o=a.columns,r=M,i=r.x,l=r.y;if(!(i<0||i>o||l<0||l>n)){var d=O.getConfiguration(),u=d.radius,s=t.canvasContext,c=y?d.dragColor:d.hoverColor,f=t.element;s.setTransform(1,0,0,1,0,0);var v=(0,h.default)(u,n,o,i,l);(0,p.drawBrushOnCanvas)(v,s,c,f)}}}Object.defineProperty(t,"__esModule",{value:!0}),t.brush=void 0;var s=a(0),c=n(s),f=a(2),v=a(58),m=n(v),g=a(59),h=n(g),p=a(60),E="brush",T={draw:1,radius:3,hoverColor:"green",dragColor:"yellow"},M=void 0,y=!1,O=(0,m.default)({onMouseMove:l,onMouseDown:i,onMouseUp:r,onDrag:d,toolType:"brush",onImageRendered:u});O.setConfiguration(T),t.brush=O},function(e,t,a){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t,a){var n=C.getConfiguration(),o=n.tolerance,r=Number.MAX_VALUE,i=-Number.MAX_VALUE;e.forEach(function(e){var n=e[1]*a+e[0],o=t[n];r=Math.min(o,r),i=Math.max(o,i)}),b=r-o,_=i+o}function r(e,t,a,n){for(var o=C.getConfiguration(),r=o.draw,i=Math.round(x.x),l=Math.round(x.y),d=null,u=[],s=o.radius;0!==d&&s>o.minRadius;){d=0,u=(0,T.default)(s,a,n,i,l);for(var c=0;c_||gi||u<0||u>r)){var h=(0,T.default)(v,r,i,d,u);(0,M.drawBrushPixels)(h,c,f,i),n.invalid=!0,m.default.cornerstone.updateImage(a)}}function d(e){var t=e.detail;x=t.currentPoints.image;var a=C.getConfiguration();P=!1,S=a.radius,m.default.cornerstone.updateImage(t.element)}function u(e){var t=e.detail,a=t.element,n=C.getConfiguration(),r=m.default.cornerstone.getLayer(a,n.brushLayerId),d=m.default.cornerstone.getLayers(a)[0],u=t.currentPoints.image,s=u.x,c=u.y,f=r.image,v=f.rows,g=f.columns,h=(0,T.default)(n.radius,v,g,s,c);0===n.draw?l(t):(o(h,d.image.getPixelData(),g),i(t)),P=!0,x=t.currentPoints.image}function s(e){var t=e.detail;x=t.currentPoints.image,m.default.cornerstone.updateImage(t.element)}function c(e){var t=e.detail;0===O.draw?l(t):i(t),P=!0,x=t.currentPoints.image}function f(e){var t=e.detail;if(x){var a=t.image,n=a.rows,o=a.columns,r=x,i=r.x,l=r.y;if(!(i<0||i>o||l<0||l>n)){var d=C.getConfiguration(),u=t.canvasContext,s=P?d.dragColor:d.hoverColor,c=t.element;S=S||d.radius,u.setTransform(1,0,0,1,0,0);var f=(0,T.default)(S,n,o,i,l);(0,M.drawBrushOnCanvas)(f,u,s,c)}}}Object.defineProperty(t,"__esModule",{value:!0}),t.adaptiveBrush=void 0;var v=a(0),m=n(v),g=a(2),h=a(58),p=n(h),E=a(59),T=n(E),M=a(60),y="brush",O={draw:1,radius:3,tolerance:5,minRadius:1,hoverColor:"green",dragColor:"yellow"},x=void 0,_=void 0,b=void 0,S=void 0,P=void 0,C=(0,p.default)({onMouseMove:s,onMouseDown:u,onMouseUp:d,onDrag:c,toolType:"adaptiveBrush",onImageRendered:f});C.setConfiguration(O),t.adaptiveBrush=C},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="2.0.0"}])}); //# sourceMappingURL=cornerstoneTools.min.js.map \ No newline at end of file diff --git a/dist/cornerstoneTools.min.js.map b/dist/cornerstoneTools.min.js.map index 4e4ce0c57..cad289b8e 100644 --- a/dist/cornerstoneTools.min.js.map +++ b/dist/cornerstoneTools.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///cornerstoneTools.min.js","webpack:///webpack/bootstrap 5dcbdc9dd02f6c4dff7c","webpack:///./externalModules.js","webpack:///./stateManagement/toolState.js","webpack:///./util/isMouseButtonEnabled.js","webpack:///./util/triggerEvent.js","webpack:///./stateManagement/toolColors.js","webpack:///./stateManagement/toolStyle.js","webpack:///./util/drawTextBox.js","webpack:///./imageTools/mouseButtonTool.js","webpack:///./manipulators/drawHandles.js","webpack:///./imageTools/touchTool.js","webpack:///./stateManagement/loadHandlerManager.js","webpack:///./imageTools/touchDragTool.js","webpack:///./manipulators/anyHandlesOutsideImage.js","webpack:///./imageTools/simpleMouseButtonTool.js","webpack:///./stateManagement/textStyle.js","webpack:///./util/convertToVector3.js","webpack:///./stateManagement/imageIdSpecificStateManager.js","webpack:///./util/pointInsideBoundingBox.js","webpack:///./util/calculateSUV.js","webpack:///./manipulators/getHandleNearImagePoint.js","webpack:///./util/getMaxSimultaneousRequests.js","webpack:///./imageTools/mouseWheelTool.js","webpack:///./manipulators/moveHandle.js","webpack:///./manipulators/moveNewHandle.js","webpack:///./imageTools/displayTool.js","webpack:///./manipulators/moveNewHandleTouch.js","webpack:///./util/pointProjector.js","webpack:///./requestPool/requestPoolManager.js","webpack:///./imageTools/multiTouchDragTool.js","webpack:///./util/scroll.js","webpack:///./util/roundToDecimal.js","webpack:///./util/pointInEllipse.js","webpack:///./util/pauseEvent.js","webpack:///./util/getRGBPixels.js","webpack:///./util/copyPoints.js","webpack:///./stateManagement/toolCoordinates.js","webpack:///./manipulators/handleActivator.js","webpack:///./manipulators/moveAllHandles.js","webpack:///./timeSeriesTools/incrementTimePoint.js","webpack:///./referenceLines/calculateReferenceLine.js","webpack:///./referenceLines/renderActiveReferenceLine.js","webpack:///./orientation/index.js","webpack:///./util/setContextToDisplayFontSize.js","webpack:///./util/scrollToIndex.js","webpack:///./stackTools/stackScroll.js","webpack:///./util/getLuminance.js","webpack:///./util/drawEllipse.js","webpack:///./util/drawCircle.js","webpack:///./util/drawArrow.js","webpack:///./util/calculateEllipseStatistics.js","webpack:///./imageTools/keyboardTool.js","webpack:///./manipulators/touchMoveAllHandles.js","webpack:///./manipulators/touchMoveHandle.js","webpack:///./inputSources/preventGhostClick.js","webpack:///./imageTools/doubleTapTool.js","webpack:///./imageTools/mouseButtonRectangleTool.js","webpack:///./imageTools/touchPinchTool.js","webpack:///./paintingTools/brushTool.js","webpack:///./paintingTools/getCircle.js","webpack:///./paintingTools/drawBrush.js","webpack:///./index.js","webpack:///./referenceLines/index.js","webpack:///./referenceLines/referenceLinesTool.js","webpack:///./orientation/getOrientationString.js","webpack:///./orientation/invertOrientationString.js","webpack:///./timeSeriesTools/probeTool4D.js","webpack:///./measurementManager/measurementManager.js","webpack:///./measurementManager/lineSampleMeasurement.js","webpack:///./timeSeriesTools/timeSeriesPlayer.js","webpack:///./timeSeriesTools/timeSeriesScroll.js","webpack:///./synchronization/wwwcSynchronizer.js","webpack:///./synchronization/updateImageSynchronizer.js","webpack:///./synchronization/Synchronizer.js","webpack:///./synchronization/stackScrollSynchronizer.js","webpack:///./synchronization/stackImagePositionSynchronizer.js","webpack:///./synchronization/stackImagePositionOffsetSynchronizer.js","webpack:///./synchronization/stackImageIndexSynchronizer.js","webpack:///./synchronization/panZoomSynchronizer.js","webpack:///./stateManagement/timeSeriesSpecificStateManager.js","webpack:///./stateManagement/stackSpecificStateManager.js","webpack:///./stateManagement/frameOfReferenceStateManager.js","webpack:///./stateManagement/appState.js","webpack:///./stackTools/stackScrollKeyboard.js","webpack:///./stackTools/stackPrefetch.js","webpack:///./stackTools/scrollIndicator.js","webpack:///./stackTools/stackRenderers.js","webpack:///./stackTools/fusionRenderer.js","webpack:///./stackTools/playClip.js","webpack:///./inputSources/keyboardInput.js","webpack:///./inputSources/mouseInput.js","webpack:///./inputSources/mouseWheelInput.js","webpack:///./inputSources/touchInput.js","webpack:///./imageTools/angleTool.js","webpack:///./imageTools/arrowAnnotate.js","webpack:///./imageTools/crosshairs.js","webpack:///./imageTools/doubleTapZoom.js","webpack:///./imageTools/dragProbe.js","webpack:///./imageTools/ellipticalRoi.js","webpack:///./imageTools/freehand.js","webpack:///./imageTools/highlight.js","webpack:///./imageTools/imageStats.js","webpack:///./imageTools/length.js","webpack:///./imageTools/magnify.js","webpack:///./imageTools/orientationMarkers.js","webpack:///./imageTools/pan.js","webpack:///./imageTools/panMultiTouch.js","webpack:///./imageTools/probe.js","webpack:///./imageTools/rectangleRoi.js","webpack:///./imageTools/rotate.js","webpack:///./imageTools/rotateTouch.js","webpack:///./imageTools/saveAs.js","webpack:///./imageTools/seedAnnotate.js","webpack:///./imageTools/simpleAngle.js","webpack:///./imageTools/textMarker.js","webpack:///./imageTools/wwwc.js","webpack:///./imageTools/wwwcRegion.js","webpack:///./imageTools/zoom.js","webpack:///./paintingTools/brush.js","webpack:///./paintingTools/adaptiveBrush.js","webpack:///./version.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","value","cornerstone","window","cornerstoneMath","$","Hammer","default","cs","cm","_interopRequireDefault","obj","getElementToolStateManager","element","enabledImage","_externalModules2","getEnabledElement","undefined","toolStateManager","_imageIdSpecificStateManager","globalImageIdSpecificToolStateManager","addToolState","toolType","measurementData","add","eventData","_triggerEvent2","getToolState","removeToolState","data","toolData","indexOfData","length","splice","clearToolState","setElementToolStateManager","_externalModules","_triggerEvent","which","mouseButtonMask","triggerEvent","el","type","detail","arguments","event","CustomEvent","toLocaleLowerCase","cancelable","document","createEvent","initCustomEvent","jqEvent","Event","trigger","isImmediatePropagationStopped","dispatchEvent","setFillColor","color","fillColor","getFillColor","setToolColor","defaultColor","getToolColor","setActiveColor","activeColor","getActiveColor","getColorIfActive","active","toolColors","setToolWidth","width","defaultWidth","getToolWidth","setActiveWidth","activeWidth","getActiveWidth","toolStyle","context","textLines","x","y","options","toString","font","_textStyle2","getFont","fontSize","getFontSize","backgroundColor","getBackgroundColor","save","textBaseline","strokeStyle","maxWidth","forEach","text","measureText","Math","max","fillStyle","boundingBox","padding","height","centering","left","top","debug","fillRect","index","fillText","restore","_textStyle","mouseToolInterface","addNewMeasurement","mouseEventData","createNewMeasurement","_toolState","off","mouseMoveCallback","mouseDownCallback","mouseDownActivateCallback","mouseDoubleClickCallback","updateImage","handleMover","keys","handles","preventHandleOutsideImage","end","invalidated","_anyHandlesOutsideImage2","on","e","_isMouseButtonEnabled2","_toolCoordinates2","setCoords","imageNeedsUpdate","coords","currentPoints","canvas","_handleActivator2","pointNearTool","handleDoneMove","startPoints","currentTarget","handle","_getHandleNearImagePoint2","_moveHandle2","stopImmediatePropagation","deleteIfHandleOutsideImage","_moveAllHandles2","disable","removeEventListener","onImageRendered","enable","addEventListener","activate","deactivate","eventType","statusChangeEventData","getConfiguration","configuration","setConfiguration","config","toolInterface","_toolCoordinates","_getHandleNearImagePoint","_handleActivator","_moveHandle","_moveNewHandle","_moveNewHandle2","_moveAllHandles","_anyHandlesOutsideImage","_isMouseButtonEnabled","renderData","drawnIndependently","drawHandlesIfActive","beginPath","lineWidth","_toolStyle2","handleCanvasCoords","pixelToCanvas","arc","handleRadius","PI","fill","stroke","_toolStyle","deactivateAllHandles","deactivateAllToolInstances","touchTool","touchToolInterface","touchEventData","highlight","touchDownActivateCallback","tapCallback","touchStartCallback","_moveNewHandleTouch2","preventDefault","doneMovingCallback","_touchMoveHandle2","_touchMoveAllHandles2","lastEvent","lastEventData","pressCallback","doubleTapCallback","_touchMoveHandle","_moveNewHandleTouch","_touchMoveAllHandles","setStartLoadHandler","handler","defaultStartLoadHandler","getStartLoadHandler","setEndLoadHandler","defaultEndLoadHandler","getEndLoadHandler","setErrorLoadingHandler","defaultErrorLoadingHandler","getErrorLoadingHandler","loadHandlerManager","touchDragCallback","events","fireOnTouchStart","activateCallback","disableCallback","enableCallback","deactivateCallback","image","imageRect","handleOutsideImage","allowedOutsideImage","point","insideRect","setFont","defaultFont","setFontSize","defaultFontSize","setBackgroundColor","defaultBackgroundColor","textStyle","convertToVector3","arrayOrVector3","Vector3","newImageIdSpecificToolStateManager","saveImageIdToolState","imageId","toolState","restoreImageIdToolState","imageIdToolState","saveToolState","restoreToolState","savedToolState","addImageIdSpecificToolState","push","getImageIdSpecificToolState","clearImageIdSpecificToolStateManager","clear","fracToDec","fractionalValue","parseFloat","storedPixelValue","patientStudyModule","metaData","seriesModule","modality","modalityPixelValue","slope","intercept","patientWeight","petSequenceModule","radiopharmaceuticalInfo","startTime","radiopharmaceuticalStartTime","totalDose","radionuclideTotalDose","halfLife","radionuclideHalfLife","seriesAcquisitionTime","seriesTime","acquisitionTimeInSeconds","fractionalSeconds","seconds","minutes","hours","injectionStartTimeInSeconds","durationInSeconds","exp","log","distanceThreshold","nearbyHandle","pointNearHandle","hasBoundingBox","_pointInsideBoundingBox2","handleCanvas","distance","_pointInsideBoundingBox","getBrowserInfo","ua","navigator","userAgent","M","match","tem","test","exec","slice","join","replace","appName","appVersion","setMaxSimultaneousRequests","newMaxSimultaneousRequests","configMaxSimultaneousRequests","getMaxSimultaneousRequests","getDefaultSimultaneousRequests","infoString","info","split","browserName","browserVersion","browserData","maxSimultaneousRequests","isMobileDevice","RegExp","IE","9","10","Firefox","Opera","11","12","Chrome","Safari","mouseWheelCallback","mouseDragCallback","hasMoved","distanceFromTool","min","modifiedEventData","mouseUpCallback","moveCallback","whichMovement","moveEndCallback","measurementRemovedCallback","toolDeactivatedCallback","customEventOnImageRendered","distanceFromTouch","imageCoords","pageToPixel","page","projectPatientPointToImagePlane","patientPoint","imagePlane","rowCosines","_convertToVector2","columnCosines","imagePositionPatient","clone","sub","dot","columnPixelSpacing","rowPixelSpacing","imagePointToPatientPoint","imagePoint","multiplyScalar","getRectangleFromImagePlane","topLeft","topRight","columns","bottomLeft","rows","bottomRight","Line3","right","bottom","lineRectangleIntersection","line","rect","intersections","side","segment","intersection","intersectLine","planePlaneIntersection","targetImagePlane","referenceImagePlane","targetRowCosines","targetColumnCosines","targetImagePositionPatient","referenceRowCosines","referenceColumnCosines","referenceImagePositionPatient","targetNormal","cross","targetPlane","Plane","setFromNormalAndCoplanarPoint","referenceNormal","referencePlane","originDirection","intersectPlane","origin","direction","distanceTo","start","_convertToVector","addRequest","preventCache","doneCallback","failCallback","requestPool","Error","requestDetails","imagePromise","imageCache","getImagePromise","then","error","clearRequestStack","startAgain","awake","setTimeout","startGrabbing","grabDelay","sendRequest","numRequests","priority","loader","loadImage","loadAndCacheImage","_getMaxSimultaneousRequests","maxNumRequests","interaction","thumbnail","prefetch","currentRequests","requestsToSend","getNextRequest","shift","getRequestPool","images","loop","stackData","newImageIdIndex","currentImageIdIndex","imageIds","_scrollToIndex2","_scrollToIndex","precision","multiplier","pow","round","ellipse","location","xRadius","yRadius","center","normalized","stopPropagation","cancelBubble","returnValue","enabledElement","storedPixelData","pixelData","getPixelData","spIndex","row","column","red","green","blue","alpha","points","copy","client","coordsData","getCoords","toolCoordinates","getActiveHandle","activeHandle","canvasPoint","movesIndependently","deltaPoints","timePoints","wrap","timeSeriesData","currentStack","stacks","currentStackIndex","newStackIndex","viewport","getViewport","newStack","startLoadingHandler","_loadHandlerManager2","endLoadingHandler","errorLoadingHandler","displayImage","_loadHandlerManager","_pointProjector","targetElement","referenceElement","targetImage","referenceImage","frameOfReferenceUID","angleInRadians","angleTo","abs","referenceLine","_calculateReferenceLine2","refLineStartCanvas","refLineEndCanvas","_toolColors2","setTransform","moveTo","lineTo","_calculateReferenceLine","_toolColors","_getOrientationString","_getOrientationString2","_invertOrientationString","_invertOrientationString2","orientation","getOrientationString","invertOrientationString","setToPixelCoordinateSystem","scale","lineHeight","fontScale","stackRenderer","render","stackRendererData","newImageId","_stackScroll","stackScroll","retryLoadOnScroll","newImagePromise","state","removeImagePromise","Boolean","_requestPoolManager2","_requestPoolManager","dragCallback","mouseDragEventData","deltaY","_scroll2","pixelsPerImage","stackScrollSpeed","imageDelta","imageIdIndexOffset","imageDeltaMod","multiTouchDragCallback","stackScrollMultiTouch","testPointers","stackScrollTouchDrag","stackScrollWheel","_touchDragTool","_touchDragTool2","_multiTouchDragTool","_multiTouchDragTool2","_simpleMouseButtonTool","_simpleMouseButtonTool2","_mouseWheelTool","_mouseWheelTool2","_scroll","numPointers","luminance","w","h","ox","oy","xe","ye","xm","ym","bezierCurveTo","closePath","angle","atan2","cos","sin","sp","sum","sumSquared","count","_pointInEllipse2","mean","variance","stdDev","sqrt","_pointInEllipse","keyDownCallback","touchEndCallback","animate","lastTime","runAnimation","targetLocation","time","Date","getTime","distanceRemaining","linearDistEachFrame","console","requestAnimationFrame","aboveFinger","fingerDistance","touchEndEvents","handlePressed","handleTap","now","lastInteractionType","lastInteractionTime","antiGhostDelay","attachEvents","eventList","interactionType","tapHandler","handleTapMouse","handleTapTouch","eventName","removeEvents","mouseEvents","pointerType","mouse","touchEvents","touch","bind","preventGhostClick","pointInsideRect","touchPinchCallback","brushToolInterface","onMouseMove","onMouseUp","onDrag","onMouseDown","TOOL_STATE_TOOL_TYPE","Uint8ClampedArray","layer","getLayer","brushLayerId","setPixelData","invalid","_enabledElement$image","brushTool","colormapId","colormap","colors","getColormap","setNumberOfColors","setColor","labelMapImage","minPixelValue","maxPixelValue","rgba","labelmap","invert","sizeInBytes","pixelReplication","addLayer","_mouseButtonTool2","_mouseButtonTool","getCircle","radius","xCoord","yCoord","x0","y0","circleArray","drawBrushPixels","pointerArray","storedPixels","brushPixelValue","getPixelIndex","drawBrushOnCanvas","canvasContext","canvasPtTL","canvasPtBR","sizeX","sizeY","canvasPt","_index","_index2","_setContextToDisplayFontSize","_roundToDecimal","_pauseEvent","_getRGBPixels","_getLuminance","_drawTextBox","_drawEllipse","_drawCircle","_drawArrow","_copyPoints","_calculateSUV","_calculateEllipseStatistics","_probeTool4D","_incrementTimePoint","_timeSeriesPlayer","_timeSeriesScroll","timeSeriesScroll","timeSeriesScrollWheel","timeSeriesScrollTouchDrag","_wwwcSynchronizer","_updateImageSynchronizer","_Synchronizer","_stackScrollSynchronizer","_stackImagePositionSynchronizer","_stackImagePositionOffsetSynchronizer","_stackImageIndexSynchronizer","_panZoomSynchronizer","_timeSeriesSpecificStateManager","addTimeSeriesStateManager","newTimeSeriesSpecificToolStateManager","_stackSpecificStateManager","stackSpecificStateManager","newStackSpecificToolStateManager","addStackStateManager","_frameOfReferenceStateManager","newFrameOfReferenceSpecificToolStateManager","globalFrameOfReferenceSpecificToolStateManager","_appState","_stackScrollKeyboard","_stackPrefetch","_scrollIndicator","_stackRenderers","_playClip","playClip","stopClip","_drawHandles","_keyboardInput","_mouseInput","_mouseWheelInput","_preventGhostClick","_touchInput","_angleTool","angleTouch","_arrowAnnotate","arrowAnnotate","arrowAnnotateTouch","_crosshairs","crosshairs","crosshairsTouch","_displayTool","_doubleTapTool","_doubleTapZoom","_dragProbe","dragProbe","dragProbeTouch","_ellipticalRoi","ellipticalRoi","ellipticalRoiTouch","_freehand","freehand","_highlight","highlightTouch","_imageStats","_keyboardTool","_length","lengthTouch","_magnify","magnify","magnifyTouchDrag","_mouseButtonRectangleTool","_orientationMarkers","_pan","pan","panTouchDrag","_panMultiTouch","_probe","probe","probeTouch","_rectangleRoi","rectangleRoi","rectangleRoiTouch","_rotate","rotate","rotateTouchDrag","_rotateTouch","_saveAs","_seedAnnotate","seedAnnotate","seedAnnotateTouch","_simpleAngle","simpleAngle","simpleAngleTouch","_textMarker","textMarker","textMarkerTouch","_touchPinchTool","_touchTool","_wwwc","wwwc","wwwcTouchDrag","_wwwcRegion","wwwcRegion","wwwcRegionTouch","_zoom","zoom","zoomWheel","zoomTouchPinch","zoomTouchDrag","_brush","brush","_adaptiveBrush","adaptiveBrush","_version","_referenceLinesTool","_referenceLinesTool2","_renderActiveReferenceLine","_renderActiveReferenceLine2","referenceLines","calculateReferenceLine","tool","renderActiveReferenceLine","syncContext","synchronizationContext","enabledElements","getSourceElements","renderer","getContext","referenceEnabledElement","vector","vec3","orientationX","orientationY","orientationZ","z","string","inverted","toUpperCase","updateLineSample","samples","timeSeries","stack","imageIdIndex","offset","sample","lineSample","set","timeSeriestoolData","_lineSampleMeasurement2","visible","_measurementManager2","_drawHandles2","fontParameters","_setContextToDisplayFontSize2","textX","textY","_measurementManager","_lineSampleMeasurement","probeTool4D","MeasurementManager","that","measurements","measurement","eventDetail","remove","manager","framesPerSecond","timeSeriesToolData","playClipToolData","playClipData","intervalId","lastFrameTimeStamp","frameRate","setInterval","_incrementTimePoint2","clearInterval","timeSeriesPlayer","stop","pixelsPerTimeSeries","timeSeriesScrollSpeed","timeSeriesDelta","timeSeriesDeltaMod","mouseMoveData","originalEvent","synchronizer","sourceElement","sourceViewport","targetViewport","voi","windowWidth","windowCenter","setViewport","Synchronizer","fireEvent","sourceElements","targetElements","ignoreFiredEvents","targetIndex","indexOf","targetImageId","initialData","sourceIndex","sourceImageId","positionDifference","distances","eventHandler","onEvent","disableHandler","setHandler","getHandler","getDistances","sourceEnabledElement","sourceImagePlane","sourceImagePosition","targetEnabledElement","targetImagePosition","addSource","updateDisableHandlers","addTarget","removeSource","removeTarget","getTargetElements","unique","concat","destroy","stackToolDataSource","sourceImage","minDistance","Number","MAX_VALUE","imagePosition","distanceToSquared","finalPosition","sourceStackToolDataSource","sourceStackData","targetStackToolDataSource","targetStackData","translation","toolTypes","oldStateManager","addStackSpecificToolState","getStackSpecificToolState","tools","timeSeriesSpecificStateManager","timeSeriesStateManagers","stackToolState","otherTools","stackTools","stackStateManagers","addFrameOfReferenceSpecificToolState","frameOfReference","frameOfReferenceToolState","getFrameOfReferenceSpecificToolState","removeFrameOfReferenceSpecificToolState","saveApplicationState","elements","appState","elementToolState","elementViewport","id","restoreApplicationState","elementId","getElementById","savedViewport","keyCode","UP","DOWN","_keyboardTool2","stackScrollKeyboard","range","lowEnd","highEnd","arr","nearestIndex","v","low","high","removeFromList","stackPrefetch","indicesToRequest","stackPrefetchData","enabled","sort","a","b","requestType","nearest","nextImageIdIndex","lowerIndex","higherIndex","currentIndex","shouldSkipLower","maxImagesToPrefetch","shouldSkipHigher","shouldLoadLower","shouldLoadHigher","getPromiseRemovedHandler","onImageUpdated","clearTimeout","resetPrefetchTimeout","target","resetPrefetchDelay","warn","indexOfCurrentImage","promiseRemovedHandler","Infinity","apply","scrollIndicator","scrollBarHeight","cursorWidth","cursorHeight","xPosition","yPosition","_displayTool2","_fusionRenderer","_fusionRenderer2","stackRenderers","FusionRenderer","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","writable","key","protoProps","staticProps","layerIds","findImageFn","imageStacks","_this","isInteger","baseImageObject","currentImageId","overlayImageStacks","baseImage","baseLayerId","setLayerImage","imgObj","overlayLayerIndex","layerIndex","currentLayerId","setActiveLayer","getPlayClipTimeouts","speed","delay","limit","timeouts","isTimeVarying","stopClipWithData","usingFrameTimeVector","triggerStopEvent","playClipTimeouts","stackToolData","frameTimeVector","ignoreFrameTimeVector","reverse","playClipAction","imageCount","playClipTimeoutHandler","keyPress","keyPressData","mouseX","mouseY","keyPressEvents","keydown","keypress","keyup","mouseMove","pageX","pageY","keyboardEvent","keyboardInput","getEventWhich","buttons","preventClickHandler","isClickEvent","mouseDoubleClick","pageToPoint","clientX","clientY","lastPoints","_copyPoints2","mouseDown","subtract","whichMouseButton","ctrlKey","metaKey","shiftKey","_pauseEvent2","preventClickTimeout","clickDelay","mouseInput","mouseWheel","wheelDeltaY","axis","startingCoords","wheelDelta","mouseWheelData","imageX","imageY","mouseWheelEvents","unbind","mouseWheelInput","onTouch","srcEvent","scaleChange","delta","remainingPointers","rotation","pointers","touches","isPress","pressTimeout","isTouchEvent","lastScale","preventNextPinch","touchStartDelay","pageDistanceMoved","pressDelay","changedTouches","deltaX","lastDelta","pressMaxDistance","changedPointers","lastRotation","hammerOptions","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","TouchInput","mc","Manager","panOptions","DIRECTION_ALL","threshold","Pan","pinch","Pinch","Rotate","recognizeWith","doubleTap","Tap","taps","interval","posThreshold","_preventGhostClick2","touchInput","start2","end2","lineSegment","distanceToPoint","shadow","shadowColor","shadowOffsetX","shadowOffsetY","handleStartCanvas","handleEndCanvas","dx1","ceil","dy1","dx2","dy2","acos","rAngle","_roundToDecimal2","String","fromCharCode","parseInt","_drawTextBox2","_touchTool2","getTextCallback","doneChangingTextCallback","prompt","changeTextCallback","textBox","arrowFirst","_drawArrow2","handleOptions","drawHandlesOnHover","drawHandles","textWidth","textHeight","textCoords","transform","internal","getTransform","transformPoint","link","midpointCanvas","findClosestPoint","boundingBoxPoints","setLineDash","addNewMeasurementTouch","doubleClickCallback","updatedText","deleteTool","chooseLocation","sourceImagePoint","normal","dragEndCallback","dragStartCallback","enableTouch","disableTouch","fitToWindowStrategy","fitToWindow","doubleTapZoom","strategy","_doubleTapTool2","strategies","defaultStrategy","fontHeight","str","_getRGBPixels2","getStoredPixels","mo","suv","_calculateSUV2","toFixed","minimalStrategy","toolCoords","modalityPixelValueText","imageRenderedCallback","dragEventData","minimal","pointNearEllipse","startCanvas","endCanvas","minorEllipse","majorEllipse","pointInMinorEllipse","pointNearToolTouch","numberWithCommas","parts","leftCanvas","topCanvas","widthCanvas","heightCanvas","_drawEllipse2","area","meanStdDev","meanStdDevSUV","pixels","getPixels","_calculateEllipseStatistics2","isNaN","moSuffix","meanText","stdDevText","suffix","areaText","ellipsePoints","addPoint","currentTool","handleData","lines","currentHandle","toolIndex","mousePoint","pointNearHandleAllTools","handleNearby","mouseLocation","modifying","lastLineIndex","lastLine","startDrawing","endDrawing","nearby","handleStart","j","k","lineCanvas","mouseLocationCanvas","existingToolData","insideBox","clientWidth","clientHeight","strokeRect","_mouseButtonRectangleTool2","stats","imageStats","colPixelSpacing","rowImagePixelSpacing","colImagePixelSpacing","dx","dy","newImageCallback","hideTool","find","hide","body","style","cursor","drawMagnificationTool","magnifyCanvas","createMagnificationCanvas","magnifySize","magnificationLevel","not","zoomCtx","getSize","canvasLocation","clearRect","copyFrom","scaledMagnify","drawImage","display","createElement","classList","position","appendChild","removeMagnificationCanvas","getOrientationMarkers","imagePlaneMetaData","rowString","columnString","oppositeRowString","getOrientationMarkerPositions","markers","textWidths","orientationMarkers","drawAllMarkers","widthScale","heightScale","touchPanCallback","panMultiTouch","calculateMeanStdDev","getBoundingClientRect","pointsFromCenter","rotationRadians","rotationDegrees","horizontalStrategy","verticalStrategy","horizontal","vertical","touchRotateCallback","rotateTouch","filename","mimetype","lnk","download","href","toDataURL","initMouseEvent","doneGetTextCallback","realCoords","canvasWidth","_drawCircle2","textPlusCoords","showCoordinates","currentLetter","currentNumber","countUp","middle","handleMiddleCanvas","sideA","sideB","sideC","sideALength","sideBLength","sideCLength","touchMoveCallback","current","ascending","insideBoundingBox","mouseButtonData","touchPressCallback","maxVOI","minVOI","imageDynamicRange","dragData","calculateMinMaxMean","storedPixelLuminanceData","globalMin","globalMax","numPixels","spv","mouseData","currentMouseButtonMask","endPoint","applyWWWCRegion","startPoint","floor","pixelLuminanceData","_getLuminance2","minMaxMean","minWindowWidth","recordStartPoint","startPointCanvas","endPointCanvas","disableTouchDrag","activateTouchDrag","changeViewportScale","ticks","oldFactor","factor","maxScale","minScale","boundPosition","correctShift","hflip","vflip","cosA","sinA","newX","newY","newCoords","translateStrategy","preventZoomOutsideImage","desiredTranslation","distanceToDesired","zoomToCenterStrategy","_touchPinchTool2","translate","zoomToCenter","paint","_layer$image","_eventData$currentPoi","draw","_getCircle2","_drawBrush","lastImageCoords","dragging","_eventData$image","_lastImageCoords","dragColor","hoverColor","_brushTool","_brushTool2","_getCircle","getGreyValues","imageColumns","tolerance","minValue","maxValue","pixelIndex","greyValue","thrMin","thrMax","paintAdaptiveBrush","imagePixelData","brushPixelData","numPixelsOutsideThresholdWindow","minRadius","pixelValue","baseLayer","getLayers","brushData","currentRadius","erase","_layer$image2","_eventData$currentPoi2","_layer$image3"],"mappings":"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","file":"cornerstoneTools.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/*! cornerstone-tools - 1.1.2 - 2017-12-06 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 60);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar cornerstone = window.cornerstone;\nvar cornerstoneMath = window.cornerstoneMath;\nvar $ = window.$;\nvar Hammer = window.Hammer;\n\nexports.default = {\n set cornerstone(cs) {\n cornerstone = cs;\n },\n get cornerstone() {\n return cornerstone;\n },\n set cornerstoneMath(cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath() {\n return cornerstoneMath;\n },\n set $(module) {\n $ = module;\n },\n get $() {\n return $;\n },\n set Hammer(module) {\n Hammer = module;\n },\n get Hammer() {\n return Hammer;\n }\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getElementToolStateManager = exports.setElementToolStateManager = exports.clearToolState = exports.removeToolState = exports.getToolState = exports.addToolState = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _imageIdSpecificStateManager = __webpack_require__(16);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getElementToolStateManager(element) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState(element, toolType, measurementData) {\n var toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n var eventType = 'CornerstoneToolsMeasurementAdded';\n var eventData = {\n toolType: toolType,\n element: element,\n measurementData: measurementData\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState(element, toolType) {\n var toolStateManager = getElementToolStateManager(element);\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState(element, toolType, data) {\n var toolStateManager = getElementToolStateManager(element);\n var toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n var indexOfData = -1;\n\n for (var i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n var eventType = 'CornerstoneToolsMeasurementRemoved';\n var eventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }\n}\n\nfunction clearToolState(element, toolType) {\n var toolStateManager = getElementToolStateManager(element);\n var toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager(element, toolStateManager) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexports.addToolState = addToolState;\nexports.getToolState = getToolState;\nexports.removeToolState = removeToolState;\nexports.clearToolState = clearToolState;\nexports.setElementToolStateManager = setElementToolStateManager;\nexports.getElementToolStateManager = getElementToolStateManager;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (which, mouseButtonMask) {\n var mouseButton = 1 << which - 1;\n\n return (mouseButtonMask & mouseButton) !== 0;\n};\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = triggerEvent;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nfunction triggerEvent(el, type) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n var event = void 0;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type.toLocaleLowerCase(), {\n detail: detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail);\n }\n\n // TODO: remove jQuery event triggers\n var jqEvent = _externalModules2.default.$.Event(type, detail);\n\n _externalModules2.default.$(el).trigger(jqEvent, detail);\n if (jqEvent.isImmediatePropagationStopped()) {\n return false;\n }\n\n return el.dispatchEvent(event);\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor(color) {\n fillColor = color;\n}\n\nfunction getFillColor() {\n return fillColor;\n}\n\nfunction setToolColor(color) {\n defaultColor = color;\n}\n\nfunction getToolColor() {\n return defaultColor;\n}\n\nfunction setActiveColor(color) {\n activeColor = color;\n}\n\nfunction getActiveColor() {\n return activeColor;\n}\n\nfunction getColorIfActive(active) {\n return active ? activeColor : defaultColor;\n}\n\nvar toolColors = {\n setFillColor: setFillColor,\n getFillColor: getFillColor,\n setToolColor: setToolColor,\n getToolColor: getToolColor,\n setActiveColor: setActiveColor,\n getActiveColor: getActiveColor,\n getColorIfActive: getColorIfActive\n};\n\nexports.default = toolColors;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth(width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth() {\n return defaultWidth;\n}\n\nfunction setActiveWidth(width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth() {\n return activeWidth;\n}\n\nvar toolStyle = {\n setToolWidth: setToolWidth,\n getToolWidth: getToolWidth,\n setActiveWidth: setActiveWidth,\n getActiveWidth: getActiveWidth\n};\n\nexports.default = toolStyle;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n var padding = 5;\n var font = _textStyle2.default.getFont();\n var fontSize = _textStyle2.default.getFontSize();\n var backgroundColor = _textStyle2.default.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n var maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n var width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n var boundingBox = {\n width: maxWidth + padding * 2,\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n};\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseToolInterface) {\n var configuration = {};\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n var eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n cornerstone.updateImage(element);\n\n var handleMover = void 0;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = _moveHandle2.default;\n } else {\n handleMover = _moveNewHandle2.default;\n }\n\n var preventHandleOutsideImage = void 0;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, mouseToolInterface.toolType, measurementData);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback(e, eventData) {\n _toolCoordinates2.default.setCoords(eventData);\n // If a mouse button is down, do nothing\n if (eventData.which !== 0) {\n return;\n }\n\n // If we have no tool data for this element, do nothing\n var toolData = (0, _toolState.getToolState)(eventData.element, mouseToolInterface.toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n var imageNeedsUpdate = false;\n\n for (var i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n var coords = eventData.currentPoints.canvas;\n\n var data = toolData.data[i];\n\n if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if (mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback(e, eventData) {\n var data = void 0;\n var element = eventData.element;\n\n function handleDoneMove() {\n data.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, mouseToolInterface.toolType, data);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n }\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n var coords = eventData.startPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, mouseToolInterface.toolType);\n\n if (!toolData) {\n return;\n }\n\n var i = void 0;\n\n // Now check to see if there is a handle we can move\n\n var preventHandleOutsideImage = void 0;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var distance = 6;\n var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distance);\n\n if (handle) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n data.active = true;\n (0, _moveHandle2.default)(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n var options = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n (0, _moveAllHandles2.default)(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered(e) {\n mouseToolInterface.onImageRendered(e, e.detail);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n var eventType = 'CornerstoneToolsToolDeactivated';\n var statusChangeEventData = {\n mouseButtonMask: mouseButtonMask,\n toolType: mouseToolInterface.toolType,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, statusChangeEventData);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n function getConfiguration() {\n return configuration;\n }\n\n function setConfiguration(config) {\n configuration = config;\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration,\n mouseDownCallback: mouseDownCallback,\n mouseMoveCallback: mouseMoveCallback,\n mouseDownActivateCallback: mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n toolInterface.mouseDoubleClickCallback = mouseToolInterface.mouseDoubleClickCallback;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolCoordinates = __webpack_require__(35);\n\nvar _toolCoordinates2 = _interopRequireDefault(_toolCoordinates);\n\nvar _getHandleNearImagePoint = __webpack_require__(19);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _handleActivator = __webpack_require__(36);\n\nvar _handleActivator2 = _interopRequireDefault(_handleActivator);\n\nvar _moveHandle = __webpack_require__(22);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _moveNewHandle = __webpack_require__(23);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveAllHandles = __webpack_require__(37);\n\nvar _moveAllHandles2 = _interopRequireDefault(_moveAllHandles);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(1);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = _toolStyle2.default.getActiveWidth();\n } else {\n context.lineWidth = _toolStyle2.default.getToolWidth();\n }\n\n var handleCanvasCoords = _externalModules2.default.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar handleRadius = 6;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _getHandleNearImagePoint = __webpack_require__(19);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _touchMoveHandle = __webpack_require__(52);\n\nvar _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(25);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _touchMoveAllHandles = __webpack_require__(51);\n\nvar _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles);\n\nvar _toolState = __webpack_require__(1);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deactivateAllHandles(handles) {\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances(toolData) {\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n var data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool(touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n\n var measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n (0, _toolState.addToolState)(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === 'CornerstoneToolsTap') {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n (0, _moveNewHandleTouch2.default)(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback(e, eventData) {\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback(e, eventData) {\n // Console.log('touchTool tapCallback');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType);\n var data = void 0;\n var i = void 0;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback() {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var distanceSq = 25; // Should probably make this a settable property later\n var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distanceSq);\n\n if (handle) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e, eventData);\n } else {\n touchDownActivateCallback(e, eventData);\n }\n\n return false;\n }\n\n function touchStartCallback(e, eventData) {\n // Console.log('touchTool touchStartCallback');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var coords = eventData.startPoints.canvas;\n var data = void 0;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType);\n var i = void 0;\n\n function doneMovingCallback(lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') {\n (0, _triggerEvent2.default)(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n var distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n data.active = true;\n (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of touchTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered(e) {\n touchToolInterface.onImageRendered(e, e.detail);\n }\n\n // Visible, interactive\n function deactivate(element) {\n var eventType = 'CornerstoneToolsToolDeactivated';\n var statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, statusChangeEventData);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexports.default = touchTool;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultStartLoadHandler = void 0;\nvar defaultEndLoadHandler = void 0;\nvar defaultErrorLoadingHandler = void 0;\n\nfunction setStartLoadHandler(handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler() {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler(handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler() {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler(handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler() {\n return defaultErrorLoadingHandler;\n}\n\nvar loadHandlerManager = {\n setStartLoadHandler: setStartLoadHandler,\n getStartLoadHandler: getStartLoadHandler,\n setEndLoadHandler: setEndLoadHandler,\n getEndLoadHandler: getEndLoadHandler,\n setErrorLoadingHandler: setErrorLoadingHandler,\n getErrorLoadingHandler: getErrorLoadingHandler\n};\n\nexports.default = loadHandlerManager;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchDragCallback, options) {\n var events = 'CornerstoneToolsTouchDrag';\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsTouchStart';\n }\n\n var toolInterface = {\n activate: function activate(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n\n if (options && options.eventData) {\n _externalModules2.default.$(element).on(events, options.eventData, touchDragCallback);\n } else {\n _externalModules2.default.$(element).on(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (renderData, handles) {\n var image = renderData.image;\n var imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n var handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (_externalModules2.default.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseDownCallback) {\n var configuration = {};\n\n var toolInterface = {\n activate: function activate(element, mouseButtonMask, options) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n var eventData = {\n mouseButtonMask: mouseButtonMask,\n options: options\n };\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownCallback);\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultFontSize = 15,\n defaultFont = defaultFontSize + 'px Arial',\n defaultBackgroundColor = 'transparent';\n\nfunction setFont(font) {\n defaultFont = font;\n}\n\nfunction getFont() {\n return defaultFont;\n}\n\nfunction setFontSize(fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize() {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor(backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor() {\n return defaultBackgroundColor;\n}\n\nvar textStyle = {\n setFont: setFont,\n getFont: getFont,\n setFontSize: setFontSize,\n getFontSize: getFontSize,\n setBackgroundColor: setBackgroundColor,\n getBackgroundColor: getBackgroundColor\n};\n\nexports.default = textStyle;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = convertToVector3;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nfunction convertToVector3(arrayOrVector3) {\n var cornerstoneMath = _externalModules2.default.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.globalImageIdSpecificToolStateManager = exports.newImageIdSpecificToolStateManager = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager() {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState(imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState(imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState() {\n return toolState;\n }\n\n function restoreToolState(savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState(element, toolType, data) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n var imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n var toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState(element, toolType) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n var imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = imageIdToolState[toolType];\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager(element) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState: saveImageIdToolState,\n restoreImageIdToolState: restoreImageIdToolState,\n saveToolState: saveToolState,\n restoreToolState: restoreToolState,\n toolState: toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nvar globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexports.newImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager;\nexports.globalImageIdSpecificToolStateManager = globalImageIdSpecificToolStateManager;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return _externalModules2.default.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, storedPixelValue) {\n var cornerstone = _externalModules2.default.cornerstone;\n var patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n var modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n var modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n var patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n var petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n var radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n var startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n var totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n var halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n var seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n var acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n var injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n var durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n var correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n var suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Returns a decimal value given a fractional value\nfunction fracToDec(fractionalValue) {\n return parseFloat('.' + fractionalValue);\n}\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, handles, coords, distanceThreshold) {\n var nearbyHandle = void 0;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if ((0, _pointInsideBoundingBox2.default)(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n var handleCanvas = _externalModules2.default.cornerstone.pixelToCanvas(element, handle);\n var distance = _externalModules2.default.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _pointInsideBoundingBox = __webpack_require__(17);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar configMaxSimultaneousRequests = void 0;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nvar maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo() {\n var ua = navigator.userAgent;\n var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n var tem = void 0;\n\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n\n return 'IE ' + (tem[1] || '');\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests(newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests() {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests() {\n var infoString = getBrowserInfo();\n var info = infoString.split(' ');\n var browserName = info[0];\n var browserVersion = info[1];\n var browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice() {\n var pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n return pattern.test(navigator.userAgent);\n}\n\nexports.getDefaultSimultaneousRequests = getDefaultSimultaneousRequests;\nexports.getMaxSimultaneousRequests = getMaxSimultaneousRequests;\nexports.setMaxSimultaneousRequests = setMaxSimultaneousRequests;\nexports.getBrowserInfo = getBrowserInfo;\nexports.isMobileDevice = isMobileDevice;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseWheelCallback) {\n var toolInterface = {\n activate: function activate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n var eventData = {};\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseWheel', eventData, mouseWheelCallback);\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n var distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback(e, eventData) {\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = 'CornerstoneToolsMeasurementModified';\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n\n function mouseUpCallback() {\n handle.active = false;\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n function moveCallback(e, eventData) {\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = 'CornerstoneToolsMeasurementModified';\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n function whichMovement(e) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', whichMovement);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', whichMovement);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', moveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', moveCallback);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', moveEndCallback);\n if (e.type === 'CornerstoneToolsMouseDrag') {\n _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', moveEndCallback);\n }\n }\n\n function measurementRemovedCallback(e, eventData) {\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback(e, eventData) {\n if (eventData.toolType === toolType) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', moveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', moveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', whichMovement);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', whichMovement);\n _externalModules2.default.$(element).on('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n function moveEndCallback() {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', moveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', moveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (onImageRendered) {\n var configuration = {};\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonRectangleTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function customEventOnImageRendered(e) {\n onImageRendered(e, e.detail);\n }\n\n var toolInterface = {\n disable: function disable(element) {\n element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n },\n enable: function enable(element) {\n element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n element.addEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n var distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback(e, eventData) {\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = 'CornerstoneToolsMeasurementModified';\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback(e, eventData) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', moveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation);\n _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n if (e.type === 'CornerstoneToolsTouchPinch' || e.type === 'CornerstoneToolsTouchPress') {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation(e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', moveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPinch', moveEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchEnd', moveEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', moveEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', stopImmediatePropagation);\n\n function toolDeactivatedCallback() {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', moveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', moveEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation);\n _externalModules2.default.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.projectPatientPointToImagePlane = projectPatientPointToImagePlane;\nexports.imagePointToPatientPoint = imagePointToPatientPoint;\nexports.planePlaneIntersection = planePlaneIntersection;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Projects a patient point to an image point\nfunction projectPatientPointToImagePlane(patientPoint, imagePlane) {\n var rowCosines = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var columnCosines = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var imagePositionPatient = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var point = patientPoint.clone().sub(imagePositionPatient);\n var x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n var y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n return {\n x: x,\n y: y\n };\n}\n\n// Projects an image point to a patient point\nfunction imagePointToPatientPoint(imagePoint, imagePlane) {\n var rowCosines = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var columnCosines = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var imagePositionPatient = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n\n var x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n var y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n var patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane(imagePlane) {\n // Get the points\n var topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n var topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n var bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n var bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n var rect = {\n top: new _externalModules2.default.cornerstoneMath.Line3(topLeft, topRight),\n left: new _externalModules2.default.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new _externalModules2.default.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new _externalModules2.default.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n return rect;\n}\n\nfunction lineRectangleIntersection(line, rect) {\n var intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n var segment = rect[side];\n var intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nfunction planePlaneIntersection(targetImagePlane, referenceImagePlane) {\n var targetRowCosines = (0, _convertToVector2.default)(targetImagePlane.rowCosines);\n var targetColumnCosines = (0, _convertToVector2.default)(targetImagePlane.columnCosines);\n var targetImagePositionPatient = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n var referenceRowCosines = (0, _convertToVector2.default)(referenceImagePlane.rowCosines);\n var referenceColumnCosines = (0, _convertToVector2.default)(referenceImagePlane.columnCosines);\n var referenceImagePositionPatient = (0, _convertToVector2.default)(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n var targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n var targetPlane = new _externalModules2.default.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n var referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n var referencePlane = new _externalModules2.default.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n var originDirection = referencePlane.clone().intersectPlane(targetPlane);\n var origin = originDirection.origin;\n var direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n var bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n var distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n var line = new _externalModules2.default.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n var rect = getRectangleFromImagePlane(referenceImagePlane);\n var intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(20);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nvar numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nvar maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nvar awake = false;\nvar grabDelay = 20;\n\nfunction addRequest(element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n var requestDetails = {\n type: type,\n imageId: imageId,\n preventCache: preventCache,\n doneCallback: doneCallback,\n failCallback: failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n var imagePromise = _externalModules2.default.cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise) {\n imagePromise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack(type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain() {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest(requestDetails) {\n var cornerstone = _externalModules2.default.cornerstone;\n // Increment the number of current requests of this type\n var type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n var imageId = requestDetails.imageId;\n var doneCallback = requestDetails.doneCallback;\n var failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n var imagePromise = cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imagePromise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority(requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n var priority = requestTypeToLoadPriority(requestDetails);\n\n var loader = void 0;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority: priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority: priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing() {\n // Begin by grabbing X images\n var maxSimultaneousRequests = (0, _getMaxSimultaneousRequests.getMaxSimultaneousRequests)();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n var currentRequests = numRequests.interaction + numRequests.thumbnail + numRequests.prefetch;\n var requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (var i = 0; i < requestsToSend; i++) {\n var requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest() {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length && !requestPool.thumbnail.length && !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool() {\n return requestPool;\n}\n\nexports.default = {\n addRequest: addRequest,\n clearRequestStack: clearRequestStack,\n startGrabbing: startGrabbing,\n getRequestPool: getRequestPool\n};\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchDragCallback, options) {\n var configuration = {};\n var events = 'CornerstoneToolsMultiTouchDrag';\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsMultiTouchStart';\n }\n\n var toolInterface = {\n activate: function activate(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n\n if (options && options.eventData) {\n _externalModules2.default.$(element).on(events, options.eventData, touchDragCallback);\n } else {\n _externalModules2.default.$(element).on(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, images) {\n var loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var stackData = toolData.data[0];\n\n var newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n var nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n (0, _scrollToIndex2.default)(element, newImageIdIndex);\n};\n\nvar _scrollToIndex = __webpack_require__(43);\n\nvar _scrollToIndex2 = _interopRequireDefault(_scrollToIndex);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (value, precision) {\n var multiplier = Math.pow(10, precision);\n\n return Math.round(value * multiplier) / multiplier;\n};\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (ellipse, location) {\n var xRadius = ellipse.width / 2;\n var yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n var center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n var normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n var inEllipse = normalized.x * normalized.x / (xRadius * xRadius) + normalized.y * normalized.y / (yRadius * yRadius) <= 1.0;\n\n return inEllipse;\n};\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n};\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var storedPixelData = [];\n var index = 0;\n var pixelData = enabledElement.image.getPixelData();\n var spIndex = void 0,\n row = void 0,\n column = void 0;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * enabledElement.image.columns + (column + x)) * 4;\n var red = pixelData[spIndex];\n var green = pixelData[spIndex + 1];\n var blue = pixelData[spIndex + 2];\n var alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (points) {\n var page = _externalModules2.default.cornerstoneMath.point.copy(points.page);\n var image = _externalModules2.default.cornerstoneMath.point.copy(points.image);\n var client = _externalModules2.default.cornerstoneMath.point.copy(points.client);\n var canvas = _externalModules2.default.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page: page,\n image: image,\n client: client,\n canvas: canvas\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar coordsData = void 0;\n\nfunction setCoords(eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords() {\n return coordsData;\n}\n\nvar toolCoordinates = {\n setCoords: setCoords,\n getCoords: getCoords\n};\n\nexports.default = toolCoordinates;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n var activeHandle = getActiveHandle(handles);\n var nearbyHandle = (0, _getHandleNearImagePoint2.default)(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n};\n\nvar _getHandleNearImagePoint = __webpack_require__(19);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getActiveHandle(handles) {\n var activeHandle = void 0;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, data, toolData, toolType, options, doneMovingCallback) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n function mouseDragCallback(e, eventData) {\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n var handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n var eventType = 'CornerstoneToolsMeasurementModified';\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n\n function mouseUpCallback(e, eventData) {\n data.invalidated = true;\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true && (0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return true;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _toolState = __webpack_require__(1);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, timePoints, wrap) {\n var toolData = (0, _toolState.getToolState)(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var timeSeriesData = toolData.data[0];\n var currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n var currentImageIdIndex = currentStack.currentImageIdIndex;\n var newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n var viewport = cornerstone.getViewport(element);\n var newStack = timeSeriesData.stacks[newStackIndex];\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n var loader = void 0;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n var imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (targetImagePlane, referenceImagePlane) {\n var points = (0, _pointProjector.planePlaneIntersection)(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: (0, _pointProjector.projectPatientPointToImagePlane)(points.start, targetImagePlane),\n end: (0, _pointProjector.projectPatientPointToImagePlane)(points.end, targetImagePlane)\n };\n};\n\nvar _pointProjector = __webpack_require__(26);\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, eventData, targetElement, referenceElement) {\n var cornerstone = _externalModules2.default.cornerstone;\n var targetImage = cornerstone.getEnabledElement(targetElement).image;\n var referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n var referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane || !referenceImagePlane || !targetImagePlane.rowCosines || !targetImagePlane.columnCosines || !targetImagePlane.imagePositionPatient || !referenceImagePlane.rowCosines || !referenceImagePlane.columnCosines || !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = (0, _convertToVector2.default)(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = (0, _convertToVector2.default)(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = (0, _convertToVector2.default)(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = (0, _convertToVector2.default)(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = (0, _convertToVector2.default)(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n var targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n var referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n var angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) {\n // 0.5 radians = ~30 degrees\n return;\n }\n\n var referenceLine = (0, _calculateReferenceLine2.default)(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n var refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n var refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n var color = _toolColors2.default.getActiveColor();\n var lineWidth = _toolStyle2.default.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _calculateReferenceLine = __webpack_require__(39);\n\nvar _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _getOrientationString = __webpack_require__(63);\n\nvar _getOrientationString2 = _interopRequireDefault(_getOrientationString);\n\nvar _invertOrientationString = __webpack_require__(64);\n\nvar _invertOrientationString2 = _interopRequireDefault(_invertOrientationString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar orientation = {\n getOrientationString: _getOrientationString2.default,\n invertOrientationString: _invertOrientationString2.default\n};\n\nexports.default = orientation;\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, context, fontSize) {\n var fontScale = 0.1;\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n var lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n return {\n fontSize: scaledFontSize,\n lineHeight: lineHeight,\n fontScale: fontScale\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, newImageIdIndex) {\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n var stackRenderer = void 0;\n\n if (toolData.data.length > 1) {\n var stackRendererData = (0, _toolState.getToolState)(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n var stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n function doneCallback(image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch (error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback(error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n var eventData = {\n newImageIdIndex: newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n var newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n var config = _stackScroll.stackScroll.getConfiguration();\n\n if (config && config.retryLoadOnScroll === true) {\n var newImagePromise = cornerstone.imageCache.getImagePromise(newImageId);\n\n if (newImagePromise && newImagePromise.state() === 'rejected') {\n cornerstone.imageCache.removeImagePromise(newImageId);\n }\n }\n\n // Convert the preventCache value in stack data to a boolean\n var preventCache = Boolean(stackData.preventCache);\n\n var imagePromise = void 0;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n _requestPoolManager2.default.startGrabbing();\n\n (0, _triggerEvent2.default)(element, 'CornerstoneStackScroll', eventData);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _requestPoolManager = __webpack_require__(27);\n\nvar _requestPoolManager2 = _interopRequireDefault(_requestPoolManager);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _stackScroll = __webpack_require__(44);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.stackScrollMultiTouch = exports.stackScrollTouchDrag = exports.stackScrollWheel = exports.stackScroll = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _multiTouchDragTool = __webpack_require__(28);\n\nvar _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _mouseWheelTool = __webpack_require__(21);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _scroll = __webpack_require__(29);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n var mouseDragEventData = {\n deltaY: 0\n };\n\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, dragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback(e, eventData) {\n var images = -eventData.direction;\n\n var config = stackScroll.getConfiguration();\n\n var loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n (0, _scroll2.default)(eventData.element, images, loop);\n}\n\nfunction dragCallback(e, eventData) {\n var element = eventData.element;\n\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var stackData = toolData.data[0];\n\n var config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n var pixelsPerImage = Math.max(2, _externalModules2.default.$(element).height() / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n e.data.deltaY = e.data.deltaY || 0;\n e.data.deltaY += eventData.deltaPoints.page.y;\n if (Math.abs(e.data.deltaY) >= pixelsPerImage) {\n var imageDelta = e.data.deltaY / pixelsPerImage;\n var imageIdIndexOffset = Math.round(imageDelta);\n var imageDeltaMod = e.data.deltaY % pixelsPerImage;\n\n e.data.deltaY = imageDeltaMod;\n (0, _scroll2.default)(element, imageIdIndexOffset);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nvar stackScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\nvar stackScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\n\nvar options = {\n eventData: {\n deltaY: 0\n }\n};\nvar stackScrollTouchDrag = (0, _touchDragTool2.default)(dragCallback, options);\n\nfunction multiTouchDragCallback(e, eventData) {\n var config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e, eventData);\n }\n}\n\nvar configuration = {\n testPointers: function testPointers(eventData) {\n return eventData.numPointers >= 3;\n }\n};\n\nvar stackScrollMultiTouch = (0, _multiTouchDragTool2.default)(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexports.stackScroll = stackScroll;\nexports.stackScrollWheel = stackScrollWheel;\nexports.stackScrollTouchDrag = stackScrollTouchDrag;\nexports.stackScrollMultiTouch = stackScrollMultiTouch;\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var image = enabledElement.image;\n var luminance = [];\n var index = 0;\n var pixelData = image.getPixelData();\n var spIndex = void 0,\n row = void 0,\n column = void 0;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns + (column + x)) * 4;\n var red = pixelData[spIndex];\n var green = pixelData[spIndex + 1];\n var blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (row + y) * image.columns + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, x, y, w, h) {\n var kappa = 0.5522848,\n ox = w / 2 * kappa,\n // Control point offset horizontal\n oy = h / 2 * kappa,\n // Control point offset vertical\n xe = x + w,\n // X-end\n ye = y + h,\n // Y-end\n xm = x + w / 2,\n // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n};\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, start, color, lineWidth) {\n var handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n};\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n var headLength = 10;\n\n var angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n};\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n var sum = 0;\n var sumSquared = 0;\n var count = 0;\n var index = 0;\n\n for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n var point = {\n x: x,\n y: y\n };\n\n if ((0, _pointInEllipse2.default)(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count: count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n var mean = sum / count;\n var variance = sumSquared / count - mean * mean;\n\n return {\n count: count,\n mean: mean,\n variance: variance,\n stdDev: Math.sqrt(variance)\n };\n};\n\nvar _pointInEllipse = __webpack_require__(31);\n\nvar _pointInEllipse2 = _interopRequireDefault(_pointInEllipse);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (keyDownCallback) {\n var configuration = {};\n\n var toolInterface = {\n activate: function activate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsKeyDown', keyDownCallback);\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchEventData, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n var element = touchEventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n\n function touchDragCallback(e, eventData) {\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n var handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n var eventType = 'CornerstoneToolsMeasurementModified';\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback);\n\n function touchEndCallback(e, eventData) {\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchEnd', touchEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsDragEnd', touchEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n if (deleteIfHandleOutsideImage === true && (0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e, eventData);\n }\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPinch', touchEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchEnd', touchEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsDragEnd', touchEndCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', touchEndCallback);\n\n return true;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _toolState = __webpack_require__(1);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchEventData, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n var enabledElement = cornerstone.getEnabledElement(element);\n\n var time = new Date().getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n var fingerDistance = -57;\n\n var aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n var targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback(e, eventData) {\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n var currentPoints = eventData.currentPoints;\n var aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n var eventType = 'CornerstoneToolsMeasurementModified';\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback);\n\n function touchEndCallback(e, eventData) {\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n runAnimation.value = false;\n\n handle.active = false;\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback);\n _externalModules2.default.$(element).off(touchEndEvents, touchEndCallback);\n\n cornerstone.updateImage(element);\n\n if (e.type === 'CornerstoneToolsTouchPress') {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e, eventData);\n }\n }\n\n _externalModules2.default.$(element).on(touchEndEvents, touchEndCallback);\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nvar runAnimation = {\n value: false\n};\n\nvar touchEndEvents = ['CornerstoneToolsTouchEnd', 'CornerstoneToolsDragEnd', 'CornerstoneToolsTouchPinch', 'CornerstoneToolsTouchPress', 'CornerstoneToolsTap'].join(' ');\n\nfunction animate(lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Update\n var time = new Date().getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n var distanceRemaining = Math.abs(handle.y - targetLocation.y);\n var linearDistEachFrame = distanceRemaining / 10;\n\n console.log('distanceRemaining: ' + distanceRemaining);\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nvar antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n};\n\nvar lastInteractionType = void 0,\n lastInteractionTime = void 0;\n\nfunction handleTap(type, e) {\n var now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nvar handleTapMouse = handleTap.bind(null, pointerType.mouse);\nvar handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents(element, eventList, interactionType) {\n var tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n _externalModules2.default.$(element).on(eventName, tapHandler);\n });\n}\n\nfunction removeEvents(element, eventList, interactionType) {\n var tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n _externalModules2.default.$(element).off(eventName, tapHandler);\n });\n}\n\nvar mouseEvents = ['mousedown', 'mouseup'];\nvar touchEvents = ['touchstart', 'touchend'];\n\nfunction disable(element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable(element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nvar preventGhostClick = {\n enable: enable,\n disable: disable\n};\n\nexports.default = preventGhostClick;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (doubleTapCallback) {\n return {\n activate: function activate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n var eventData = {};\n\n _externalModules2.default.$(element).on('CornerstoneToolsDoubleTap', eventData, doubleTapCallback);\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n }\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseToolInterface, preventHandleOutsideImage) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(mouseEventData) {\n var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n (0, _moveHandle2.default)(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n }\n\n _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback(e, eventData) {\n _toolCoordinates2.default.setCoords(eventData);\n // If a mouse button is down, do nothing\n if (eventData.which !== 0) {\n return;\n }\n\n // If we have no tool data for this element, do nothing\n var toolData = (0, _toolState.getToolState)(eventData.element, mouseToolInterface.toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n var imageNeedsUpdate = false;\n var coords = eventData.currentPoints.canvas;\n\n for (var i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n var data = toolData.data[i];\n\n if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback(e, eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n\n function handleDoneMove() {\n data.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(eventData.element, mouseToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n }\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n var coords = eventData.startPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, mouseToolInterface.toolType);\n\n var i = void 0;\n\n // Now check to see if there is a handle we can move\n var distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n data.active = true;\n (0, _moveHandle2.default)(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n var options = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n (0, _moveAllHandles2.default)(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonRectangleTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered(e) {\n mouseToolInterface.onImageRendered(e, e.detail);\n }\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolCoordinates = __webpack_require__(35);\n\nvar _toolCoordinates2 = _interopRequireDefault(_toolCoordinates);\n\nvar _getHandleNearImagePoint = __webpack_require__(19);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _handleActivator = __webpack_require__(36);\n\nvar _handleActivator2 = _interopRequireDefault(_handleActivator);\n\nvar _moveHandle = __webpack_require__(22);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _moveAllHandles = __webpack_require__(37);\n\nvar _moveAllHandles2 = _interopRequireDefault(_moveAllHandles);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchPinchCallback) {\n var toolInterface = {\n activate: function activate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n var eventData = {};\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPinch', eventData, touchPinchCallback);\n },\n disable: function disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n },\n enable: function enable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n },\n deactivate: function deactivate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n }\n };\n\n return toolInterface;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (brushToolInterface) {\n function mouseMoveCallback(e, eventData) {\n brushToolInterface.onMouseMove(e, eventData);\n }\n\n function mouseUpCallback(e, eventData) {\n brushToolInterface.onMouseUp(e, eventData);\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseMoveCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n }\n\n function dragCallback(e, eventData) {\n brushToolInterface.onDrag(e, eventData);\n\n return false;\n }\n\n function mouseDownActivateCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n brushToolInterface.onMouseDown(e, eventData);\n\n return false;\n }\n\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseMoveCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n }\n\n function onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = void 0;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n (0, _toolState.addToolState)(element, TOOL_STATE_TOOL_TYPE, { pixelData: pixelData });\n }\n\n var layer = _externalModules2.default.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n\n // Note: This is to maintain compatibility with jQuery event handlers.\n // On our next migration this should just be onImageRendered(e)\n brushToolInterface.onImageRendered(e, eventData);\n }\n\n function activate(element, mouseButtonMask) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback);\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var _enabledElement$image = enabledElement.image,\n width = _enabledElement$image.width,\n height = _enabledElement$image.height;\n\n var pixelData = new Uint8ClampedArray(width * height);\n\n var configuration = brushTool.getConfiguration();\n var colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n var colormap = _externalModules2.default.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n var labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: function getPixelData() {\n return pixelData;\n },\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height: height,\n width: width,\n pixelData: pixelData,\n setPixelData: function setPixelData(data) {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n var layer = void 0;\n var options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = _externalModules2.default.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = _externalModules2.default.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n (0, _toolState.addToolState)(element, TOOL_STATE_TOOL_TYPE, { pixelData: pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n function deactivate(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n }\n\n var brushTool = (0, _mouseButtonTool2.default)({\n mouseMoveCallback: mouseMoveCallback,\n mouseDownActivateCallback: mouseDownActivateCallback,\n onImageRendered: onImageRendered,\n deactivate: deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar brushLayerId = void 0;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getCircle;\nfunction getCircle(radius, rows, columns) {\n var xCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var yCoord = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n\n var x0 = Math.round(xCoord);\n var y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n var circleArray = [];\n var index = 0;\n\n for (var y = -radius; y <= radius; y++) {\n var _yCoord = y0 + y;\n\n if (_yCoord > rows || _yCoord < 0) {\n continue;\n }\n\n for (var x = -radius; x <= radius; x++) {\n var _xCoord = x0 + x;\n\n if (_xCoord > columns || _xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.drawBrushOnCanvas = exports.drawBrushPixels = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction drawBrushPixels(pointerArray, storedPixels, brushPixelValue, columns) {\n var getPixelIndex = function getPixelIndex(x, y) {\n return y * columns + x;\n };\n\n pointerArray.forEach(function (point) {\n var spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas(pointerArray, canvasContext, color, element) {\n var canvasPtTL = _externalModules2.default.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n var canvasPtBR = _externalModules2.default.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n var sizeX = canvasPtBR.x - canvasPtTL.x;\n var sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach(function (point) {\n var canvasPt = _externalModules2.default.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexports.drawBrushPixels = drawBrushPixels;\nexports.drawBrushOnCanvas = drawBrushOnCanvas;\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nObject.defineProperty(exports, 'external', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_externalModules).default;\n }\n});\n\nvar _index = __webpack_require__(61);\n\nObject.defineProperty(exports, 'referenceLines', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index).default;\n }\n});\n\nvar _index2 = __webpack_require__(41);\n\nObject.defineProperty(exports, 'orientation', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index2).default;\n }\n});\n\nvar _requestPoolManager = __webpack_require__(27);\n\nObject.defineProperty(exports, 'requestPoolManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_requestPoolManager).default;\n }\n});\n\nvar _setContextToDisplayFontSize = __webpack_require__(42);\n\nObject.defineProperty(exports, 'setContextToDisplayFontSize', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setContextToDisplayFontSize).default;\n }\n});\n\nvar _scrollToIndex = __webpack_require__(43);\n\nObject.defineProperty(exports, 'scrollToIndex', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scrollToIndex).default;\n }\n});\n\nvar _scroll = __webpack_require__(29);\n\nObject.defineProperty(exports, 'scroll', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scroll).default;\n }\n});\n\nvar _roundToDecimal = __webpack_require__(30);\n\nObject.defineProperty(exports, 'roundToDecimal', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_roundToDecimal).default;\n }\n});\n\nvar _pointProjector = __webpack_require__(26);\n\nObject.defineProperty(exports, 'projectPatientPointToImagePlane', {\n enumerable: true,\n get: function get() {\n return _pointProjector.projectPatientPointToImagePlane;\n }\n});\nObject.defineProperty(exports, 'imagePointToPatientPoint', {\n enumerable: true,\n get: function get() {\n return _pointProjector.imagePointToPatientPoint;\n }\n});\nObject.defineProperty(exports, 'planePlaneIntersection', {\n enumerable: true,\n get: function get() {\n return _pointProjector.planePlaneIntersection;\n }\n});\n\nvar _pointInsideBoundingBox = __webpack_require__(17);\n\nObject.defineProperty(exports, 'pointInsideBoundingBox', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pointInsideBoundingBox).default;\n }\n});\n\nvar _pointInEllipse = __webpack_require__(31);\n\nObject.defineProperty(exports, 'pointInEllipse', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pointInEllipse).default;\n }\n});\n\nvar _pauseEvent = __webpack_require__(32);\n\nObject.defineProperty(exports, 'pauseEvent', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pauseEvent).default;\n }\n});\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nObject.defineProperty(exports, 'isMouseButtonEnabled', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_isMouseButtonEnabled).default;\n }\n});\n\nvar _getRGBPixels = __webpack_require__(33);\n\nObject.defineProperty(exports, 'getRGBPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getRGBPixels).default;\n }\n});\n\nvar _getMaxSimultaneousRequests = __webpack_require__(20);\n\nObject.defineProperty(exports, 'getDefaultSimultaneousRequests', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getDefaultSimultaneousRequests;\n }\n});\nObject.defineProperty(exports, 'getMaxSimultaneousRequests', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getMaxSimultaneousRequests;\n }\n});\nObject.defineProperty(exports, 'getBrowserInfo', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getBrowserInfo;\n }\n});\nObject.defineProperty(exports, 'isMobileDevice', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.isMobileDevice;\n }\n});\n\nvar _getLuminance = __webpack_require__(45);\n\nObject.defineProperty(exports, 'getLuminance', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getLuminance).default;\n }\n});\n\nvar _drawTextBox = __webpack_require__(6);\n\nObject.defineProperty(exports, 'drawTextBox', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawTextBox).default;\n }\n});\n\nvar _drawEllipse = __webpack_require__(46);\n\nObject.defineProperty(exports, 'drawEllipse', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawEllipse).default;\n }\n});\n\nvar _drawCircle = __webpack_require__(47);\n\nObject.defineProperty(exports, 'drawCircle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawCircle).default;\n }\n});\n\nvar _drawArrow = __webpack_require__(48);\n\nObject.defineProperty(exports, 'drawArrow', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawArrow).default;\n }\n});\n\nvar _copyPoints = __webpack_require__(34);\n\nObject.defineProperty(exports, 'copyPoints', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_copyPoints).default;\n }\n});\n\nvar _calculateSUV = __webpack_require__(18);\n\nObject.defineProperty(exports, 'calculateSUV', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_calculateSUV).default;\n }\n});\n\nvar _calculateEllipseStatistics = __webpack_require__(49);\n\nObject.defineProperty(exports, 'calculateEllipseStatistics', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_calculateEllipseStatistics).default;\n }\n});\n\nvar _probeTool4D = __webpack_require__(65);\n\nObject.defineProperty(exports, 'probeTool4D', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_probeTool4D).default;\n }\n});\n\nvar _incrementTimePoint = __webpack_require__(38);\n\nObject.defineProperty(exports, 'incrementTimePoint', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_incrementTimePoint).default;\n }\n});\n\nvar _timeSeriesPlayer = __webpack_require__(68);\n\nObject.defineProperty(exports, 'timeSeriesPlayer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_timeSeriesPlayer).default;\n }\n});\n\nvar _timeSeriesScroll = __webpack_require__(69);\n\nObject.defineProperty(exports, 'timeSeriesScroll', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScroll;\n }\n});\nObject.defineProperty(exports, 'timeSeriesScrollWheel', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScrollWheel;\n }\n});\nObject.defineProperty(exports, 'timeSeriesScrollTouchDrag', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScrollTouchDrag;\n }\n});\n\nvar _wwwcSynchronizer = __webpack_require__(70);\n\nObject.defineProperty(exports, 'wwwcSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_wwwcSynchronizer).default;\n }\n});\n\nvar _updateImageSynchronizer = __webpack_require__(71);\n\nObject.defineProperty(exports, 'updateImageSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_updateImageSynchronizer).default;\n }\n});\n\nvar _Synchronizer = __webpack_require__(72);\n\nObject.defineProperty(exports, 'Synchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_Synchronizer).default;\n }\n});\n\nvar _stackScrollSynchronizer = __webpack_require__(73);\n\nObject.defineProperty(exports, 'stackScrollSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackScrollSynchronizer).default;\n }\n});\n\nvar _stackImagePositionSynchronizer = __webpack_require__(74);\n\nObject.defineProperty(exports, 'stackImagePositionSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImagePositionSynchronizer).default;\n }\n});\n\nvar _stackImagePositionOffsetSynchronizer = __webpack_require__(75);\n\nObject.defineProperty(exports, 'stackImagePositionOffsetSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImagePositionOffsetSynchronizer).default;\n }\n});\n\nvar _stackImageIndexSynchronizer = __webpack_require__(76);\n\nObject.defineProperty(exports, 'stackImageIndexSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImageIndexSynchronizer).default;\n }\n});\n\nvar _panZoomSynchronizer = __webpack_require__(77);\n\nObject.defineProperty(exports, 'panZoomSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_panZoomSynchronizer).default;\n }\n});\n\nvar _toolStyle = __webpack_require__(5);\n\nObject.defineProperty(exports, 'toolStyle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolStyle).default;\n }\n});\n\nvar _toolState = __webpack_require__(1);\n\nObject.defineProperty(exports, 'addToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.addToolState;\n }\n});\nObject.defineProperty(exports, 'getToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.getToolState;\n }\n});\nObject.defineProperty(exports, 'removeToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.removeToolState;\n }\n});\nObject.defineProperty(exports, 'clearToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.clearToolState;\n }\n});\nObject.defineProperty(exports, 'setElementToolStateManager', {\n enumerable: true,\n get: function get() {\n return _toolState.setElementToolStateManager;\n }\n});\nObject.defineProperty(exports, 'getElementToolStateManager', {\n enumerable: true,\n get: function get() {\n return _toolState.getElementToolStateManager;\n }\n});\n\nvar _toolCoordinates = __webpack_require__(35);\n\nObject.defineProperty(exports, 'toolCoordinates', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolCoordinates).default;\n }\n});\n\nvar _toolColors = __webpack_require__(4);\n\nObject.defineProperty(exports, 'toolColors', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolColors).default;\n }\n});\n\nvar _timeSeriesSpecificStateManager = __webpack_require__(78);\n\nObject.defineProperty(exports, 'addTimeSeriesStateManager', {\n enumerable: true,\n get: function get() {\n return _timeSeriesSpecificStateManager.addTimeSeriesStateManager;\n }\n});\nObject.defineProperty(exports, 'newTimeSeriesSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _timeSeriesSpecificStateManager.newTimeSeriesSpecificToolStateManager;\n }\n});\n\nvar _textStyle = __webpack_require__(14);\n\nObject.defineProperty(exports, 'textStyle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_textStyle).default;\n }\n});\n\nvar _stackSpecificStateManager = __webpack_require__(79);\n\nObject.defineProperty(exports, 'stackSpecificStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.stackSpecificStateManager;\n }\n});\nObject.defineProperty(exports, 'newStackSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.newStackSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'addStackStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.addStackStateManager;\n }\n});\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nObject.defineProperty(exports, 'loadHandlerManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_loadHandlerManager).default;\n }\n});\n\nvar _imageIdSpecificStateManager = __webpack_require__(16);\n\nObject.defineProperty(exports, 'newImageIdSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _imageIdSpecificStateManager.newImageIdSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'globalImageIdSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n});\n\nvar _frameOfReferenceStateManager = __webpack_require__(80);\n\nObject.defineProperty(exports, 'newFrameOfReferenceSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _frameOfReferenceStateManager.newFrameOfReferenceSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'globalFrameOfReferenceSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _frameOfReferenceStateManager.globalFrameOfReferenceSpecificToolStateManager;\n }\n});\n\nvar _appState = __webpack_require__(81);\n\nObject.defineProperty(exports, 'appState', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_appState).default;\n }\n});\n\nvar _stackScrollKeyboard = __webpack_require__(82);\n\nObject.defineProperty(exports, 'stackScrollKeyboard', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackScrollKeyboard).default;\n }\n});\n\nvar _stackScroll = __webpack_require__(44);\n\nObject.defineProperty(exports, 'stackScroll', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScroll;\n }\n});\nObject.defineProperty(exports, 'stackScrollWheel', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollWheel;\n }\n});\nObject.defineProperty(exports, 'stackScrollTouchDrag', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollTouchDrag;\n }\n});\nObject.defineProperty(exports, 'stackScrollMultiTouch', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollMultiTouch;\n }\n});\n\nvar _stackPrefetch = __webpack_require__(83);\n\nObject.defineProperty(exports, 'stackPrefetch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackPrefetch).default;\n }\n});\n\nvar _scrollIndicator = __webpack_require__(84);\n\nObject.defineProperty(exports, 'scrollIndicator', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scrollIndicator).default;\n }\n});\n\nvar _stackRenderers = __webpack_require__(85);\n\nObject.defineProperty(exports, 'stackRenderers', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackRenderers).default;\n }\n});\n\nvar _playClip = __webpack_require__(87);\n\nObject.defineProperty(exports, 'playClip', {\n enumerable: true,\n get: function get() {\n return _playClip.playClip;\n }\n});\nObject.defineProperty(exports, 'stopClip', {\n enumerable: true,\n get: function get() {\n return _playClip.stopClip;\n }\n});\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nObject.defineProperty(exports, 'anyHandlesOutsideImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_anyHandlesOutsideImage).default;\n }\n});\n\nvar _drawHandles = __webpack_require__(8);\n\nObject.defineProperty(exports, 'drawHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawHandles).default;\n }\n});\n\nvar _getHandleNearImagePoint = __webpack_require__(19);\n\nObject.defineProperty(exports, 'getHandleNearImagePoint', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getHandleNearImagePoint).default;\n }\n});\n\nvar _handleActivator = __webpack_require__(36);\n\nObject.defineProperty(exports, 'handleActivator', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_handleActivator).default;\n }\n});\n\nvar _moveAllHandles = __webpack_require__(37);\n\nObject.defineProperty(exports, 'moveAllHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveAllHandles).default;\n }\n});\n\nvar _moveHandle = __webpack_require__(22);\n\nObject.defineProperty(exports, 'moveHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveHandle).default;\n }\n});\n\nvar _moveNewHandle = __webpack_require__(23);\n\nObject.defineProperty(exports, 'moveNewHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveNewHandle).default;\n }\n});\n\nvar _moveNewHandleTouch = __webpack_require__(25);\n\nObject.defineProperty(exports, 'moveNewHandleTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveNewHandleTouch).default;\n }\n});\n\nvar _touchMoveAllHandles = __webpack_require__(51);\n\nObject.defineProperty(exports, 'touchMoveAllHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchMoveAllHandles).default;\n }\n});\n\nvar _touchMoveHandle = __webpack_require__(52);\n\nObject.defineProperty(exports, 'touchMoveHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchMoveHandle).default;\n }\n});\n\nvar _keyboardInput = __webpack_require__(88);\n\nObject.defineProperty(exports, 'keyboardInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyboardInput).default;\n }\n});\n\nvar _mouseInput = __webpack_require__(89);\n\nObject.defineProperty(exports, 'mouseInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseInput).default;\n }\n});\n\nvar _mouseWheelInput = __webpack_require__(90);\n\nObject.defineProperty(exports, 'mouseWheelInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseWheelInput).default;\n }\n});\n\nvar _preventGhostClick = __webpack_require__(53);\n\nObject.defineProperty(exports, 'preventGhostClick', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_preventGhostClick).default;\n }\n});\n\nvar _touchInput = __webpack_require__(91);\n\nObject.defineProperty(exports, 'touchInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchInput).default;\n }\n});\n\nvar _angleTool = __webpack_require__(92);\n\nObject.defineProperty(exports, 'angle', {\n enumerable: true,\n get: function get() {\n return _angleTool.angle;\n }\n});\nObject.defineProperty(exports, 'angleTouch', {\n enumerable: true,\n get: function get() {\n return _angleTool.angleTouch;\n }\n});\n\nvar _arrowAnnotate = __webpack_require__(93);\n\nObject.defineProperty(exports, 'arrowAnnotate', {\n enumerable: true,\n get: function get() {\n return _arrowAnnotate.arrowAnnotate;\n }\n});\nObject.defineProperty(exports, 'arrowAnnotateTouch', {\n enumerable: true,\n get: function get() {\n return _arrowAnnotate.arrowAnnotateTouch;\n }\n});\n\nvar _crosshairs = __webpack_require__(94);\n\nObject.defineProperty(exports, 'crosshairs', {\n enumerable: true,\n get: function get() {\n return _crosshairs.crosshairs;\n }\n});\nObject.defineProperty(exports, 'crosshairsTouch', {\n enumerable: true,\n get: function get() {\n return _crosshairs.crosshairsTouch;\n }\n});\n\nvar _displayTool = __webpack_require__(24);\n\nObject.defineProperty(exports, 'displayTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_displayTool).default;\n }\n});\n\nvar _doubleTapTool = __webpack_require__(54);\n\nObject.defineProperty(exports, 'doubleTapTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_doubleTapTool).default;\n }\n});\n\nvar _doubleTapZoom = __webpack_require__(95);\n\nObject.defineProperty(exports, 'doubleTapZoom', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_doubleTapZoom).default;\n }\n});\n\nvar _dragProbe = __webpack_require__(96);\n\nObject.defineProperty(exports, 'dragProbe', {\n enumerable: true,\n get: function get() {\n return _dragProbe.dragProbe;\n }\n});\nObject.defineProperty(exports, 'dragProbeTouch', {\n enumerable: true,\n get: function get() {\n return _dragProbe.dragProbeTouch;\n }\n});\n\nvar _ellipticalRoi = __webpack_require__(97);\n\nObject.defineProperty(exports, 'ellipticalRoi', {\n enumerable: true,\n get: function get() {\n return _ellipticalRoi.ellipticalRoi;\n }\n});\nObject.defineProperty(exports, 'ellipticalRoiTouch', {\n enumerable: true,\n get: function get() {\n return _ellipticalRoi.ellipticalRoiTouch;\n }\n});\n\nvar _freehand = __webpack_require__(98);\n\nObject.defineProperty(exports, 'freehand', {\n enumerable: true,\n get: function get() {\n return _freehand.freehand;\n }\n});\n\nvar _highlight = __webpack_require__(99);\n\nObject.defineProperty(exports, 'highlight', {\n enumerable: true,\n get: function get() {\n return _highlight.highlight;\n }\n});\nObject.defineProperty(exports, 'highlightTouch', {\n enumerable: true,\n get: function get() {\n return _highlight.highlightTouch;\n }\n});\n\nvar _imageStats = __webpack_require__(100);\n\nObject.defineProperty(exports, 'imageStats', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_imageStats).default;\n }\n});\n\nvar _keyboardTool = __webpack_require__(50);\n\nObject.defineProperty(exports, 'keyboardTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyboardTool).default;\n }\n});\n\nvar _length = __webpack_require__(101);\n\nObject.defineProperty(exports, 'length', {\n enumerable: true,\n get: function get() {\n return _length.length;\n }\n});\nObject.defineProperty(exports, 'lengthTouch', {\n enumerable: true,\n get: function get() {\n return _length.lengthTouch;\n }\n});\n\nvar _magnify = __webpack_require__(102);\n\nObject.defineProperty(exports, 'magnify', {\n enumerable: true,\n get: function get() {\n return _magnify.magnify;\n }\n});\nObject.defineProperty(exports, 'magnifyTouchDrag', {\n enumerable: true,\n get: function get() {\n return _magnify.magnifyTouchDrag;\n }\n});\n\nvar _mouseButtonRectangleTool = __webpack_require__(55);\n\nObject.defineProperty(exports, 'mouseButtonRectangleTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseButtonRectangleTool).default;\n }\n});\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nObject.defineProperty(exports, 'mouseButtonTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseButtonTool).default;\n }\n});\n\nvar _mouseWheelTool = __webpack_require__(21);\n\nObject.defineProperty(exports, 'mouseWheelTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseWheelTool).default;\n }\n});\n\nvar _multiTouchDragTool = __webpack_require__(28);\n\nObject.defineProperty(exports, 'multiTouchDragTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_multiTouchDragTool).default;\n }\n});\n\nvar _orientationMarkers = __webpack_require__(103);\n\nObject.defineProperty(exports, 'orientationMarkers', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_orientationMarkers).default;\n }\n});\n\nvar _pan = __webpack_require__(104);\n\nObject.defineProperty(exports, 'pan', {\n enumerable: true,\n get: function get() {\n return _pan.pan;\n }\n});\nObject.defineProperty(exports, 'panTouchDrag', {\n enumerable: true,\n get: function get() {\n return _pan.panTouchDrag;\n }\n});\n\nvar _panMultiTouch = __webpack_require__(105);\n\nObject.defineProperty(exports, 'panMultiTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_panMultiTouch).default;\n }\n});\n\nvar _probe = __webpack_require__(106);\n\nObject.defineProperty(exports, 'probe', {\n enumerable: true,\n get: function get() {\n return _probe.probe;\n }\n});\nObject.defineProperty(exports, 'probeTouch', {\n enumerable: true,\n get: function get() {\n return _probe.probeTouch;\n }\n});\n\nvar _rectangleRoi = __webpack_require__(107);\n\nObject.defineProperty(exports, 'rectangleRoi', {\n enumerable: true,\n get: function get() {\n return _rectangleRoi.rectangleRoi;\n }\n});\nObject.defineProperty(exports, 'rectangleRoiTouch', {\n enumerable: true,\n get: function get() {\n return _rectangleRoi.rectangleRoiTouch;\n }\n});\n\nvar _rotate = __webpack_require__(108);\n\nObject.defineProperty(exports, 'rotate', {\n enumerable: true,\n get: function get() {\n return _rotate.rotate;\n }\n});\nObject.defineProperty(exports, 'rotateTouchDrag', {\n enumerable: true,\n get: function get() {\n return _rotate.rotateTouchDrag;\n }\n});\n\nvar _rotateTouch = __webpack_require__(109);\n\nObject.defineProperty(exports, 'rotateTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_rotateTouch).default;\n }\n});\n\nvar _saveAs = __webpack_require__(110);\n\nObject.defineProperty(exports, 'saveAs', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_saveAs).default;\n }\n});\n\nvar _seedAnnotate = __webpack_require__(111);\n\nObject.defineProperty(exports, 'seedAnnotate', {\n enumerable: true,\n get: function get() {\n return _seedAnnotate.seedAnnotate;\n }\n});\nObject.defineProperty(exports, 'seedAnnotateTouch', {\n enumerable: true,\n get: function get() {\n return _seedAnnotate.seedAnnotateTouch;\n }\n});\n\nvar _simpleAngle = __webpack_require__(112);\n\nObject.defineProperty(exports, 'simpleAngle', {\n enumerable: true,\n get: function get() {\n return _simpleAngle.simpleAngle;\n }\n});\nObject.defineProperty(exports, 'simpleAngleTouch', {\n enumerable: true,\n get: function get() {\n return _simpleAngle.simpleAngleTouch;\n }\n});\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nObject.defineProperty(exports, 'simpleMouseButtonTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_simpleMouseButtonTool).default;\n }\n});\n\nvar _textMarker = __webpack_require__(113);\n\nObject.defineProperty(exports, 'textMarker', {\n enumerable: true,\n get: function get() {\n return _textMarker.textMarker;\n }\n});\nObject.defineProperty(exports, 'textMarkerTouch', {\n enumerable: true,\n get: function get() {\n return _textMarker.textMarkerTouch;\n }\n});\n\nvar _touchDragTool = __webpack_require__(11);\n\nObject.defineProperty(exports, 'touchDragTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchDragTool).default;\n }\n});\n\nvar _touchPinchTool = __webpack_require__(56);\n\nObject.defineProperty(exports, 'touchPinchTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchPinchTool).default;\n }\n});\n\nvar _touchTool = __webpack_require__(9);\n\nObject.defineProperty(exports, 'touchTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchTool).default;\n }\n});\n\nvar _wwwc = __webpack_require__(114);\n\nObject.defineProperty(exports, 'wwwc', {\n enumerable: true,\n get: function get() {\n return _wwwc.wwwc;\n }\n});\nObject.defineProperty(exports, 'wwwcTouchDrag', {\n enumerable: true,\n get: function get() {\n return _wwwc.wwwcTouchDrag;\n }\n});\n\nvar _wwwcRegion = __webpack_require__(115);\n\nObject.defineProperty(exports, 'wwwcRegion', {\n enumerable: true,\n get: function get() {\n return _wwwcRegion.wwwcRegion;\n }\n});\nObject.defineProperty(exports, 'wwwcRegionTouch', {\n enumerable: true,\n get: function get() {\n return _wwwcRegion.wwwcRegionTouch;\n }\n});\n\nvar _zoom = __webpack_require__(116);\n\nObject.defineProperty(exports, 'zoom', {\n enumerable: true,\n get: function get() {\n return _zoom.zoom;\n }\n});\nObject.defineProperty(exports, 'zoomWheel', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomWheel;\n }\n});\nObject.defineProperty(exports, 'zoomTouchPinch', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomTouchPinch;\n }\n});\nObject.defineProperty(exports, 'zoomTouchDrag', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomTouchDrag;\n }\n});\n\nvar _brush = __webpack_require__(117);\n\nObject.defineProperty(exports, 'brush', {\n enumerable: true,\n get: function get() {\n return _brush.brush;\n }\n});\n\nvar _adaptiveBrush = __webpack_require__(118);\n\nObject.defineProperty(exports, 'adaptiveBrush', {\n enumerable: true,\n get: function get() {\n return _adaptiveBrush.adaptiveBrush;\n }\n});\n\nvar _version = __webpack_require__(119);\n\nObject.defineProperty(exports, 'version', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_version).default;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _calculateReferenceLine = __webpack_require__(39);\n\nvar _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine);\n\nvar _referenceLinesTool = __webpack_require__(62);\n\nvar _referenceLinesTool2 = _interopRequireDefault(_referenceLinesTool);\n\nvar _renderActiveReferenceLine = __webpack_require__(40);\n\nvar _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar referenceLines = {\n calculateReferenceLine: _calculateReferenceLine2.default,\n tool: _referenceLinesTool2.default,\n renderActiveReferenceLine: _renderActiveReferenceLine2.default\n};\n\nexports.default = referenceLines;\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _renderActiveReferenceLine = __webpack_require__(40);\n\nvar _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'referenceLines';\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n var syncContext = toolData.data[0].synchronizationContext;\n var enabledElements = syncContext.getSourceElements();\n\n var renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach(function (referenceEnabledElement) {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable(element, synchronizationContext, renderer) {\n renderer = renderer || _renderActiveReferenceLine2.default;\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext,\n renderer: renderer\n });\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nvar tool = {\n enable: enable,\n disable: disable\n};\n\nexports.default = tool;\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (vector) {\n var vec3 = (0, _convertToVector2.default)(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n var orientation = '';\n var orientationX = vec3.x < 0 ? 'R' : 'L';\n var orientationY = vec3.y < 0 ? 'A' : 'P';\n var orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n var abs = new _externalModules2.default.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (var i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (string) {\n var inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n};\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _setContextToDisplayFontSize = __webpack_require__(42);\n\nvar _setContextToDisplayFontSize2 = _interopRequireDefault(_setContextToDisplayFontSize);\n\nvar _toolState = __webpack_require__(1);\n\nvar _measurementManager = __webpack_require__(66);\n\nvar _measurementManager2 = _interopRequireDefault(_measurementManager);\n\nvar _lineSampleMeasurement = __webpack_require__(67);\n\nvar _lineSampleMeasurement2 = _interopRequireDefault(_lineSampleMeasurement);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'probe4D';\n\nfunction updateLineSample(measurementData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n var loader = void 0;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n var offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n var sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n var timeSeriestoolData = (0, _toolState.getToolState)(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n var timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n timeSeries: timeSeries,\n lineSample: new _lineSampleMeasurement2.default(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n _measurementManager2.default.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n var color = 'white';\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n var data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n context.stroke();\n\n // Draw text\n var fontParameters = (0, _setContextToDisplayFontSize2.default)(eventData.enabledElement, eventData.canvasContext, 15);\n\n context.font = fontParameters.fontSize + 'px Arial';\n\n // Translate the x/y away from the cursor\n var x = Math.round(data.handles.end.x);\n var y = Math.round(data.handles.end.y);\n var textX = data.handles.end.x + 3;\n var textY = data.handles.end.y - 3;\n\n context.fillStyle = color;\n\n context.fillText(x + ',' + y, textX, textY);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar probeTool4D = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n toolType: toolType\n});\n\nexports.default = probeTool4D;\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This object manages a collection of measurements\nfunction MeasurementManager() {\n var that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n var index = that.measurements.push(measurement);\n // Fire event\n var eventDetail = {\n index: index,\n measurement: measurement\n };\n\n (0, _triggerEvent2.default)(that, 'CornerstoneMeasurementAdded', eventDetail);\n };\n\n this.remove = function (index) {\n var measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n var eventDetail = {\n index: index,\n measurement: measurement\n };\n\n (0, _triggerEvent2.default)(that, 'CornerstoneMeasurementRemoved', eventDetail);\n };\n}\n\n// Module/private exports\nvar manager = new MeasurementManager();\n\nexports.default = manager;\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n\n var that = this;\n\n that.samples = [];\n\n // Adds an element as both a source and a target\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n (0, _triggerEvent2.default)(that, 'CornerstoneLineSampleUpdated');\n };\n};\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _toolState = __webpack_require__(1);\n\nvar _incrementTimePoint = __webpack_require__(38);\n\nvar _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip(element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n var timeSeriesToolData = (0, _toolState.getToolState)(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n var playClipData = void 0;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n (0, _toolState.addToolState)(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n (0, _incrementTimePoint2.default)(element, 1, true);\n } else {\n (0, _incrementTimePoint2.default)(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip(element) {\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n var playClipData = playClipToolData.data[0];\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nvar timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexports.default = timeSeriesPlayer;\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.timeSeriesScrollTouchDrag = exports.timeSeriesScrollWheel = exports.timeSeriesScroll = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _mouseWheelTool = __webpack_require__(21);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _incrementTimePoint = __webpack_require__(38);\n\nvar _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n\n var mouseDragEventData = {\n deltaY: 0,\n options: e.data.options\n };\n\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, mouseDragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback(e, eventData) {\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n var toolData = (0, _toolState.getToolState)(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n var timeSeriesData = toolData.data[0];\n\n var pixelsPerTimeSeries = _externalModules2.default.$(eventData.element).height() / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n var timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n var timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n (0, _incrementTimePoint2.default)(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback(e, eventData) {\n var images = -eventData.direction;\n\n (0, _incrementTimePoint2.default)(eventData.element, images);\n}\n\nfunction onDrag(e) {\n var mouseMoveData = e.originalEvent.detail;\n var eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n var toolData = (0, _toolState.getToolState)(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n var timeSeriesDelta = eventData.deltaY / 3;\n var timeSeriesDeltaMod = eventData.deltaY % 3;\n\n (0, _incrementTimePoint2.default)(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nvar timeSeriesScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\nvar timeSeriesScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\nvar timeSeriesScrollTouchDrag = (0, _touchDragTool2.default)(onDrag);\n\nexports.timeSeriesScroll = timeSeriesScroll;\nexports.timeSeriesScrollWheel = timeSeriesScrollWheel;\nexports.timeSeriesScrollTouchDrag = timeSeriesScrollTouchDrag;\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the source and target viewports\n var sourceViewport = cornerstone.getViewport(sourceElement);\n var targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n _externalModules2.default.cornerstone.updateImage(targetElement);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer(event, handler) {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n var sourceElements = []; // Source elements fire the events we want to synchronize to\n var targetElements = []; // Target elements we want to synchronize to source elements\n\n var ignoreFiredEvents = false;\n var initialData = {};\n var eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n var sourceImageId = sourceEnabledElement.image.imageId;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n var targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n var targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n var targetImagePosition = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent(sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n var targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n var targetImageId = initialData.imageIds.targetElements[targetIndex];\n var sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n var sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n var positionDifference = void 0;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent(e, eventData) {\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n var index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n _externalModules2.default.$(element).on(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n var index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n var index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n _externalModules2.default.$(element).off(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n var index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler(e) {\n var element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n var elements = _externalModules2.default.$.unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener('cornerstoneelementdisabled', disableHandler);\n element.addEventListener('cornerstoneelementdisabled', disableHandler);\n });\n };\n\n this.destroy = function () {\n var elements = _externalModules2.default.$.unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexports.default = Synchronizer;\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the stack of the target viewport\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n var newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n var finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceStackToolDataSource = (0, _toolState.getToolState)(sourceElement, 'stack');\n var sourceStackData = sourceStackToolDataSource.data[0];\n var targetStackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var targetStackData = targetStackToolDataSource.data[0];\n\n var newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the source and target viewports\n var sourceViewport = cornerstone.getViewport(sourceElement);\n var targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newTimeSeriesSpecificToolStateManager = exports.addTimeSeriesStateManager = undefined;\n\nvar _imageIdSpecificStateManager = __webpack_require__(16);\n\nvar _toolState = __webpack_require__(1);\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager(toolTypes, oldStateManager) {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState(element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n var toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState(element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n var imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n return imageIdToolStateManager;\n}\n\nvar timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager(element, tools) {\n tools = tools || ['timeSeries'];\n var oldStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n var timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n (0, _toolState.setElementToolStateManager)(element, timeSeriesSpecificStateManager);\n}\n\nexports.addTimeSeriesStateManager = addTimeSeriesStateManager;\nexports.newTimeSeriesSpecificToolStateManager = newTimeSeriesSpecificToolStateManager;\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addStackStateManager = exports.newStackSpecificToolStateManager = exports.stackSpecificStateManager = undefined;\n\nvar _imageIdSpecificStateManager = __webpack_require__(16);\n\nvar _toolState = __webpack_require__(1);\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager(toolTypes, oldStateManager) {\n var toolState = {};\n\n function saveToolState() {\n return toolState;\n }\n\n function restoreToolState(stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState(element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n var toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState(element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n var stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState: saveToolState,\n restoreToolState: restoreToolState,\n toolState: toolState\n };\n\n return stackSpecificToolStateManager;\n}\n\nvar stackStateManagers = [];\n\nfunction addStackStateManager(element, otherTools) {\n var oldStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (!oldStateManager) {\n oldStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n var stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n var stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n (0, _toolState.setElementToolStateManager)(element, stackSpecificStateManager);\n}\n\nvar stackSpecificStateManager = {\n newStackSpecificToolStateManager: newStackSpecificToolStateManager,\n addStackStateManager: addStackStateManager\n};\n\nexports.stackSpecificStateManager = stackSpecificStateManager;\nexports.newStackSpecificToolStateManager = newStackSpecificToolStateManager;\nexports.addStackStateManager = addStackStateManager;\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager() {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState(frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n var indexOfData = -1;\n\n for (var i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nvar globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexports.newFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager;\nexports.globalFrameOfReferenceSpecificToolStateManager = globalFrameOfReferenceSpecificToolStateManager;\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _imageIdSpecificStateManager = __webpack_require__(16);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction saveApplicationState(elements) {\n // Save imageId-specific tool state data\n var appState = {\n imageIdToolState: _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n var toolStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (toolStateManager === _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = _externalModules2.default.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState(appState) {\n if (!appState.hasOwnProperty('imageIdToolState') || !appState.hasOwnProperty('elementToolState') || !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n\n // Restore all the imageId specific tool data\n _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n var element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n var toolStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (toolStateManager === _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n var savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nvar appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexports.default = appState;\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _scroll = __webpack_require__(29);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _keyboardTool = __webpack_require__(50);\n\nvar _keyboardTool2 = _interopRequireDefault(_keyboardTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback(e, eventData) {\n var keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n var images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n (0, _scroll2.default)(eventData.element, images);\n}\n\n// Module/private exports\nvar stackScrollKeyboard = (0, _keyboardTool2.default)(keyDownCallback);\n\nexports.default = stackScrollKeyboard;\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _requestPoolManager = __webpack_require__(27);\n\nvar _requestPoolManager2 = _interopRequireDefault(_requestPoolManager);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(1);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(20);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'stackPrefetch';\nvar requestType = 'prefetch';\n\nvar configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nvar resetPrefetchTimeout = void 0;\nvar resetPrefetchDelay = 10;\n\nfunction range(lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n var arr = [];\n var c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nvar max = function max(arr) {\n return Math.max.apply(null, arr);\n};\n\nvar min = function min(arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex(arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n var l = [];\n var h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch(element) {\n // Check to make sure stack data exists\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n var stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList(imageIdIndex) {\n var index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) {\n // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort(function (a, b) {\n return a - b;\n });\n var indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n var imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n var imagePromise = _externalModules2.default.cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise && imagePromise.state() === 'resolved') {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n _requestPoolManager2.default.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n var nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n var imageId = void 0;\n var nextImageIdIndex = void 0;\n var preventCache = false;\n\n function doneCallback(image) {\n // Console.log('prefetch done: ' + image.imageId);\n var imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n function failCallback(error) {\n console.log('prefetch errored: ' + error);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n var lowerIndex = nearest.low;\n var higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n var currentIndex = stack.currentImageIdIndex;\n var shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n var shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n var shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n var shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n _requestPoolManager2.default.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n _requestPoolManager2.default.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n _requestPoolManager2.default.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler(element) {\n return function (e) {\n var eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n var stackData = void 0;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = (0, _toolState.getToolState)(element, 'stack');\n } catch (error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n var imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated(e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n var element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch (error) {\n return;\n }\n }, resetPrefetchDelay);\n}\n\nfunction enable(element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n var stackPrefetchDataArray = (0, _toolState.getToolState)(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n var stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n var indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n (0, _toolState.addToolState)(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener('cornerstonenewimage', onImageUpdated);\n element.addEventListener('cornerstonenewimage', onImageUpdated);\n\n var promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n _externalModules2.default.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n _externalModules2.default.cornerstone.events.addEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n}\n\nfunction disable(element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener('cornerstonenewimage', onImageUpdated);\n\n var promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n _externalModules2.default.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n _requestPoolManager2.default.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n (0, _getMaxSimultaneousRequests.setMaxSimultaneousRequests)(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nvar stackPrefetch = {\n enable: enable,\n disable: disable,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nexports.default = stackPrefetch;\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _displayTool = __webpack_require__(24);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nvar scrollBarHeight = 6;\n\nvar configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered(e, eventData) {\n var element = eventData.element;\n var width = eventData.enabledElement.canvas.width;\n var height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n var context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n var config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var imageIds = stackData.data[0].imageIds;\n var currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n var cursorWidth = width / imageIds.length;\n var cursorHeight = height / imageIds.length;\n var xPosition = cursorWidth * currentImageIdIndex;\n var yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nvar scrollIndicator = (0, _displayTool2.default)(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexports.default = scrollIndicator;\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fusionRenderer = __webpack_require__(86);\n\nvar _fusionRenderer2 = _interopRequireDefault(_fusionRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar stackRenderers = {};\n\nstackRenderers.FusionRenderer = _fusionRenderer2.default;\n\nexports.default = stackRenderers;\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar FusionRenderer = function () {\n function FusionRenderer() {\n _classCallCheck(this, FusionRenderer);\n\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n _createClass(FusionRenderer, [{\n key: 'render',\n value: function render(element, imageStacks) {\n var _this = this;\n\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n var cornerstone = _externalModules2.default.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n var baseImageObject = imageStacks[0];\n var currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n var overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then(function (baseImage) {\n var baseLayerId = _this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n _this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach(function (imgObj, overlayLayerIndex) {\n var imageId = _this.findImageFn(imgObj.imageIds, currentImageId);\n var layerIndex = overlayLayerIndex + 1;\n var currentLayerId = _this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n _this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then(function (image) {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n }]);\n\n return FusionRenderer;\n}();\n\nexports.default = FusionRenderer;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.stopClip = exports.playClip = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(1);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-bitwise:0 */\nvar toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\nfunction getPlayClipTimeouts(vector, speed) {\n\n var i = void 0;\n var sample = void 0;\n var delay = void 0;\n var sum = 0;\n var limit = vector.length;\n var timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = Number(vector[i]) / speed | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) {\n // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = sum / timeouts.length | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData(playClipData) {\n var id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent(element) {\n var eventDetail = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'CornerstoneToolsClipStopped', eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip(element, framesPerSecond) {\n var playClipData = void 0;\n var playClipTimeouts = void 0;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n var stackToolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n var stackRenderer = void 0;\n\n if (stackToolData.data.length > 1) {\n var stackRendererData = (0, _toolState.getToolState)(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n var stackData = stackToolData.data[0];\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n (0, _toolState.addToolState)(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (playClipData.ignoreFrameTimeVector !== true && playClipData.frameTimeVector && playClipData.frameTimeVector.length === stackData.imageIds.length) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n var playClipAction = function playClipAction() {\n\n // Hoisting of context variables\n var loader = void 0,\n startLoadingHandler = void 0,\n endLoadingHandler = void 0,\n errorLoadingHandler = void 0,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n var imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler() {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip(element) {\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n}\n\nexports.playClip = playClip;\nexports.stopClip = stopClip;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mouseX = void 0;\nvar mouseY = void 0;\n\nfunction keyPress(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n\n var keyPressData = {\n event: window.event || e, // Old IE support\n element: element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n var keyPressEvents = {\n keydown: 'CornerstoneToolsKeyDown',\n keypress: 'CornerstoneToolsKeyPress',\n keyup: 'CornerstoneToolsKeyUp'\n\n };\n\n (0, _triggerEvent2.default)(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove(e) {\n mouseX = e.pageX || e.originalEvent.pageX;\n mouseY = e.pageY || e.originalEvent.pageY;\n}\n\nvar keyboardEvent = 'keydown keypress keyup';\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n _externalModules2.default.$(element).on(keyboardEvent, keyPress);\n _externalModules2.default.$(element).on('mousemove', mouseMove);\n}\n\nfunction disable(element) {\n _externalModules2.default.$(element).off(keyboardEvent, keyPress);\n _externalModules2.default.$(element).off('mousemove', mouseMove);\n}\n\n// Module exports\nvar keyboardInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = keyboardInput;\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _copyPoints = __webpack_require__(34);\n\nvar _copyPoints2 = _interopRequireDefault(_copyPoints);\n\nvar _pauseEvent = __webpack_require__(32);\n\nvar _pauseEvent2 = _interopRequireDefault(_pauseEvent);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isClickEvent = true;\nvar preventClickTimeout = void 0;\nvar clickDelay = 200;\n\nfunction getEventWhich(event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler() {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = 'CornerstoneToolsMouseDoubleClick';\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n var eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n}\n\nfunction mouseDown(e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = 'CornerstoneToolsMouseDown';\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n _externalModules2.default.$(element).off('mousemove', mouseMove);\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n var eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n var eventPropagated = (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = 'CornerstoneToolsMouseDownActivate';\n (0, _triggerEvent2.default)(eventData.element, 'CornerstoneToolsMouseDownActivate', eventData);\n }\n\n var whichMouseButton = getEventWhich(e);\n\n function onMouseMove(e) {\n // Calculate our current points in page and image coordinates\n var eventType = 'CornerstoneToolsMouseDrag';\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n\n // Prevent left click selection of DOM elements\n return (0, _pauseEvent2.default)(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp(e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n var eventType = 'CornerstoneToolsMouseUp';\n\n if (isClickEvent) {\n eventType = 'CornerstoneToolsMouseClick';\n }\n\n // Calculate our current points in page and image coordinates\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n _externalModules2.default.$(document).off('mousemove', onMouseMove);\n _externalModules2.default.$(document).off('mouseup', onMouseUp);\n\n _externalModules2.default.$(eventData.element).on('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n _externalModules2.default.$(document).on('mousemove', onMouseMove);\n _externalModules2.default.$(document).on('mouseup', onMouseUp);\n\n return (0, _pauseEvent2.default)(e);\n}\n\nfunction mouseMove(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = 'CornerstoneToolsMouseMove';\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n\n var whichMouseButton = getEventWhich(e);\n\n // Calculate our current points in page and image coordinates\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n // Update the last points\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n}\n\nfunction disable(element) {\n _externalModules2.default.$(element).off('mousedown', mouseDown);\n _externalModules2.default.$(element).off('mousemove', mouseMove);\n _externalModules2.default.$(element).off('dblclick', mouseDoubleClick);\n}\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n _externalModules2.default.$(element).on('mousedown', mouseDown);\n _externalModules2.default.$(element).on('mousemove', mouseMove);\n _externalModules2.default.$(element).on('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nvar mouseInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = mouseInput;\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseWheel(e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n\n var x = void 0;\n var y = void 0;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else if (e.originalEvent && e.originalEvent.pageX !== undefined && e.originalEvent.pageY !== undefined) {\n x = e.originalEvent.pageX;\n y = e.originalEvent.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n var startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = window.event && window.event.wheelDelta ? window.event : e; // Old IE support\n\n var wheelDelta = void 0;\n\n if (e.originalEvent && e.originalEvent.wheelDelta) {\n wheelDelta = -e.originalEvent.wheelDelta;\n } else if (e.originalEvent && e.originalEvent.deltaY) {\n wheelDelta = -e.originalEvent.deltaY;\n } else if (e.originalEvent && e.originalEvent.detail) {\n wheelDelta = -e.originalEvent.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n var direction = wheelDelta < 0 ? -1 : 1;\n\n var mouseWheelData = {\n element: element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction: direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n (0, _triggerEvent2.default)(element, 'CornerstoneToolsMouseWheel', mouseWheelData);\n}\n\nvar mouseWheelEvents = 'mousewheel DOMMouseScroll';\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n _externalModules2.default.$(element).on(mouseWheelEvents, mouseWheel);\n}\n\nfunction disable(element) {\n _externalModules2.default.$(element).unbind(mouseWheelEvents, mouseWheel);\n}\n\n// Module exports\nvar mouseWheelInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = mouseWheelInput;\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _copyPoints = __webpack_require__(34);\n\nvar _copyPoints2 = _interopRequireDefault(_copyPoints);\n\nvar _pauseEvent = __webpack_require__(32);\n\nvar _pauseEvent2 = _interopRequireDefault(_pauseEvent);\n\nvar _preventGhostClick = __webpack_require__(53);\n\nvar _preventGhostClick2 = _interopRequireDefault(_preventGhostClick);\n\nvar _triggerEvent = __webpack_require__(3);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar startPoints = void 0,\n currentPoints = void 0,\n lastPoints = void 0,\n deltaPoints = void 0,\n eventData = void 0,\n touchStartDelay = void 0,\n pressTimeout = void 0,\n pageDistanceMoved = void 0;\n\nvar lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta = void 0;\n\nvar pressDelay = 700,\n pressMaxDistance = 5;\n\nfunction onTouch(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget || e.srcEvent.currentTarget;\n var eventType = void 0,\n scaleChange = void 0,\n delta = void 0,\n remainingPointers = void 0,\n rotation = void 0;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if (e.pointers && e.pointers.length > 1 || e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 1) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = 'CornerstoneToolsTap';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = 'CornerstoneToolsDoubleTap';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchPinch';\n eventData = {\n event: e,\n startPoints: startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange: scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY),\n client: {\n x: e.originalEvent.touches[0].clientX,\n y: e.originalEvent.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchStart';\n if (e.originalEvent.touches.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchStart';\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n var eventPropagated = (0, _triggerEvent2.default)(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = 'CornerstoneToolsTouchStartActive';\n if (e.originalEvent.touches.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchStartActive';\n }\n\n eventData.type = eventType;\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = (0, _copyPoints2.default)(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY),\n client: {\n x: e.originalEvent.touches[0].clientX,\n y: e.originalEvent.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchPress';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.originalEvent.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.changedTouches[0].pageX, e.originalEvent.changedTouches[0].pageY),\n client: {\n x: e.originalEvent.changedTouches[0].clientX,\n y: e.originalEvent.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchEnd';\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = 'CornerstoneToolsTouchDrag';\n if (e.pointers.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchDrag';\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = 'CornerstoneToolsDragEnd';\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return (0, _pauseEvent2.default)(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = 'CornerstoneToolsTouchRotate';\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n rotation: rotation,\n type: eventType\n };\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable(element) {\n disable(element);\n var Hammer = _externalModules2.default.Hammer;\n\n var hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n var mc = new Hammer.Manager(element, hammerOptions);\n\n var panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n var pan = new Hammer.Pan(panOptions);\n var pinch = new Hammer.Pinch({\n threshold: 0\n });\n var rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n // We want to detect both the same time\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n var doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n _preventGhostClick2.default.enable(element);\n _externalModules2.default.$(element).on('touchstart touchend', onTouch);\n _externalModules2.default.$(element).data('hammer', mc);\n}\n\nfunction disable(element) {\n _preventGhostClick2.default.disable(element);\n _externalModules2.default.$(element).off('touchstart touchend', onTouch);\n var mc = _externalModules2.default.$(element).data('hammer');\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nvar touchInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = touchInput;\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.angleTouch = exports.angle = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _roundToDecimal = __webpack_require__(30);\n\nvar _roundToDecimal2 = _interopRequireDefault(_roundToDecimal);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e, eventData) {\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = angle.getConfiguration();\n var cornerstone = _externalModules2.default.cornerstone;\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n var dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n var dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n var dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n var dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n var _angle = Math.acos(Math.abs((dx1 * dx2 + dy1 * dy2) / (Math.sqrt(dx1 * dx1 + dy1 * dy1) * Math.sqrt(dx2 * dx2 + dy2 * dy2))));\n\n _angle *= 180 / Math.PI;\n\n var rAngle = (0, _roundToDecimal2.default)(_angle, 2);\n var str = '00B0'; // Degrees symbol\n var text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n var textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n var textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n (0, _drawTextBox2.default)(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar angle = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar angleTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.angle = angle;\nexports.angleTouch = angleTouch;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.arrowAnnotateTouch = exports.arrowAnnotate = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawArrow = __webpack_require__(48);\n\nvar _drawArrow2 = _interopRequireDefault(_drawArrow);\n\nvar _moveNewHandle = __webpack_require__(23);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(25);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointInsideBoundingBox = __webpack_require__(17);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\n/* eslint no-alert:0 */\nfunction getTextCallback(doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback(data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nvar configuration = {\n getTextCallback: getTextCallback,\n changeTextCallback: changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var measurementData = createNewMeasurement(mouseEventData);\n var cornerstone = _externalModules2.default.cornerstone;\n\n var eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n function doneChangingTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(mouseEventData.element);\n\n _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseMove', eventData, arrowAnnotate.mouseMoveCallback);\n _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseDown', eventData, arrowAnnotate.mouseDownCallback);\n _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseDownActivate', eventData, arrowAnnotate.mouseDownActivateCallback);\n _externalModules2.default.$(mouseEventData.element).on('CornerstoneToolsMouseDoubleClick', eventData, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseMove', arrowAnnotate.mouseMoveCallback);\n _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseDown', arrowAnnotate.mouseDownCallback);\n _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseDownActivate', arrowAnnotate.mouseDownActivateCallback);\n _externalModules2.default.$(mouseEventData.element).off('CornerstoneToolsMouseDoubleClick', arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(mouseEventData.element);\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(mouseEventData.element);\n });\n}\n\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var enabledElement = eventData.enabledElement;\n var cornerstone = _externalModules2.default.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = arrowAnnotate.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the arrow\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n (0, _drawArrow2.default)(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n (0, _drawArrow2.default)(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n if (config.drawHandles) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n var textWidth = context.measureText(data.text).width + 10;\n var textHeight = _textStyle2.default.getFontSize() + 10;\n\n var distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n var textCoords = void 0;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n var boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n var midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n var points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch(touchEventData) {\n var element = touchEventData.element;\n var measurementData = createNewMeasurement(touchEventData);\n var cornerstone = _externalModules2.default.cornerstone;\n\n function doneChangingTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n }\n\n (0, _toolState.addToolState)(element, toolType, measurementData);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback(e, eventData) {\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback(e, eventData) {\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar arrowAnnotate = (0, _mouseButtonTool2.default)({\n addNewMeasurement: addNewMeasurement,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nvar arrowAnnotateTouch = (0, _touchTool2.default)({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: pressCallback\n});\n\nexports.arrowAnnotate = arrowAnnotate;\nexports.arrowAnnotateTouch = arrowAnnotateTouch;\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.crosshairsTouch = exports.crosshairs = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _loadHandlerManager = __webpack_require__(10);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(1);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointProjector = __webpack_require__(26);\n\nvar _convertToVector = __webpack_require__(15);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'crosshairs';\n\nfunction chooseLocation(e, eventData) {\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceElement = e.currentTarget;\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n var sourceImageId = sourceEnabledElement.image.imageId;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n var sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n var patientPoint = (0, _pointProjector.imagePointToPatientPoint)(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n var syncContext = toolData.data[0].synchronizationContext;\n var enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n var stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var row = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var column = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var normal = column.clone().cross(row.clone());\n var distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n chooseLocation(e, eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction mouseDragCallback(e, eventData) {\n chooseLocation(e, eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction enable(element, mouseButtonMask, synchronizationContext) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n // Clear any currently existing toolData\n (0, _toolState.clearToolState)(element, toolType);\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext\n });\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n}\n\n// Module/private exports\nvar crosshairs = {\n activate: enable,\n deactivate: disable,\n enable: enable,\n disable: disable\n};\n\nfunction dragEndCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsTouchDrag', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback);\n}\n\nfunction dragStartCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsTouchDrag', dragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback);\n chooseLocation(e, eventData);\n\n return false;\n}\n\nfunction dragCallback(e, eventData) {\n chooseLocation(e, eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction enableTouch(element, synchronizationContext) {\n // Clear any currently existing toolData\n (0, _toolState.clearToolState)(element, toolType);\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext\n });\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', dragStartCallback);\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', dragStartCallback);\n}\n\nvar crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexports.crosshairs = crosshairs;\nexports.crosshairsTouch = crosshairsTouch;\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _doubleTapTool = __webpack_require__(54);\n\nvar _doubleTapTool2 = _interopRequireDefault(_doubleTapTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fitToWindowStrategy(eventData) {\n _externalModules2.default.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback(e, eventData) {\n doubleTapZoom.strategy(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar doubleTapZoom = (0, _doubleTapTool2.default)(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexports.default = doubleTapZoom;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.dragProbeTouch = exports.dragProbe = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _getRGBPixels = __webpack_require__(33);\n\nvar _getRGBPixels2 = _interopRequireDefault(_getRGBPixels);\n\nvar _calculateSUV = __webpack_require__(18);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar dragEventData = void 0;\n\nfunction defaultStrategy(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getActiveColor();\n var font = _textStyle2.default.getFont();\n var fontHeight = _textStyle2.default.getFontSize();\n var config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var x = Math.round(eventData.currentPoints.image.x);\n var y = Math.round(eventData.currentPoints.image.y);\n\n var storedPixels = void 0;\n var text = void 0,\n str = void 0;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = (0, _getRGBPixels2.default)(eventData.element, x, y, 1, 1);\n text = x + ', ' + y;\n str = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2] + ' A: ' + storedPixels[3];\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n // Draw text\n text = x + ', ' + y;\n str = 'SP: ' + sp + ' MO: ' + parseFloat(mo.toFixed(3));\n if (suv) {\n str += ' SUV: ' + parseFloat(suv.toFixed(3));\n }\n }\n\n // Draw text\n var coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var enabledElement = cornerstone.getEnabledElement(element);\n var image = enabledElement.image;\n\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getActiveColor();\n var font = _textStyle2.default.getFont();\n var config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n var toolCoords = void 0;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y - _textStyle2.default.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y - _textStyle2.default.getFontSize() / 2);\n }\n\n var storedPixels = void 0;\n var text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 || toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = (0, _getRGBPixels2.default)(element, toolCoords.x, toolCoords.y, 1, 1);\n text = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2];\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n\n var modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += 'HU: ' + modalityPixelValueText;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n if (suv) {\n text += ' SUV: ' + parseFloat(suv.toFixed(2));\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n var textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n var translation = void 0;\n var handleRadius = 6;\n var width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -_textStyle2.default.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(_textStyle2.default.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n (0, _drawTextBox2.default)(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback(e, eventData) {\n var element = eventData.element;\n\n element.removeEventListener('cornerstoneimagerendered', imageRenderedCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback(e, eventData) {\n var element = eventData.element;\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n element.addEventListener('cornerstoneimagerendered', imageRenderedCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n dragProbe.strategy(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction imageRenderedCallback() {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback(e, eventData) {\n var element = eventData.element;\n\n dragEventData = eventData;\n _externalModules2.default.cornerstone.updateImage(element);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar dragProbe = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nvar options = {\n fireOnTouchStart: true\n};\n\nvar dragProbeTouch = (0, _touchDragTool2.default)(dragCallback, options);\n\nexports.dragProbe = dragProbe;\nexports.dragProbeTouch = dragProbeTouch;\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ellipticalRoiTouch = exports.ellipticalRoi = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _drawEllipse = __webpack_require__(46);\n\nvar _drawEllipse2 = _interopRequireDefault(_drawEllipse);\n\nvar _pointInEllipse = __webpack_require__(31);\n\nvar _pointInEllipse2 = _interopRequireDefault(_pointInEllipse);\n\nvar _calculateEllipseStatistics = __webpack_require__(49);\n\nvar _calculateEllipseStatistics2 = _interopRequireDefault(_calculateEllipseStatistics);\n\nvar _calculateSUV = __webpack_require__(18);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse(element, data, coords, distance) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n var majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n var pointInMinorEllipse = (0, _pointInEllipse2.default)(minorEllipse, coords);\n var pointInMajorEllipse = (0, _pointInEllipse2.default)(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool(element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch(element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas(x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n var parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var image = eventData.image;\n var element = eventData.element;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = ellipticalRoi.getConfiguration();\n var context = eventData.canvasContext.canvas.getContext('2d');\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n var leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n var topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n var widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n var heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n (0, _drawEllipse2.default)(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n var handleOptions = {\n drawHandlesIfActive: true\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n var area = void 0,\n meanStdDev = void 0,\n meanStdDevSUV = void 0;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n var ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n var pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = (0, _calculateEllipseStatistics2.default)(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: (0, _calculateSUV2.default)(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: (0, _calculateSUV2.default)(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n var columnPixelSpacing = image.columnPixelSpacing || 1;\n var rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n var textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n var moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n var meanText = 'Mean: ' + numberWithCommas(meanStdDev.mean.toFixed(2)) + moSuffix;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n var stdDevText = 'StdDev: ' + numberWithCommas(meanStdDev.stdDev.toFixed(2)) + moSuffix;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n var SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n var suffix = ' mm' + String.fromCharCode(178);\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ' pixels' + String.fromCharCode(178);\n }\n\n // Create a line of text to display the area and its units\n var areaText = 'Area: ' + numberWithCommas(area.toFixed(2)) + suffix;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n var textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n var boundingBox = (0, _drawTextBox2.default)(context, textLines, textCoords.x, textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n var link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n var ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar ellipticalRoi = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar ellipticalRoiTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType: toolType\n});\n\nexports.ellipticalRoi = ellipticalRoi;\nexports.ellipticalRoiTouch = ellipticalRoiTouch;\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.freehand = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'freehand';\nvar configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n var data = toolData.data[config.currentTool];\n\n var handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle(eventData, toolIndex) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n var mousePoint = eventData.currentPoints.canvas;\n\n for (var i = 0; i < data.handles.length; i++) {\n var handleCanvas = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (_externalModules2.default.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var handleNearby = void 0;\n\n for (var toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby: handleNearby,\n toolIndex: toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n\n // Check if drawing is finished\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback(e, eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n var data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n var x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n var y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n var currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n var lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n var lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n var handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < data.handles.length - 1) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing(eventData) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n\n var measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n var config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n (0, _toolState.addToolState)(eventData.element, toolType, measurementData);\n\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing(eventData, handleNearby) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n var data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n var handleNearby = void 0,\n toolIndex = void 0;\n\n var config = freehand.getConfiguration();\n var currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n var nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var fillColor = _toolColors2.default.getFillColor();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n fillColor = _toolColors2.default.getFillColor();\n } else {\n color = _toolColors2.default.getToolColor();\n fillColor = _toolColors2.default.getToolColor();\n }\n\n var handleStart = void 0;\n\n if (data.handles.length) {\n for (var j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (var k = 0; k < data.handles[j].lines.length; k++) {\n var lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n var mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === data.handles.length - 1) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n var options = {\n fill: fillColor\n };\n\n if (data.active) {\n (0, _drawHandles2.default)(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\nfunction enable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module/private exports\nvar freehand = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nexports.freehand = freehand;\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.highlightTouch = exports.highlight = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonRectangleTool = __webpack_require__(55);\n\nvar _mouseButtonRectangleTool2 = _interopRequireDefault(_mouseButtonRectangleTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n var existingToolData = (0, _toolState.getToolState)(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var insideBox = false;\n\n if (coords.x >= rect.left && coords.x <= rect.left + rect.width && coords.y >= rect.top && coords.y <= rect.top + rect.height) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this elemen\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n\n context.save();\n\n var data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n var rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar preventHandleOutsideImage = true;\n\nvar highlight = (0, _mouseButtonRectangleTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n pointInsideRect: pointInsideRect,\n toolType: toolType\n}, preventHandleOutsideImage);\n\nvar highlightTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n pointInsideRect: pointInsideRect,\n toolType: toolType\n}, preventHandleOutsideImage);\n\nexports.highlight = highlight;\nexports.highlightTouch = highlightTouch;\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _displayTool = __webpack_require__(24);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction onImageRendered(e, eventData) {\n var image = eventData.image;\n var stats = image.stats;\n\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n var text = key + ' : ' + stats[key];\n\n textLines.push(text);\n });\n\n (0, _drawTextBox2.default)(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nvar imageStats = (0, _displayTool2.default)(onImageRendered);\n\nexports.default = imageStats;\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.lengthTouch = exports.length = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n var image = eventData.image,\n element = eventData.element;\n\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = length.getConfiguration();\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n var rowPixelSpacing = void 0;\n var colPixelSpacing = void 0;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n var dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n var dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n var _length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = _length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n var suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n var text = '' + _length.toFixed(2) + suffix;\n\n if (!data.handles.textBox.hasMoved) {\n var coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n var textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n var boundingBox = (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n var link = {\n start: {},\n end: {}\n };\n\n var midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n var points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar length = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar lengthTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.length = length;\nexports.lengthTouch = lengthTouch;\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.magnifyTouchDrag = exports.magnify = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(20);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nvar browserName = void 0;\n\nvar currentPoints = void 0;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback(e, eventData) {\n var element = eventData.element;\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool(eventData) {\n _externalModules2.default.$(eventData.element).find('.magnifyTool').hide();\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback(e, eventData) {\n var element = eventData.element;\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', eventData, dragCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', eventData, mouseUpCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', eventData, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener('cornerstonenewimage', newImageCallback);\n drawMagnificationTool(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction newImageCallback(e) {\n var eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback(e, eventData) {\n var element = eventData.element;\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsTouchEnd', dragEndCallback);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback(e, eventData) {\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsTouchEnd', dragEndCallback);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool(eventData) {\n var magnifyCanvas = _externalModules2.default.$(eventData.element).find('.magnifyTool').get(0);\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n var config = magnify.getConfiguration();\n\n var magnifySize = config.magnifySize;\n var magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n var canvas = _externalModules2.default.$(eventData.element).find('canvas').not('.magnifyTool').get(0);\n var context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n var getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n var canvasLocation = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n var copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n var scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = canvasLocation.y - 0.5 * magnifySize + 'px';\n magnifyCanvas.style.left = canvasLocation.x - 0.5 * magnifySize + 'px';\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas(element) {\n // If the magnifying glass canvas doesn't already exist\n if (_externalModules2.default.$(element).find('.magnifyTool').length === 0) {\n // Create a canvas and append it as a child to the element\n var magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n var config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas(element) {\n _externalModules2.default.$(element).find('.magnifyTool').remove();\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable(element) {\n if (!browserName) {\n var infoString = (0, _getMaxSimultaneousRequests.getBrowserInfo)();\n var info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module exports\nvar magnify = {\n enable: enable,\n activate: activate,\n deactivate: disable,\n disable: disable,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nvar options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nvar magnifyTouchDrag = (0, _touchDragTool2.default)(dragCallback, options);\n\nexports.magnify = magnify;\nexports.magnifyTouchDrag = magnifyTouchDrag;\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _index = __webpack_require__(41);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _displayTool = __webpack_require__(24);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getOrientationMarkers(element) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(element);\n var imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n var rowString = _index2.default.getOrientationString(imagePlaneMetaData.rowCosines);\n var columnString = _index2.default.getOrientationString(imagePlaneMetaData.columnCosines);\n\n var oppositeRowString = _index2.default.invertOrientationString(rowString);\n var oppositeColumnString = _index2.default.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions(element) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(element);\n var coords = void 0;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n var top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n var bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n var left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n var right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right\n };\n}\n\nfunction onImageRendered(e, eventData) {\n var element = eventData.element;\n\n var markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n var coords = getOrientationMarkerPositions(element, markers);\n\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getToolColor();\n\n var textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n (0, _drawTextBox2.default)(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n (0, _drawTextBox2.default)(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n var config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n (0, _drawTextBox2.default)(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n (0, _drawTextBox2.default)(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar orientationMarkers = (0, _displayTool2.default)(onImageRendered);\n\nexports.default = orientationMarkers;\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.panTouchDrag = exports.pan = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback(e, eventData) {\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n var widthScale = eventData.viewport.scale;\n var heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing;\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing;\n }\n\n eventData.viewport.translation.x += eventData.deltaPoints.page.x / widthScale;\n eventData.viewport.translation.y += eventData.deltaPoints.page.y / heightScale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar pan = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\nvar panTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.pan = pan;\nexports.panTouchDrag = panTouchDrag;\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _multiTouchDragTool = __webpack_require__(28);\n\nvar _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction touchPanCallback(e, eventData) {\n var config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += eventData.deltaPoints.page.x / eventData.viewport.scale;\n eventData.viewport.translation.y += eventData.deltaPoints.page.y / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nvar configuration = {\n testPointers: function testPointers(eventData) {\n return eventData.numPointers >= 2;\n }\n};\n\nvar panMultiTouch = (0, _multiTouchDragTool2.default)(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexports.default = panMultiTouch;\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.probeTouch = exports.probe = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _getRGBPixels = __webpack_require__(33);\n\nvar _getRGBPixels2 = _interopRequireDefault(_getRGBPixels);\n\nvar _calculateSUV = __webpack_require__(18);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool(element, data, coords) {\n var endCanvas = _externalModules2.default.cornerstone.pixelToCanvas(element, data.handles.end);\n\n return _externalModules2.default.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var font = _textStyle2.default.getFont();\n var fontHeight = _textStyle2.default.getFontSize();\n\n for (var i = 0; i < toolData.data.length; i++) {\n\n context.save();\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n\n var x = Math.round(data.handles.end.x);\n var y = Math.round(data.handles.end.y);\n var storedPixels = void 0;\n\n var text = void 0,\n str = void 0;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = x + ', ' + y;\n storedPixels = (0, _getRGBPixels2.default)(eventData.element, x, y, 1, 1);\n str = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2];\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n // Draw text\n text = x + ', ' + y;\n str = 'SP: ' + sp + ' MO: ' + parseFloat(mo.toFixed(3));\n if (suv) {\n str += ' SUV: ' + parseFloat(suv.toFixed(3));\n }\n }\n\n var coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar probe = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar probeTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.probe = probe;\nexports.probeTouch = probeTouch;\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rectangleRoiTouch = exports.rectangleRoi = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _calculateSUV = __webpack_require__(18);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev(sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n var sum = 0;\n var sumSquared = 0;\n var count = 0;\n var index = 0;\n\n for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count: count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n var mean = sum / count;\n var variance = sumSquared / count - mean * mean;\n\n return {\n count: count,\n mean: mean,\n variance: variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas(x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n var parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var image = eventData.image;\n var element = eventData.element;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = rectangleRoi.getConfiguration();\n var context = eventData.canvasContext.canvas.getContext('2d');\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n var leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n var topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n var widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n var heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n var handleOptions = {\n drawHandlesIfActive: true\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n var area = void 0,\n meanStdDev = void 0,\n meanStdDevSUV = void 0;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n var ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n var pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: (0, _calculateSUV2.default)(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: (0, _calculateSUV2.default)(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n var columnPixelSpacing = image.columnPixelSpacing || 1;\n var rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = ellipse.width * columnPixelSpacing * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n var textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n var moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n var meanText = 'Mean: ' + numberWithCommas(meanStdDev.mean.toFixed(2)) + moSuffix;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n var stdDevText = 'StdDev: ' + numberWithCommas(meanStdDev.stdDev.toFixed(2)) + moSuffix;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n var SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n var suffix = ' mm' + String.fromCharCode(178);\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ' pixels' + String.fromCharCode(178);\n }\n\n // Create a line of text to display the area and its units\n var areaText = 'Area: ' + numberWithCommas(area.toFixed(2)) + suffix;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n var textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n var boundingBox = (0, _drawTextBox2.default)(context, textLines, textCoords.x, textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n var link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n var ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar rectangleRoi = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar rectangleRoiTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.rectangleRoi = rectangleRoi;\nexports.rectangleRoiTouch = rectangleRoiTouch;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rotateTouchDrag = exports.rotate = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// --- Strategies --- //\nfunction defaultStrategy(eventData) {\n // Calculate distance from the center of the image\n var rect = eventData.element.getBoundingClientRect(eventData.element);\n\n var points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n var width = eventData.element.clientWidth;\n var height = eventData.element.clientHeight;\n\n var pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n var rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n var rotationDegrees = rotationRadians * (180 / Math.PI);\n var rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy(eventData) {\n eventData.viewport.rotation += eventData.deltaPoints.page.x / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy(eventData) {\n eventData.viewport.rotation += eventData.deltaPoints.page.y / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback(e, eventData) {\n rotate.strategy(eventData);\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar rotate = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nvar rotateTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.rotate = rotate;\nexports.rotateTouchDrag = rotateTouchDrag;\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction touchRotateCallback(e, eventData) {\n eventData.viewport.rotation += eventData.rotation;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback);\n}\n\nfunction activate(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchRotate', touchRotateCallback);\n}\n\nvar rotateTouch = {\n activate: activate,\n disable: disable\n};\n\nexports.default = rotateTouch;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, filename, mimetype) {\n // Setting the default value for mimetype to image/png\n mimetype = mimetype || 'image/png';\n var canvas = _externalModules2.default.$(element).find('canvas').get(0);\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n var lnk = document.createElement('a');\n\n // / the key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // / convert canvas content to data-uri for link. When download\n // / attribute is set the content pointed to by link will be\n // / pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n\n var e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n } else if (lnk.fireEvent) {\n\n lnk.fireEvent('onclick');\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.seedAnnotateTouch = exports.seedAnnotate = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _moveHandle = __webpack_require__(22);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawCircle = __webpack_require__(47);\n\nvar _drawCircle2 = _interopRequireDefault(_drawCircle);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointInsideBoundingBox = __webpack_require__(17);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-alert:0 */\nvar toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback(doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback(data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nvar configuration = {\n getTextCallback: getTextCallback,\n changeTextCallback: changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n var config = seedAnnotate.getConfiguration();\n var measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n (0, _moveHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n var realCoords = _externalModules2.default.cornerstone.pixelToCanvas(element, data.handles.end);\n var distanceToPoint = _externalModules2.default.cornerstoneMath.point.distance(realCoords, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n var canvasWidth = eventData.canvasContext.canvas.width;\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = seedAnnotate.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw\n var handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n (0, _drawCircle2.default)(context, handleCanvas, color, lineWidth);\n\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n if (config.drawHandles) {\n (0, _drawHandles2.default)(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n var textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = data.text + ' x: ' + Math.round(data.handles.end.x) + ' y: ' + Math.round(data.handles.end.y);\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n var textWidth = context.measureText(textPlusCoords).width + 10;\n var textHeight = _textStyle2.default.getFontSize() + 10;\n\n var distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > canvasWidth / 2) {\n distance = -distance;\n }\n\n var textCoords = void 0;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n var boundingBox = (0, _drawTextBox2.default)(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch(touchEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n var config = seedAnnotate.getConfiguration();\n var measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n (0, _moveHandle2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback(e, eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n var config = seedAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction pressCallback(e, eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n return false;\n }\n\n var config = seedAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar seedAnnotate = (0, _mouseButtonTool2.default)({\n addNewMeasurement: addNewMeasurement,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nvar seedAnnotateTouch = (0, _touchTool2.default)({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: pressCallback\n});\n\nexports.seedAnnotate = seedAnnotate;\nexports.seedAnnotateTouch = seedAnnotateTouch;\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleAngleTouch = exports.simpleAngle = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _roundToDecimal = __webpack_require__(30);\n\nvar _roundToDecimal2 = _interopRequireDefault(_roundToDecimal);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _anyHandlesOutsideImage = __webpack_require__(12);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _moveNewHandle = __webpack_require__(23);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(25);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _drawHandles = __webpack_require__(8);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\nfunction length(vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = simpleAngle.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n var columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n var rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n var suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n var sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n var sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n var sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n var sideALength = length(sideA);\n var sideBLength = length(sideB);\n var sideCLength = length(sideC);\n\n // Cosine law\n var angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= 180 / Math.PI;\n\n var rAngle = (0, _roundToDecimal2.default)(angle, 2);\n\n if (rAngle) {\n var str = '00B0'; // Degrees symbol\n var text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n var distance = 15;\n\n var textCoords = void 0;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n var textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n var boundingBox = (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n var points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var measurementData = createNewMeasurement(mouseEventData);\n var element = mouseEventData.element;\n\n var eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', simpleAngle.mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch(touchEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var measurementData = createNewMeasurement(touchEventData);\n var element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n });\n });\n}\n\nvar simpleAngle = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n addNewMeasurement: addNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar simpleAngleTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.simpleAngle = simpleAngle;\nexports.simpleAngleTouch = simpleAngleTouch;\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.textMarkerTouch = exports.textMarker = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(7);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(9);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _pointInsideBoundingBox = __webpack_require__(17);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _drawTextBox = __webpack_require__(6);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolState = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n var config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n var imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!_externalModules2.default.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n var currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool(element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n var insideBoundingBox = (0, _pointInsideBoundingBox2.default)(data.handles.end, coords);\n\n return distanceToPoint < 10 || insideBoundingBox;\n}\n\nfunction onImageRendered(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var config = textMarker.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n var data = toolData.data[i];\n\n var color = _toolColors2.default.getToolColor();\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n var measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n var textCoords = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n var options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n var boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n data.handles.end.boundingBox = boundingBox;\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback(e, eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n var mouseButtonData = {\n mouseButtonMask: e.data.mouseButtonMask\n };\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', mouseButtonData, textMarker.mouseMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', mouseButtonData, textMarker.mouseDownCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', mouseButtonData, textMarker.mouseDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', mouseButtonData, textMarker.mouseDoubleClickCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n var config = textMarker.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', textMarker.mouseMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', textMarker.mouseDownCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', textMarker.mouseDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchPressCallback(e, eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n }\n\n var config = textMarker.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nvar textMarker = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nvar textMarkerTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: touchPressCallback\n});\n\nexports.textMarker = textMarker;\nexports.textMarkerTouch = textMarkerTouch;\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.wwwcTouchDrag = exports.wwwc = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction defaultStrategy(eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n var maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n var minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n var imageDynamicRange = maxVOI - minVOI;\n var multiplier = imageDynamicRange / 1024;\n\n var deltaX = eventData.deltaPoints.page.x * multiplier;\n var deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += deltaX;\n eventData.viewport.voi.windowCenter += deltaY;\n}\n\nfunction mouseDragCallback(e, eventData) {\n wwwc.strategy(eventData);\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchDragCallback(e, eventData) {\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n var dragData = eventData;\n\n var maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n var minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n var imageDynamicRange = maxVOI - minVOI;\n var multiplier = imageDynamicRange / 1024;\n var deltaX = dragData.deltaPoints.page.x * multiplier;\n var deltaY = dragData.deltaPoints.page.y * multiplier;\n\n var config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += deltaX;\n dragData.viewport.voi.windowCenter += deltaY;\n } else {\n dragData.viewport.voi.windowWidth += deltaY;\n dragData.viewport.voi.windowCenter += deltaX;\n }\n } else {\n dragData.viewport.voi.windowWidth += deltaX;\n dragData.viewport.voi.windowCenter += deltaY;\n }\n\n _externalModules2.default.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nvar wwwc = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nvar wwwcTouchDrag = (0, _touchDragTool2.default)(touchDragCallback);\n\nexports.wwwc = wwwc;\nexports.wwwcTouchDrag = wwwcTouchDrag;\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.wwwcRegionTouch = exports.wwwcRegion = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(5);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(4);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _toolState = __webpack_require__(1);\n\nvar _getLuminance = __webpack_require__(45);\n\nvar _getLuminance2 = _interopRequireDefault(_getLuminance);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'wwwcRegion';\n\nvar configuration = {\n minWindowWidth: 10\n};\n\nvar currentMouseButtonMask = void 0;\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean(storedPixelLuminanceData, globalMin, globalMax) {\n var numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n var min = globalMax;\n var max = globalMin;\n var sum = 0;\n\n for (var index = 0; index < numPixels; index++) {\n var spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min: min,\n max: max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback(e) {\n var eventData = e.detail;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n var mouseData = {\n mouseButtonMask: currentMouseButtonMask\n };\n\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n var mouseData = {\n mouseButtonMask: currentMouseButtonMask\n };\n\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback);\n\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var startPoint = toolData.data[0].startPoint;\n var endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n var width = Math.abs(startPoint.x - endPoint.x);\n var height = Math.abs(startPoint.y - endPoint.y);\n\n var left = Math.min(startPoint.x, endPoint.x);\n var top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n var pixelLuminanceData = (0, _getLuminance2.default)(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n var minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n var config = wwwcRegion.getConfiguration();\n var viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement(e, eventData) {\n var element = eventData.element;\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove');\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag');\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', dragCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDrag', dragCallback);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseClick', dragEndCallback);\n if (e.type === 'CornerstoneToolsMouseDrag') {\n _externalModules2.default.$(element).on('CornerstoneToolsMouseUp', dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', eventData, whichMovement);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseMove', eventData, whichMovement);\n\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n var measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n (0, _toolState.addToolState)(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback(e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n var endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n toolData.data[0].endPoint = endPoint;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var startPoint = toolData.data[0].startPoint;\n var endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n // Get the current element's canvas\n var canvas = _externalModules2.default.$(eventData.element).find('canvas').get(0);\n var context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n var color = _toolColors2.default.getActiveColor();\n\n // Calculate the rectangle parameters\n var startPointCanvas = cornerstone.pixelToCanvas(eventData.element, startPoint);\n var endPointCanvas = cornerstone.pixelToCanvas(eventData.element, endPoint);\n\n var left = Math.min(startPointCanvas.x, endPointCanvas.x);\n var top = Math.min(startPointCanvas.y, endPointCanvas.y);\n var width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n var height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', dragEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', dragCallback);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction activate(element, mouseButtonMask) {\n var eventData = {\n mouseButtonMask: mouseButtonMask\n };\n\n currentMouseButtonMask = mouseButtonMask;\n\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData) {\n var data = [];\n\n (0, _toolState.addToolState)(element, toolType, data);\n }\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseUp', dragEndCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n _externalModules2.default.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', dragCallback);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n\n _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener('cornerstonenewimage', newImageCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag(element) {\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', dragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', recordStartPoint);\n _externalModules2.default.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n}\n\nfunction activateTouchDrag(element) {\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData) {\n var data = [];\n\n (0, _toolState.addToolState)(element, toolType, data);\n }\n\n _externalModules2.default.$(element).off('CornerstoneToolsTouchDrag', dragCallback);\n _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', recordStartPoint);\n _externalModules2.default.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n _externalModules2.default.$(element).on('CornerstoneToolsTouchDrag', dragCallback);\n _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', recordStartPoint);\n _externalModules2.default.$(element).on('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module exports\nvar wwwcRegion = {\n activate: activate,\n deactivate: disable,\n disable: disable,\n setConfiguration: setConfiguration,\n getConfiguration: getConfiguration\n};\n\nvar wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexports.wwwcRegion = wwwcRegion;\nexports.wwwcRegionTouch = wwwcRegionTouch;\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.zoomTouchDrag = exports.zoomTouchPinch = exports.zoomWheel = exports.zoom = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(13);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(2);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _mouseWheelTool = __webpack_require__(21);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _touchPinchTool = __webpack_require__(56);\n\nvar _touchPinchTool2 = _interopRequireDefault(_touchPinchTool);\n\nvar _touchDragTool = __webpack_require__(11);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar startPoints = void 0;\n\nfunction changeViewportScale(viewport, ticks) {\n var config = zoom.getConfiguration();\n var pow = 1.7;\n\n var oldFactor = Math.log(viewport.scale) / Math.log(pow);\n var factor = oldFactor + ticks;\n\n var scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition(position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift(shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n var angle = viewport.rotation * Math.PI / 180;\n\n var cosA = Math.cos(angle);\n var sinA = Math.sin(angle);\n\n var newX = shift.x * cosA - shift.y * sinA;\n var newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy(eventData, ticks) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n var newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n var shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy(eventData, ticks) {\n var element = eventData.element;\n var image = eventData.image;\n var config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n var shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n var translateSpeed = 8;\n var outwardsMinScaleToTranslate = 3;\n var minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n var desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n var distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n _externalModules2.default.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy(eventData, ticks) {\n var element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n _externalModules2.default.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback(e, eventData) {\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback(e, eventData) {\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n _externalModules2.default.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback(e, eventData) {\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n var ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback(e, eventData) {\n var ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n var config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n _externalModules2.default.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback(e, eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var config = zoom.getConfiguration();\n var viewport = eventData.viewport;\n var element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n var newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n var shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nvar zoom = (0, _simpleMouseButtonTool2.default)(mouseDownCallback);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nvar zoomWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\nvar zoomTouchPinch = (0, _touchPinchTool2.default)(touchPinchCallback);\nvar zoomTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.zoom = zoom;\nexports.zoomWheel = zoomWheel;\nexports.zoomTouchPinch = zoomTouchPinch;\nexports.zoomTouchDrag = zoomTouchDrag;\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.brush = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _brushTool = __webpack_require__(57);\n\nvar _brushTool2 = _interopRequireDefault(_brushTool);\n\nvar _getCircle = __webpack_require__(58);\n\nvar _getCircle2 = _interopRequireDefault(_getCircle);\n\nvar _drawBrush = __webpack_require__(59);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This module is for creating segmentation overlays\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar toolType = 'brush';\nvar configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nvar lastImageCoords = void 0;\nvar dragging = false;\n\nfunction paint(eventData) {\n var configuration = brush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var _layer$image = layer.image,\n rows = _layer$image.rows,\n columns = _layer$image.columns;\n var _eventData$currentPoi = eventData.currentPoints.image,\n x = _eventData$currentPoi.x,\n y = _eventData$currentPoi.y;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = toolData.data[0].pixelData;\n var brushPixelValue = configuration.draw;\n var radius = configuration.radius;\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushPixels)(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp(e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown(e, eventData) {\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove(e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag(e, eventData) {\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered(e, eventData) {\n if (!lastImageCoords) {\n return;\n }\n\n var _eventData$image = eventData.image,\n rows = _eventData$image.rows,\n columns = _eventData$image.columns;\n var _lastImageCoords = lastImageCoords,\n x = _lastImageCoords.x,\n y = _lastImageCoords.y;\n\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n var configuration = brush.getConfiguration();\n var radius = configuration.radius;\n var context = eventData.canvasContext;\n var color = dragging ? configuration.dragColor : configuration.hoverColor;\n var element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushOnCanvas)(pointerArray, context, color, element);\n}\n\nvar brush = (0, _brushTool2.default)({\n onMouseMove: onMouseMove,\n onMouseDown: onMouseDown,\n onMouseUp: onMouseUp,\n onDrag: onDrag,\n toolType: toolType,\n onImageRendered: onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexports.brush = brush;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.adaptiveBrush = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(1);\n\nvar _brushTool = __webpack_require__(57);\n\nvar _brushTool2 = _interopRequireDefault(_brushTool);\n\nvar _getCircle = __webpack_require__(58);\n\nvar _getCircle2 = _interopRequireDefault(_getCircle);\n\nvar _drawBrush = __webpack_require__(59);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This module is for creating segmentation overlays\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar toolType = 'adaptiveBrush';\nvar configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nvar lastImageCoords = void 0;\nvar thrMax = void 0;\nvar thrMin = void 0;\nvar currentRadius = void 0;\nvar dragging = void 0;\n\nfunction getGreyValues(pointerArray, pixelData, imageColumns) {\n var configuration = adaptiveBrush.getConfiguration();\n var tolerance = configuration.tolerance;\n var minValue = Number.MAX_VALUE;\n var maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach(function (point) {\n var pixelIndex = point[1] * imageColumns + point[0];\n var greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush(imagePixelData, brushPixelData, rows, columns) {\n var configuration = adaptiveBrush.getConfiguration();\n var brushPixelValue = configuration.draw;\n var mouseX = Math.round(lastImageCoords.x);\n var mouseY = Math.round(lastImageCoords.y);\n var numPixelsOutsideThresholdWindow = null;\n var pointerArray = [];\n var radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = (0, _getCircle2.default)(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (var j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n var xCoord = pointerArray[j][0];\n var yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n var pixelIndex = yCoord * columns + xCoord;\n var pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n (0, _drawBrush.drawBrushPixels)(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint(eventData) {\n var configuration = adaptiveBrush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var baseLayer = _externalModules2.default.cornerstone.getLayers(element)[0];\n var _layer$image = layer.image,\n rows = _layer$image.rows,\n columns = _layer$image.columns;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction erase(eventData) {\n var configuration = adaptiveBrush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var _layer$image2 = layer.image,\n rows = _layer$image2.rows,\n columns = _layer$image2.columns;\n var _eventData$currentPoi = eventData.currentPoints.image,\n x = _eventData$currentPoi.x,\n y = _eventData$currentPoi.y;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = toolData.data[0].pixelData;\n var brushPixelValue = configuration.draw;\n var radius = configuration.radius;\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushPixels)(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp(e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n var configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown(e, eventData) {\n var element = eventData.element;\n var configuration = adaptiveBrush.getConfiguration();\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var baseLayer = _externalModules2.default.cornerstone.getLayers(element)[0];\n var _eventData$currentPoi2 = eventData.currentPoints.image,\n x = _eventData$currentPoi2.x,\n y = _eventData$currentPoi2.y;\n var _layer$image3 = layer.image,\n rows = _layer$image3.rows,\n columns = _layer$image3.columns;\n\n var pointerArray = (0, _getCircle2.default)(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove(e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag(e, eventData) {\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered(e, eventData) {\n if (!lastImageCoords) {\n return;\n }\n\n var _eventData$image = eventData.image,\n rows = _eventData$image.rows,\n columns = _eventData$image.columns;\n var _lastImageCoords = lastImageCoords,\n x = _lastImageCoords.x,\n y = _lastImageCoords.y;\n\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n var configuration = adaptiveBrush.getConfiguration();\n var context = eventData.canvasContext;\n var color = dragging ? configuration.dragColor : configuration.hoverColor;\n var element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var pointerArray = (0, _getCircle2.default)(currentRadius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushOnCanvas)(pointerArray, context, color, element);\n}\n\nvar adaptiveBrush = (0, _brushTool2.default)({\n onMouseMove: onMouseMove,\n onMouseDown: onMouseDown,\n onMouseUp: onMouseUp,\n onDrag: onDrag,\n toolType: toolType,\n onImageRendered: onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexports.adaptiveBrush = adaptiveBrush;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = '1.1.2';\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// cornerstoneTools.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 60);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5dcbdc9dd02f6c4dff7c","let cornerstone = window.cornerstone;\nlet cornerstoneMath = window.cornerstoneMath;\nlet $ = window.$;\nlet Hammer = window.Hammer;\n\nexport default {\n set cornerstone (cs) {\n cornerstone = cs;\n },\n get cornerstone () {\n return cornerstone;\n },\n set cornerstoneMath (cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath () {\n return cornerstoneMath;\n },\n set $ (module) {\n $ = module;\n },\n get $ () {\n return $;\n },\n set Hammer (module) {\n Hammer = module;\n },\n get Hammer () {\n return Hammer;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction getElementToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState (element, toolType, measurementData) {\n const toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n const eventType = 'CornerstoneToolsMeasurementAdded';\n const eventData = {\n toolType,\n element,\n measurementData\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState (element, toolType, data) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n const eventType = 'CornerstoneToolsMeasurementRemoved';\n const eventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, eventData);\n }\n}\n\nfunction clearToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager (element, toolStateManager) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexport {\n addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolState.js","/* eslint no-bitwise:0 */\n\nexport default function (which, mouseButtonMask) {\n const mouseButton = (1 << (which - 1));\n\n\n return ((mouseButtonMask & mouseButton) !== 0);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/isMouseButtonEnabled.js","import external from '../externalModules.js';\n\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type.toLocaleLowerCase(), {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail);\n }\n\n // TODO: remove jQuery event triggers\n const jqEvent = external.$.Event(type, detail);\n\n external.$(el).trigger(jqEvent, detail);\n if (jqEvent.isImmediatePropagationStopped()) {\n return false;\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/triggerEvent.js","\nlet defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor (color) {\n fillColor = color;\n}\n\nfunction getFillColor () {\n return fillColor;\n}\n\nfunction setToolColor (color) {\n defaultColor = color;\n}\n\nfunction getToolColor () {\n return defaultColor;\n}\n\nfunction setActiveColor (color) {\n activeColor = color;\n}\n\nfunction getActiveColor () {\n return activeColor;\n}\n\nfunction getColorIfActive (active) {\n return active ? activeColor : defaultColor;\n}\n\nconst toolColors = {\n setFillColor,\n getFillColor,\n setToolColor,\n getToolColor,\n setActiveColor,\n getActiveColor,\n getColorIfActive\n};\n\nexport default toolColors;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolColors.js","let defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth (width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth () {\n return defaultWidth;\n}\n\nfunction setActiveWidth (width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth () {\n return activeWidth;\n}\n\nconst toolStyle = {\n setToolWidth,\n getToolWidth,\n setActiveWidth,\n getActiveWidth\n};\n\nexport default toolStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolStyle.js","import textStyle from '../stateManagement/textStyle.js';\n\nexport default function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n const padding = 5;\n const font = textStyle.getFont();\n const fontSize = textStyle.getFontSize();\n const backgroundColor = textStyle.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n let maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n const width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n const boundingBox = {\n width: maxWidth + (padding * 2),\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawTextBox.js","import external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseToolInterface) {\n let configuration = {};\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n const eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n cornerstone.updateImage(element);\n\n let handleMover;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = moveHandle;\n } else {\n handleMover = moveNewHandle;\n }\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, mouseToolInterface.toolType, measurementData);\n }\n\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e, eventData) {\n toolCoordinates.setCoords(eventData);\n // If a mouse button is down, do nothing\n if (eventData.which !== 0) {\n return;\n }\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, mouseToolInterface.toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n const coords = eventData.currentPoints.canvas;\n\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e, eventData) {\n let data;\n const element = eventData.element;\n\n function handleDoneMove () {\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, mouseToolInterface.toolType, data);\n }\n\n external.cornerstone.updateImage(element);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n }\n\n if (!isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, mouseToolInterface.toolType);\n\n if (!toolData) {\n return;\n }\n\n let i;\n\n // Now check to see if there is a handle we can move\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distance = 6;\n const handle = getHandleNearImagePoint(element, data.handles, coords, distance);\n\n if (handle) {\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n const options = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n moveAllHandles(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered (e) {\n mouseToolInterface.onImageRendered(e, e.detail);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n }\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n const eventType = 'CornerstoneToolsToolDeactivated';\n const statusChangeEventData = {\n mouseButtonMask,\n toolType: mouseToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback);\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback);\n external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n function getConfiguration () {\n return configuration;\n }\n\n function setConfiguration (config) {\n configuration = config;\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration,\n mouseDownCallback,\n mouseMoveCallback,\n mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseToolInterface.mouseDoubleClickCallback) {\n toolInterface.mouseDoubleClickCallback = mouseToolInterface.mouseDoubleClickCallback;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonTool.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\n\nconst handleRadius = 6;\n\nexport default function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = toolStyle.getActiveWidth();\n } else {\n context.lineWidth = toolStyle.getToolWidth();\n }\n\n const handleCanvasCoords = external.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/drawHandles.js","import external from '../externalModules.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport touchMoveHandle from '../manipulators/touchMoveHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport touchMoveAllHandles from '../manipulators/touchMoveAllHandles.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction deactivateAllHandles (handles) {\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances (toolData) {\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool (touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n\n const measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n addToolState(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === 'CornerstoneToolsTap') {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n moveNewHandleTouch(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n external.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback (e, eventData) {\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback (e, eventData) {\n // Console.log('touchTool tapCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let data;\n let i;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback () {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distanceSq = 25; // Should probably make this a settable property later\n const handle = getHandleNearImagePoint(element, data.handles, coords, distanceSq);\n\n if (handle) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e, eventData);\n } else {\n touchDownActivateCallback(e, eventData);\n }\n\n return false;\n }\n\n function touchStartCallback (e, eventData) {\n // Console.log('touchTool touchStartCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.startPoints.canvas;\n let data;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let i;\n\n function doneMovingCallback (lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n external.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') {\n triggerEvent(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n data.active = true;\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n external.$(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n external.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of touchTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered (e) {\n touchToolInterface.onImageRendered(e, e.detail);\n }\n\n // Visible, interactive\n function deactivate (element) {\n const eventType = 'CornerstoneToolsToolDeactivated';\n const statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexport default touchTool;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchTool.js","let defaultStartLoadHandler;\nlet defaultEndLoadHandler;\nlet defaultErrorLoadingHandler;\n\nfunction setStartLoadHandler (handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler () {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler (handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler () {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler (handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler () {\n return defaultErrorLoadingHandler;\n}\n\nconst loadHandlerManager = {\n setStartLoadHandler,\n getStartLoadHandler,\n setEndLoadHandler,\n getEndLoadHandler,\n setErrorLoadingHandler,\n getErrorLoadingHandler\n};\n\nexport default loadHandlerManager;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/loadHandlerManager.js","import external from '../externalModules.js';\n\nexport default function (touchDragCallback, options) {\n let events = 'CornerstoneToolsTouchDrag';\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsTouchStart';\n }\n\n const toolInterface = {\n activate (element) {\n external.$(element).off(events, touchDragCallback);\n\n if (options && options.eventData) {\n external.$(element).on(events, options.eventData, touchDragCallback);\n } else {\n external.$(element).on(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchDragTool.js","import external from '../externalModules.js';\n\nexport default function (renderData, handles) {\n const image = renderData.image;\n const imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n let handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (external.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/anyHandlesOutsideImage.js","import external from '../externalModules.js';\n\nexport default function (mouseDownCallback) {\n let configuration = {};\n\n const toolInterface = {\n activate (element, mouseButtonMask, options) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n const eventData = {\n mouseButtonMask,\n options\n };\n\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleMouseButtonTool.js","let defaultFontSize = 15,\n defaultFont = `${defaultFontSize}px Arial`,\n defaultBackgroundColor = 'transparent';\n\nfunction setFont (font) {\n defaultFont = font;\n}\n\nfunction getFont () {\n return defaultFont;\n}\n\nfunction setFontSize (fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize () {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor (backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor () {\n return defaultBackgroundColor;\n}\n\nconst textStyle = {\n setFont,\n getFont,\n setFontSize,\n getFontSize,\n setBackgroundColor,\n getBackgroundColor\n};\n\nexport default textStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/textStyle.js","import external from '../externalModules.js';\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nexport default function convertToVector3 (arrayOrVector3) {\n const cornerstoneMath = external.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/convertToVector3.js","import external from '../externalModules.js';\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager () {\n let toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState (imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState (imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState (element, toolType, data) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState (element, toolType) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = imageIdToolState[toolType];\n\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState,\n restoreImageIdToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nconst globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexport {\n newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/imageIdSpecificStateManager.js","import external from '../externalModules.js';\n\nexport default function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return external.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInsideBoundingBox.js","import external from '../externalModules.js';\n\n// Returns a decimal value given a fractional value\nfunction fracToDec (fractionalValue) {\n return parseFloat(`.${fractionalValue}`);\n}\n\nexport default function (image, storedPixelValue) {\n const cornerstone = external.cornerstone;\n const patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n const modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n const modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n const patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n const petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n const startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n const totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n const halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n const seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n const acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n const injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n const durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n const correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n const suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateSUV.js","import external from '../externalModules.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\n\nexport default function (element, handles, coords, distanceThreshold) {\n let nearbyHandle;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if (pointInsideBoundingBox(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n const handleCanvas = external.cornerstone.pixelToCanvas(element, handle);\n const distance = external.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/getHandleNearImagePoint.js","let configMaxSimultaneousRequests;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nconst maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo () {\n const ua = navigator.userAgent;\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n let tem;\n\n if (/trident/i.test(M[1])) {\n tem = (/\\brv[ :]+(\\d+)/g).exec(ua) || [];\n\n return `IE ${tem[1] || ''}`;\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests (newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests () {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests () {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n const browserName = info[0];\n const browserVersion = info[1];\n const browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice () {\n const pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n\n return pattern.test(navigator.userAgent);\n}\n\nexport {\n getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n setMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice\n};\n\n\n\n// WEBPACK FOOTER //\n// ./util/getMaxSimultaneousRequests.js","import external from '../externalModules.js';\n\nexport default function (mouseWheelCallback) {\n const toolInterface = {\n activate (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n const eventData = {\n };\n\n external.$(element).on('CornerstoneToolsMouseWheel', eventData, mouseWheelCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback);\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseWheelTool.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback (e, eventData) {\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n external.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n\n function mouseUpCallback () {\n handle.active = false;\n external.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveHandle.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function moveCallback (e, eventData) {\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function whichMovement (e) {\n external.$(element).off('CornerstoneToolsMouseMove', whichMovement);\n external.$(element).off('CornerstoneToolsMouseDrag', whichMovement);\n\n external.$(element).on('CornerstoneToolsMouseMove', moveCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', moveCallback);\n\n external.$(element).on('CornerstoneToolsMouseClick', moveEndCallback);\n if (e.type === 'CornerstoneToolsMouseDrag') {\n external.$(element).on('CornerstoneToolsMouseUp', moveEndCallback);\n }\n }\n\n function measurementRemovedCallback (e, eventData) {\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback (e, eventData) {\n if (eventData.toolType === toolType) {\n external.$(element).off('CornerstoneToolsMouseMove', moveCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', moveCallback);\n external.$(element).off('CornerstoneToolsMouseClick', moveEndCallback);\n external.$(element).off('CornerstoneToolsMouseUp', moveEndCallback);\n external.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n external.$(element).on('CornerstoneToolsMouseDrag', whichMovement);\n external.$(element).on('CornerstoneToolsMouseMove', whichMovement);\n external.$(element).on('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n external.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n function moveEndCallback () {\n external.$(element).off('CornerstoneToolsMouseMove', moveCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', moveCallback);\n external.$(element).off('CornerstoneToolsMouseClick', moveEndCallback);\n external.$(element).off('CornerstoneToolsMouseUp', moveEndCallback);\n external.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandle.js","import external from '../externalModules.js';\n\nexport default function (onImageRendered) {\n let configuration = {};\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonRectangleTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function customEventOnImageRendered (e) {\n onImageRendered(e, e.detail);\n }\n\n const toolInterface = {\n disable (element) {\n element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n },\n enable (element) {\n element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n element.addEventListener('cornerstoneimagerendered', customEventOnImageRendered);\n external.cornerstone.updateImage(element);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/displayTool.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n const distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback (e, eventData) {\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback (e, eventData) {\n external.$(element).off('CornerstoneToolsTouchDrag', moveCallback);\n external.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback);\n external.$(element).off('CornerstoneToolsTap', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n if (e.type === 'CornerstoneToolsTouchPinch' || e.type === 'CornerstoneToolsTouchPress') {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation (e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', moveCallback);\n external.$(element).on('CornerstoneToolsTouchPinch', moveEndCallback);\n external.$(element).on('CornerstoneToolsTouchEnd', moveEndCallback);\n external.$(element).on('CornerstoneToolsTap', moveEndCallback);\n external.$(element).on('CornerstoneToolsTouchStart', stopImmediatePropagation);\n\n function toolDeactivatedCallback () {\n external.$(element).off('CornerstoneToolsTouchDrag', moveCallback);\n external.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback);\n external.$(element).off('CornerstoneToolsTap', moveEndCallback);\n external.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation);\n external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n external.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandleTouch.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Projects a patient point to an image point\nexport function projectPatientPointToImagePlane (patientPoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n const point = patientPoint.clone().sub(imagePositionPatient);\n const x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n const y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n\n return {\n x,\n y\n };\n}\n\n// Projects an image point to a patient point\nexport function imagePointToPatientPoint (imagePoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n\n const x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n const y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n const patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane (imagePlane) {\n // Get the points\n const topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n const topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n const bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n const bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n const rect = {\n top: new external.cornerstoneMath.Line3(topLeft, topRight),\n left: new external.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new external.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new external.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n\n return rect;\n}\n\nfunction lineRectangleIntersection (line, rect) {\n const intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n const segment = rect[side];\n const intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nexport function planePlaneIntersection (targetImagePlane, referenceImagePlane) {\n const targetRowCosines = convertToVector3(targetImagePlane.rowCosines);\n const targetColumnCosines = convertToVector3(targetImagePlane.columnCosines);\n const targetImagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n const referenceRowCosines = convertToVector3(referenceImagePlane.rowCosines);\n const referenceColumnCosines = convertToVector3(referenceImagePlane.columnCosines);\n const referenceImagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n const targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n const targetPlane = new external.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n const referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n const referencePlane = new external.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n const originDirection = referencePlane.clone().intersectPlane(targetPlane);\n const origin = originDirection.origin;\n const direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n const bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n const distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n const line = new external.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n const rect = getRectangleFromImagePlane(referenceImagePlane);\n const intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointProjector.js","import external from '../externalModules.js';\nimport { getMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nconst numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nlet maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nlet awake = false;\nconst grabDelay = 20;\n\nfunction addRequest (element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n const requestDetails = {\n type,\n imageId,\n preventCache,\n doneCallback,\n failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n const imagePromise = external.cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise) {\n imagePromise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack (type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain () {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest (requestDetails) {\n const cornerstone = external.cornerstone;\n // Increment the number of current requests of this type\n const type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n const imageId = requestDetails.imageId;\n const doneCallback = requestDetails.doneCallback;\n const failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n const imagePromise = cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imagePromise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority (requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n const priority = requestTypeToLoadPriority(requestDetails);\n\n let loader;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing () {\n // Begin by grabbing X images\n const maxSimultaneousRequests = getMaxSimultaneousRequests();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n const currentRequests = numRequests.interaction +\n numRequests.thumbnail +\n numRequests.prefetch;\n const requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest () {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length &&\n !requestPool.thumbnail.length &&\n !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool () {\n return requestPool;\n}\n\nexport default {\n addRequest,\n clearRequestStack,\n startGrabbing,\n getRequestPool\n};\n\n\n\n// WEBPACK FOOTER //\n// ./requestPool/requestPoolManager.js","import external from '../externalModules.js';\n\nexport default function (touchDragCallback, options) {\n let configuration = {};\n let events = 'CornerstoneToolsMultiTouchDrag';\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsMultiTouchStart';\n }\n\n const toolInterface = {\n activate (element) {\n external.$(element).off(events, touchDragCallback);\n\n if (options && options.eventData) {\n external.$(element).on(events, options.eventData, touchDragCallback);\n } else {\n external.$(element).on(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n external.$(element).off(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/multiTouchDragTool.js","import scrollToIndex from './scrollToIndex.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default function (element, images, loop = false) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n let newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n const nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n scrollToIndex(element, newImageIdIndex);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scroll.js","export default function (value, precision) {\n const multiplier = Math.pow(10, precision);\n\n\n return (Math.round(value * multiplier) / multiplier);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/roundToDecimal.js","export default function (ellipse, location) {\n const xRadius = ellipse.width / 2;\n const yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n const center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n const normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n const inEllipse = ((normalized.x * normalized.x) / (xRadius * xRadius)) + ((normalized.y * normalized.y) / (yRadius * yRadius)) <= 1.0;\n\n\n return inEllipse;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInEllipse.js","/**\n * This function is used to prevent selection from occuring when left click dragging on the image\n * @param e the event that is provided to your event handler\n * Based on: http://stackoverflow.com/questions/5429827/how-can-i-prevent-text-element-selection-with-cursor-drag\n * @returns {boolean}\n */\nexport default function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pauseEvent.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const storedPixelData = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * enabledElement.image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n const alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getRGBPixels.js","import external from '../externalModules.js';\n\nexport default function (points) {\n const page = external.cornerstoneMath.point.copy(points.page);\n const image = external.cornerstoneMath.point.copy(points.image);\n const client = external.cornerstoneMath.point.copy(points.client);\n const canvas = external.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page,\n image,\n client,\n canvas\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/copyPoints.js","let coordsData;\n\nfunction setCoords (eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords () {\n return coordsData;\n}\n\nconst toolCoordinates = {\n setCoords,\n getCoords\n};\n\nexport default toolCoordinates;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolCoordinates.js","import getHandleNearImagePoint from './getHandleNearImagePoint.js';\n\nfunction getActiveHandle (handles) {\n let activeHandle;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\nexport default function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n const activeHandle = getActiveHandle(handles);\n const nearbyHandle = getHandleNearImagePoint(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/handleActivator.js","import external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, data, toolData, toolType, options, doneMovingCallback) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function mouseDragCallback (e, eventData) {\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n\n external.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n\n function mouseUpCallback (e, eventData) {\n data.invalidated = true;\n\n external.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveAllHandles.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\nexport default function (element, timePoints, wrap) {\n const toolData = getToolState(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const timeSeriesData = toolData.data[0];\n const currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n const currentImageIdIndex = currentStack.currentImageIdIndex;\n let newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n const viewport = cornerstone.getViewport(element);\n const newStack = timeSeriesData.stacks[newStackIndex];\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n let loader;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n const imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/incrementTimePoint.js","import { planePlaneIntersection, projectPatientPointToImagePlane } from '../util/pointProjector.js';\n\n// Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner\n// Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but\n// That requires a bit more math and this works fine for most cases\nexport default function (targetImagePlane, referenceImagePlane) {\n const points = planePlaneIntersection(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: projectPatientPointToImagePlane(points.start, targetImagePlane),\n end: projectPatientPointToImagePlane(points.end, targetImagePlane)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/calculateReferenceLine.js","import external from '../externalModules.js';\nimport calculateReferenceLine from './calculateReferenceLine.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Renders the active reference line\nexport default function (context, eventData, targetElement, referenceElement) {\n const cornerstone = external.cornerstone;\n const targetImage = cornerstone.getEnabledElement(targetElement).image;\n const referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n const referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane ||\n !referenceImagePlane ||\n !targetImagePlane.rowCosines ||\n !targetImagePlane.columnCosines ||\n !targetImagePlane.imagePositionPatient ||\n !referenceImagePlane.rowCosines ||\n !referenceImagePlane.columnCosines ||\n !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = convertToVector3(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = convertToVector3(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = convertToVector3(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = convertToVector3(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n const targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n const referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n let angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) { // 0.5 radians = ~30 degrees\n return;\n }\n\n const referenceLine = calculateReferenceLine(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n const refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n const refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n const color = toolColors.getActiveColor();\n const lineWidth = toolStyle.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/renderActiveReferenceLine.js","import getOrientationString from './getOrientationString.js';\nimport invertOrientationString from './invertOrientationString.js';\n\nconst orientation = {\n getOrientationString,\n invertOrientationString\n};\n\nexport default orientation;\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/index.js","import external from '../externalModules.js';\n\n/**\n * Sets the canvas context transformation matrix so it is scaled to show text\n * more cleanly even if the image is scaled up. See\n * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText\n * for more information\n *\n * @param enabledElement\n * @param context\n * @param fontSize\n * @returns {{fontSize: number, lineHeight: number, fontScale: number}}\n */\nexport default function (enabledElement, context, fontSize) {\n const fontScale = 0.1;\n\n external.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n const scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n const lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n\n return {\n fontSize: scaledFontSize,\n lineHeight,\n fontScale\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/setContextToDisplayFontSize.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { stackScroll } from '../stackTools/stackScroll.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (element, newImageIdIndex) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (toolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function doneCallback (image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch(error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n const eventData = {\n newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n const newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n const config = stackScroll.getConfiguration();\n\n if (config && config.retryLoadOnScroll === true) {\n const newImagePromise = cornerstone.imageCache.getImagePromise(newImageId);\n\n if (newImagePromise && newImagePromise.state() === 'rejected') {\n cornerstone.imageCache.removeImagePromise(newImageId);\n }\n }\n\n // Convert the preventCache value in stack data to a boolean\n const preventCache = Boolean(stackData.preventCache);\n\n let imagePromise;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n requestPoolManager.startGrabbing();\n\n triggerEvent(element, 'CornerstoneStackScroll', eventData);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scrollToIndex.js","import external from '../externalModules.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport multiTouchDragTool from '../imageTools/multiTouchDragTool.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport scroll from '../util/scroll.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n const mouseDragEventData = {\n deltaY: 0\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback (e, eventData) {\n const images = -eventData.direction;\n\n const config = stackScroll.getConfiguration();\n\n let loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n scroll(eventData.element, images, loop);\n}\n\nfunction dragCallback (e, eventData) {\n const element = eventData.element;\n\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n const config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n let pixelsPerImage = Math.max(2, external.$(element).height() / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n e.data.deltaY = e.data.deltaY || 0;\n e.data.deltaY += eventData.deltaPoints.page.y;\n if (Math.abs(e.data.deltaY) >= pixelsPerImage) {\n const imageDelta = e.data.deltaY / pixelsPerImage;\n const imageIdIndexOffset = Math.round(imageDelta);\n const imageDeltaMod = e.data.deltaY % pixelsPerImage;\n\n e.data.deltaY = imageDeltaMod;\n scroll(element, imageIdIndexOffset);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nconst stackScroll = simpleMouseButtonTool(mouseDownCallback);\nconst stackScrollWheel = mouseWheelTool(mouseWheelCallback);\n\nconst options = {\n eventData: {\n deltaY: 0\n }\n};\nconst stackScrollTouchDrag = touchDragTool(dragCallback, options);\n\nfunction multiTouchDragCallback (e, eventData) {\n const config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e, eventData);\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 3);\n }\n};\n\nconst stackScrollMultiTouch = multiTouchDragTool(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexport {\n stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScroll.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n const luminance = [];\n let index = 0;\n const pixelData = image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns) + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getLuminance.js","// http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\nexport default function (context, x, y, w, h) {\n const kappa = 0.5522848,\n ox = (w / 2) * kappa, // Control point offset horizontal\n oy = (h / 2) * kappa, // Control point offset vertical\n xe = x + w, // X-end\n ye = y + h, // Y-end\n xm = x + w / 2, // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawEllipse.js","export default function (context, start, color, lineWidth) {\n const handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawCircle.js","export default function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n const headLength = 10;\n\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawArrow.js","import pointInEllipse from './pointInEllipse.js';\n\nexport default function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n const point = {\n x,\n y\n };\n\n if (pointInEllipse(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateEllipseStatistics.js","import external from '../externalModules.js';\n\nexport default function (keyDownCallback) {\n let configuration = {};\n\n const toolInterface = {\n activate (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n external.$(element).on('CornerstoneToolsKeyDown', keyDownCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/keyboardTool.js","import external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (touchEventData, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n const element = touchEventData.element;\n const cornerstone = external.cornerstone;\n\n function touchDragCallback (e, eventData) {\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback);\n\n function touchEndCallback (e, eventData) {\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n external.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback);\n external.$(element).off('CornerstoneToolsTouchPinch', touchEndCallback);\n external.$(element).off('CornerstoneToolsTouchPress', touchEndCallback);\n external.$(element).off('CornerstoneToolsTouchEnd', touchEndCallback);\n external.$(element).off('CornerstoneToolsDragEnd', touchEndCallback);\n external.$(element).off('CornerstoneToolsTap', touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n if (deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e, eventData);\n }\n }\n\n external.$(element).on('CornerstoneToolsTouchPinch', touchEndCallback);\n external.$(element).on('CornerstoneToolsTouchPress', touchEndCallback);\n external.$(element).on('CornerstoneToolsTouchEnd', touchEndCallback);\n external.$(element).on('CornerstoneToolsDragEnd', touchEndCallback);\n external.$(element).on('CornerstoneToolsTap', touchEndCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveAllHandles.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nconst runAnimation = {\n value: false\n};\n\nconst touchEndEvents = ['CornerstoneToolsTouchEnd',\n 'CornerstoneToolsDragEnd',\n 'CornerstoneToolsTouchPinch',\n 'CornerstoneToolsTouchPress',\n 'CornerstoneToolsTap'\n].join(' ');\n\nfunction animate (lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Update\n const time = (new Date()).getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n const distanceRemaining = Math.abs(handle.y - targetLocation.y);\n const linearDistEachFrame = distanceRemaining / 10;\n\n console.log(`distanceRemaining: ${distanceRemaining}`);\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\nexport default function (touchEventData, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n\n const time = (new Date()).getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const fingerDistance = -57;\n\n const aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n let targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback (e, eventData) {\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n const currentPoints = eventData.currentPoints;\n const aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n const eventType = 'CornerstoneToolsMeasurementModified';\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback);\n\n function touchEndCallback (e, eventData) {\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n runAnimation.value = false;\n\n handle.active = false;\n external.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback);\n external.$(element).off(touchEndEvents, touchEndCallback);\n\n cornerstone.updateImage(element);\n\n if (e.type === 'CornerstoneToolsTouchPress') {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e, eventData);\n }\n }\n\n external.$(element).on(touchEndEvents, touchEndCallback);\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveHandle.js","import external from '../externalModules.js';\n\n// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nconst antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n };\n\nlet lastInteractionType,\n lastInteractionTime;\n\nfunction handleTap (type, e) {\n const now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nconst handleTapMouse = handleTap.bind(null, pointerType.mouse);\nconst handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n external.$(element).on(eventName, tapHandler);\n });\n}\n\nfunction removeEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n external.$(element).off(eventName, tapHandler);\n });\n}\n\nconst mouseEvents = ['mousedown', 'mouseup'];\nconst touchEvents = ['touchstart', 'touchend'];\n\nfunction disable (element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable (element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nconst preventGhostClick = {\n enable,\n disable\n};\n\nexport default preventGhostClick;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/preventGhostClick.js","import external from '../externalModules.js';\n\nexport default function (doubleTapCallback) {\n return {\n activate (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n const eventData = {};\n\n external.$(element).on('CornerstoneToolsDoubleTap', eventData, doubleTapCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapTool.js","import external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nexport default function (mouseToolInterface, preventHandleOutsideImage) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(mouseEventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n moveHandle(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData);\n }\n\n external.$(mouseEventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e, eventData) {\n toolCoordinates.setCoords(eventData);\n // If a mouse button is down, do nothing\n if (eventData.which !== 0) {\n return;\n }\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, mouseToolInterface.toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n const coords = eventData.currentPoints.canvas;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n let data;\n\n function handleDoneMove () {\n data.active = false;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, mouseToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n }\n\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, mouseToolInterface.toolType);\n\n let i;\n\n // Now check to see if there is a handle we can move\n const distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n const options = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n moveAllHandles(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove);\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Note: This is to maintain compatibility for developers that have\n // Built on top of mouseButtonRectangleTool.js\n // TODO: Remove this after we migrate Cornerstone Tools away from jQuery\n function onImageRendered (e) {\n mouseToolInterface.onImageRendered(e, e.detail);\n }\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonRectangleTool.js","import external from '../externalModules.js';\n\nexport default function (touchPinchCallback) {\n const toolInterface = {\n activate (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n const eventData = {\n };\n\n external.$(element).on('CornerstoneToolsTouchPinch', eventData, touchPinchCallback);\n },\n disable (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n },\n enable (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n },\n deactivate (element) {\n external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback);\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchPinchTool.js","import external from '../externalModules.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nlet brushLayerId;\n\nexport default function (brushToolInterface) {\n function mouseMoveCallback (e, eventData) {\n brushToolInterface.onMouseMove(e, eventData);\n }\n\n function mouseUpCallback (e, eventData) {\n brushToolInterface.onMouseUp(e, eventData);\n\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseMoveCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n }\n\n function dragCallback (e, eventData) {\n brushToolInterface.onDrag(e, eventData);\n\n return false;\n }\n\n function mouseDownActivateCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n brushToolInterface.onMouseDown(e, eventData);\n\n return false;\n }\n\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseMoveCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n }\n\n function onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n let pixelData;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n }\n\n const layer = external.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n\n // Note: This is to maintain compatibility with jQuery event handlers.\n // On our next migration this should just be onImageRendered(e)\n brushToolInterface.onImageRendered(e, eventData);\n }\n\n function activate (element, mouseButtonMask) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n const eventData = {\n mouseButtonMask\n };\n\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback);\n\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const { width, height } = enabledElement.image;\n let pixelData = new Uint8ClampedArray(width * height);\n\n const configuration = brushTool.getConfiguration();\n let colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n const colormap = external.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n const labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: () => pixelData,\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height,\n width,\n pixelData,\n setPixelData: (data) => {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n let layer;\n const options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = external.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = external.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n external.cornerstone.updateImage(element);\n }\n\n function deactivate (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n }\n\n const brushTool = mouseButtonTool({\n mouseMoveCallback,\n mouseDownActivateCallback,\n onImageRendered,\n deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brushTool.js","export default function getCircle (radius, rows, columns, xCoord = 0, yCoord = 0) {\n const x0 = Math.round(xCoord);\n const y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n const circleArray = [];\n let index = 0;\n\n for(let y = -radius; y <= radius; y++) {\n const yCoord = y0 + y;\n\n if (yCoord > rows || yCoord < 0) {\n continue;\n }\n\n for(let x = -radius; x <= radius; x++) {\n const xCoord = x0 + x;\n\n if (xCoord > columns || xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/getCircle.js","import external from '../externalModules.js';\n\nfunction drawBrushPixels (pointerArray, storedPixels, brushPixelValue, columns) {\n const getPixelIndex = (x, y) => (y * columns) + x;\n\n pointerArray.forEach((point) => {\n const spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas (pointerArray, canvasContext, color, element) {\n const canvasPtTL = external.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n const canvasPtBR = external.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n const sizeX = canvasPtBR.x - canvasPtTL.x;\n const sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach((point) => {\n const canvasPt = external.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexport { drawBrushPixels, drawBrushOnCanvas };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/drawBrush.js","export { default as external } from './externalModules.js';\n\nexport { default as referenceLines } from './referenceLines/index.js';\nexport { default as orientation } from './orientation/index.js';\n\nexport { default as requestPoolManager } from './requestPool/requestPoolManager.js';\n\nexport { default as setContextToDisplayFontSize } from './util/setContextToDisplayFontSize.js';\nexport { default as scrollToIndex } from './util/scrollToIndex.js';\nexport { default as scroll } from './util/scroll.js';\nexport { default as roundToDecimal } from './util/roundToDecimal.js';\nexport { projectPatientPointToImagePlane,\n imagePointToPatientPoint,\n planePlaneIntersection } from './util/pointProjector.js';\n\nexport { default as pointInsideBoundingBox } from './util/pointInsideBoundingBox.js';\nexport { default as pointInEllipse } from './util/pointInEllipse.js';\nexport { default as pauseEvent } from './util/pauseEvent.js';\nexport { default as isMouseButtonEnabled } from './util/isMouseButtonEnabled.js';\nexport { default as getRGBPixels } from './util/getRGBPixels.js';\nexport { getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice } from './util/getMaxSimultaneousRequests.js';\n\nexport { default as getLuminance } from './util/getLuminance.js';\nexport { default as drawTextBox } from './util/drawTextBox.js';\nexport { default as drawEllipse } from './util/drawEllipse.js';\nexport { default as drawCircle } from './util/drawCircle.js';\nexport { default as drawArrow } from './util/drawArrow.js';\nexport { default as copyPoints } from './util/copyPoints.js';\nexport { default as calculateSUV } from './util/calculateSUV.js';\nexport { default as calculateEllipseStatistics } from './util/calculateEllipseStatistics.js';\n\nexport { default as probeTool4D } from './timeSeriesTools/probeTool4D.js';\nexport { default as incrementTimePoint } from './timeSeriesTools/incrementTimePoint.js';\nexport { default as timeSeriesPlayer } from './timeSeriesTools/timeSeriesPlayer.js';\nexport { timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag } from './timeSeriesTools/timeSeriesScroll.js';\n\nexport { default as wwwcSynchronizer } from './synchronization/wwwcSynchronizer.js';\nexport { default as updateImageSynchronizer } from './synchronization/updateImageSynchronizer.js';\nexport { default as Synchronizer } from './synchronization/Synchronizer.js';\nexport { default as stackScrollSynchronizer } from './synchronization/stackScrollSynchronizer.js';\nexport { default as stackImagePositionSynchronizer } from './synchronization/stackImagePositionSynchronizer.js';\nexport { default as stackImagePositionOffsetSynchronizer } from './synchronization/stackImagePositionOffsetSynchronizer.js';\nexport { default as stackImageIndexSynchronizer } from './synchronization/stackImageIndexSynchronizer.js';\nexport { default as panZoomSynchronizer } from './synchronization/panZoomSynchronizer.js';\n\nexport { default as toolStyle } from './stateManagement/toolStyle.js';\nexport { addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager } from './stateManagement/toolState.js';\nexport { default as toolCoordinates } from './stateManagement/toolCoordinates.js';\nexport { default as toolColors } from './stateManagement/toolColors.js';\nexport { addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager } from './stateManagement/timeSeriesSpecificStateManager.js';\nexport { default as textStyle } from './stateManagement/textStyle.js';\n\nexport { stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager } from './stateManagement/stackSpecificStateManager.js';\n\nexport { default as loadHandlerManager } from './stateManagement/loadHandlerManager.js';\n\nexport { newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager } from './stateManagement/imageIdSpecificStateManager.js';\n\nexport { newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager } from './stateManagement/frameOfReferenceStateManager.js';\n\nexport { default as appState } from './stateManagement/appState.js';\n\nexport { default as stackScrollKeyboard } from './stackTools/stackScrollKeyboard.js';\n\nexport { stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch } from './stackTools/stackScroll.js';\n\nexport { default as stackPrefetch } from './stackTools/stackPrefetch.js';\nexport { default as scrollIndicator } from './stackTools/scrollIndicator.js';\nexport { default as stackRenderers } from './stackTools/stackRenderers.js';\nexport { playClip, stopClip } from './stackTools/playClip.js';\n\nexport { default as anyHandlesOutsideImage } from './manipulators/anyHandlesOutsideImage.js';\nexport { default as drawHandles } from './manipulators/drawHandles.js';\nexport { default as getHandleNearImagePoint } from './manipulators/getHandleNearImagePoint.js';\nexport { default as handleActivator } from './manipulators/handleActivator.js';\nexport { default as moveAllHandles } from './manipulators/moveAllHandles.js';\nexport { default as moveHandle } from './manipulators/moveHandle.js';\nexport { default as moveNewHandle } from './manipulators/moveNewHandle.js';\nexport { default as moveNewHandleTouch } from './manipulators/moveNewHandleTouch.js';\nexport { default as touchMoveAllHandles } from './manipulators/touchMoveAllHandles.js';\nexport { default as touchMoveHandle } from './manipulators/touchMoveHandle.js';\n\nexport { default as keyboardInput } from './inputSources/keyboardInput.js';\nexport { default as mouseInput } from './inputSources/mouseInput.js';\nexport { default as mouseWheelInput } from './inputSources/mouseWheelInput.js';\nexport { default as preventGhostClick } from './inputSources/preventGhostClick.js';\nexport { default as touchInput } from './inputSources/touchInput.js';\n\n\nexport { angle, angleTouch } from './imageTools/angleTool.js';\nexport { arrowAnnotate, arrowAnnotateTouch } from './imageTools/arrowAnnotate.js';\nexport { crosshairs, crosshairsTouch } from './imageTools/crosshairs.js';\nexport { default as displayTool } from './imageTools/displayTool.js';\nexport { default as doubleTapTool } from './imageTools/doubleTapTool.js';\nexport { default as doubleTapZoom } from './imageTools/doubleTapZoom.js';\nexport { dragProbe, dragProbeTouch } from './imageTools/dragProbe.js';\n\nexport { ellipticalRoi, ellipticalRoiTouch } from './imageTools/ellipticalRoi.js';\nexport { freehand } from './imageTools/freehand.js';\n\nexport { highlight, highlightTouch } from './imageTools/highlight.js';\nexport { default as imageStats } from './imageTools/imageStats.js';\nexport { default as keyboardTool } from './imageTools/keyboardTool.js';\nexport { length, lengthTouch } from './imageTools/length.js';\nexport { magnify, magnifyTouchDrag } from './imageTools/magnify.js';\nexport { default as mouseButtonRectangleTool } from './imageTools/mouseButtonRectangleTool.js';\nexport { default as mouseButtonTool } from './imageTools/mouseButtonTool.js';\nexport { default as mouseWheelTool } from './imageTools/mouseWheelTool.js';\nexport { default as multiTouchDragTool } from './imageTools/multiTouchDragTool.js';\nexport { default as orientationMarkers } from './imageTools/orientationMarkers.js';\n\nexport { pan, panTouchDrag } from './imageTools/pan.js';\nexport { default as panMultiTouch } from './imageTools/panMultiTouch.js';\nexport { probe, probeTouch } from './imageTools/probe.js';\nexport { rectangleRoi, rectangleRoiTouch } from './imageTools/rectangleRoi.js';\nexport { rotate, rotateTouchDrag } from './imageTools/rotate.js';\nexport { default as rotateTouch } from './imageTools/rotateTouch.js';\nexport { default as saveAs } from './imageTools/saveAs.js';\nexport { seedAnnotate, seedAnnotateTouch } from './imageTools/seedAnnotate.js';\nexport { simpleAngle, simpleAngleTouch } from './imageTools/simpleAngle.js';\nexport { default as simpleMouseButtonTool } from './imageTools/simpleMouseButtonTool.js';\nexport { textMarker, textMarkerTouch } from './imageTools/textMarker.js';\n\nexport { default as touchDragTool } from './imageTools/touchDragTool.js';\nexport { default as touchPinchTool } from './imageTools/touchPinchTool.js';\nexport { default as touchTool } from './imageTools/touchTool.js';\nexport { wwwc, wwwcTouchDrag } from './imageTools/wwwc.js';\nexport { wwwcRegion, wwwcRegionTouch } from './imageTools/wwwcRegion.js';\nexport { zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag } from './imageTools/zoom.js';\nexport { brush } from './paintingTools/brush.js';\nexport { adaptiveBrush } from './paintingTools/adaptiveBrush.js';\nexport { default as version } from './version.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import calculateReferenceLine from './calculateReferenceLine.js';\nimport tool from './referenceLinesTool.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst referenceLines = {\n calculateReferenceLine,\n tool,\n renderActiveReferenceLine\n};\n\nexport default referenceLines;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/index.js","import external from '../externalModules.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst toolType = 'referenceLines';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n const renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach((referenceEnabledElement) => {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable (element, synchronizationContext, renderer) {\n renderer = renderer || renderActiveReferenceLine;\n\n addToolState(element, toolType, {\n synchronizationContext,\n renderer\n });\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nconst tool = {\n enable,\n disable\n};\n\nexport default tool;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/referenceLinesTool.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nexport default function (vector) {\n const vec3 = convertToVector3(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n let orientation = '';\n const orientationX = vec3.x < 0 ? 'R' : 'L';\n const orientationY = vec3.y < 0 ? 'A' : 'P';\n const orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n const abs = new external.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (let i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/getOrientationString.js","export default function (string) {\n let inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/invertOrientationString.js","import external from '../externalModules.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport setContextToDisplayFontSize from '../util/setContextToDisplayFontSize.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport MeasurementManager from '../measurementManager/measurementManager.js';\nimport LineSampleMeasurement from '../measurementManager/lineSampleMeasurement.js';\n\nconst toolType = 'probe4D';\n\nfunction updateLineSample (measurementData) {\n const cornerstone = external.cornerstone;\n const samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n let loader;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n const offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n const sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const timeSeriestoolData = getToolState(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n const timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n timeSeries,\n lineSample: new LineSampleMeasurement(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n MeasurementManager.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n const color = 'white';\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n const data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n drawHandles(context, eventData, data.handles, color);\n context.stroke();\n\n // Draw text\n const fontParameters = setContextToDisplayFontSize(eventData.enabledElement, eventData.canvasContext, 15);\n\n context.font = `${fontParameters.fontSize}px Arial`;\n\n // Translate the x/y away from the cursor\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n const textX = data.handles.end.x + 3;\n const textY = data.handles.end.y - 3;\n\n context.fillStyle = color;\n\n context.fillText(`${x},${y}`, textX, textY);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probeTool4D = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n toolType\n});\n\nexport default probeTool4D;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/probeTool4D.js","import triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nfunction MeasurementManager () {\n const that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n const index = that.measurements.push(measurement);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(that, 'CornerstoneMeasurementAdded', eventDetail);\n };\n\n this.remove = function (index) {\n const measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(that, 'CornerstoneMeasurementRemoved', eventDetail);\n };\n\n}\n\n// Module/private exports\nconst manager = new MeasurementManager();\n\nexport default manager;\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/measurementManager.js","import triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nexport default function () {\n\n const that = this;\n\n that.samples = [];\n\n // Adds an element as both a source and a target\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n triggerEvent(that, 'CornerstoneLineSampleUpdated');\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/lineSampleMeasurement.js","import { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport incrementTimePoint from './incrementTimePoint.js';\n\nconst toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n const timeSeriesToolData = getToolState(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n const playClipToolData = getToolState(element, toolType);\n let playClipData;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n incrementTimePoint(element, 1, true);\n } else {\n incrementTimePoint(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n const playClipData = playClipToolData.data[0];\n\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nconst timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexport default timeSeriesPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesPlayer.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport incrementTimePoint from './incrementTimePoint.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n\n const mouseDragEventData = {\n deltaY: 0,\n options: e.data.options\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, mouseDragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback (e, eventData) {\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n const toolData = getToolState(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n const timeSeriesData = toolData.data[0];\n\n let pixelsPerTimeSeries = external.$(eventData.element).height() / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n const timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n const timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback (e, eventData) {\n const images = -eventData.direction;\n\n incrementTimePoint(eventData.element, images);\n}\n\nfunction onDrag (e) {\n const mouseMoveData = e.originalEvent.detail;\n const eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n const toolData = getToolState(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n const timeSeriesDelta = eventData.deltaY / 3;\n const timeSeriesDeltaMod = eventData.deltaY % 3;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nconst timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback);\nconst timeSeriesScrollWheel = mouseWheelTool(mouseWheelCallback);\nconst timeSeriesScrollTouchDrag = touchDragTool(onDrag);\n\nexport {\n timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesScroll.js","import external from '../externalModules.js';\n\n// This function synchronizes the target element ww/wc to match the source element\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/wwwcSynchronizer.js","import external from '../externalModules.js';\n\n// This function causes the target image to be drawn immediately\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n external.cornerstone.updateImage(targetElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/updateImageSynchronizer.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer (event, handler) {\n const cornerstone = external.cornerstone;\n const that = this;\n const sourceElements = []; // Source elements fire the events we want to synchronize to\n const targetElements = []; // Target elements we want to synchronize to source elements\n\n let ignoreFiredEvents = false;\n const initialData = {};\n let eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n const targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n const targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n const targetImagePosition = convertToVector3(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent (sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n const targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n const targetImageId = initialData.imageIds.targetElements[targetIndex];\n const sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n const sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n let positionDifference;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent (e, eventData) {\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n const index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n external.$(element).on(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n const index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n const index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n external.$(element).off(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n const index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler (e) {\n const element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n const elements = external.$.unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener('cornerstoneelementdisabled', disableHandler);\n element.addEventListener('cornerstoneelementdisabled', disableHandler);\n });\n };\n\n this.destroy = function () {\n const elements = external.$.unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexport default Synchronizer;\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/Synchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes any scrolling actions within the stack to propagate to\n// All of the other viewports that are synced\nexport default function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the stack of the target viewport\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n let newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackScrollSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n stackData.imageIds.forEach((imageId, index) => {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\n\n// In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable.\n\nexport default function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n const finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionOffsetSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceStackToolDataSource = getToolState(sourceElement, 'stack');\n const sourceStackData = sourceStackToolDataSource.data[0];\n const targetStackToolDataSource = getToolState(targetElement, 'stack');\n const targetStackData = targetStackToolDataSource.data[0];\n\n let newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImageIndexSynchronizer.js","import external from '../externalModules.js';\n\n// This function synchronizes the target zoom and pan to match the source\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/panZoomSynchronizer.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager (toolTypes, oldStateManager) {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n const imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n\n return imageIdToolStateManager;\n}\n\nconst timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager (element, tools) {\n tools = tools || ['timeSeries'];\n let oldStateManager = getElementToolStateManager(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n const timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n setElementToolStateManager(element, timeSeriesSpecificStateManager);\n}\n\nexport {\n addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/timeSeriesSpecificStateManager.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager (toolTypes, oldStateManager) {\n let toolState = {};\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n\n }\n\n const stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n\n\n return stackSpecificToolStateManager;\n}\n\nconst stackStateManagers = [];\n\nfunction addStackStateManager (element, otherTools) {\n let oldStateManager = getElementToolStateManager(element);\n\n if (!oldStateManager) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n let stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n const stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n setElementToolStateManager(element, stackSpecificStateManager);\n}\n\nconst stackSpecificStateManager = {\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\nexport {\n stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/stackSpecificStateManager.js","// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager () {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState (frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nconst globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexport {\n newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/frameOfReferenceStateManager.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager } from './toolState.js';\n\nfunction saveApplicationState (elements) {\n // Save imageId-specific tool state data\n const appState = {\n imageIdToolState: globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = external.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState (appState) {\n if (!appState.hasOwnProperty('imageIdToolState') ||\n !appState.hasOwnProperty('elementToolState') ||\n !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n\n // Restore all the imageId specific tool data\n globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n const element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n const savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nconst appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexport default appState;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/appState.js","import scroll from '../util/scroll.js';\nimport keyboardTool from '../imageTools/keyboardTool.js';\n\nconst keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback (e, eventData) {\n const keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n let images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n scroll(eventData.element, images);\n}\n\n// Module/private exports\nconst stackScrollKeyboard = keyboardTool(keyDownCallback);\n\nexport default stackScrollKeyboard;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScrollKeyboard.js","import external from '../externalModules.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst toolType = 'stackPrefetch';\nconst requestType = 'prefetch';\n\nlet configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nlet resetPrefetchTimeout;\nconst resetPrefetchDelay = 10;\n\nfunction range (lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n const arr = [];\n let c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nconst max = function (arr) {\n return Math.max.apply(null, arr);\n};\n\nconst min = function (arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex (arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n const l = [];\n const h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch (element) {\n // Check to make sure stack data exists\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n const stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList (imageIdIndex) {\n const index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) { // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort((a, b) => (a - b));\n const indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n const imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n const imagePromise = external.cornerstone.imageCache.getImagePromise(imageId);\n\n if (imagePromise && imagePromise.state() === 'resolved') {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n requestPoolManager.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n const nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n let imageId;\n let nextImageIdIndex;\n const preventCache = false;\n\n function doneCallback (image) {\n // Console.log('prefetch done: ' + image.imageId);\n const imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function failCallback (error) {\n console.log(`prefetch errored: ${error}`);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n let lowerIndex = nearest.low;\n let higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n const currentIndex = stack.currentImageIdIndex;\n const shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n const shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n const shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n const shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n requestPoolManager.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler (element) {\n return function (e) {\n const eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n let stackData;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = getToolState(element, 'stack');\n } catch(error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated (e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n const element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch(error) {\n return;\n }\n\n }, resetPrefetchDelay);\n}\n\nfunction enable (element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n const stackPrefetchDataArray = getToolState(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n const stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n const indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n addToolState(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener('cornerstonenewimage', onImageUpdated);\n element.addEventListener('cornerstonenewimage', onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n external.cornerstone.events.addEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n}\n\nfunction disable (element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener('cornerstonenewimage', onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler);\n\n const stackPrefetchData = getToolState(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n requestPoolManager.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n setMaxSimultaneousRequests(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nconst stackPrefetch = {\n enable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nexport default stackPrefetch;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackPrefetch.js","import displayTool from '../imageTools/displayTool.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nconst scrollBarHeight = 6;\n\nconst configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered (e, eventData) {\n const element = eventData.element;\n const width = eventData.enabledElement.canvas.width;\n const height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n const context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n const config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const imageIds = stackData.data[0].imageIds;\n const currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n const cursorWidth = width / imageIds.length;\n const cursorHeight = height / imageIds.length;\n const xPosition = cursorWidth * currentImageIdIndex;\n const yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nconst scrollIndicator = displayTool(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexport default scrollIndicator;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/scrollIndicator.js","import FusionRenderer from './fusionRenderer.js';\n\nconst stackRenderers = {};\n\nstackRenderers.FusionRenderer = FusionRenderer;\n\nexport default stackRenderers;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackRenderers.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default class FusionRenderer {\n constructor () {\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n render (element, imageStacks) {\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n const toolData = getToolState(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n const cornerstone = external.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n const baseImageObject = imageStacks[0];\n const currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n const overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then((baseImage) => {\n let baseLayerId = this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach((imgObj, overlayLayerIndex) => {\n const imageId = this.findImageFn(imgObj.imageIds, currentImageId);\n const layerIndex = overlayLayerIndex + 1;\n let currentLayerId = this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then((image) => {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/fusionRenderer.js","/* eslint no-bitwise:0 */\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nconst toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\nfunction getPlayClipTimeouts (vector, speed) {\n\n let i;\n let sample;\n let delay;\n let sum = 0;\n const limit = vector.length;\n const timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = (Number(vector[i]) / speed) | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) { // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = (sum / timeouts.length) | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData (playClipData) {\n const id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent (element) {\n const eventDetail = {\n element\n };\n\n triggerEvent(element, 'CornerstoneToolsClipStopped', eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n let playClipData;\n let playClipTimeouts;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n const stackToolData = getToolState(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (stackToolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = stackToolData.data[0];\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (\n playClipData.ignoreFrameTimeVector !== true &&\n playClipData.frameTimeVector &&\n playClipData.frameTimeVector.length === stackData.imageIds.length\n ) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n const playClipAction = () => {\n\n // Hoisting of context variables\n let loader,\n startLoadingHandler,\n endLoadingHandler,\n errorLoadingHandler,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n const imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n\n }\n\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler () {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n\n}\n\nexport {\n playClip,\n stopClip\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/playClip.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet mouseX;\nlet mouseY;\n\nfunction keyPress (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n const keyPressData = {\n event: window.event || e, // Old IE support\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n const keyPressEvents = {\n keydown: 'CornerstoneToolsKeyDown',\n keypress: 'CornerstoneToolsKeyPress',\n keyup: 'CornerstoneToolsKeyUp'\n\n };\n\n triggerEvent(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove (e) {\n mouseX = e.pageX || e.originalEvent.pageX;\n mouseY = e.pageY || e.originalEvent.pageY;\n}\n\nconst keyboardEvent = 'keydown keypress keyup';\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n external.$(element).on(keyboardEvent, keyPress);\n external.$(element).on('mousemove', mouseMove);\n}\n\nfunction disable (element) {\n external.$(element).off(keyboardEvent, keyPress);\n external.$(element).off('mousemove', mouseMove);\n}\n\n// Module exports\nconst keyboardInput = {\n enable,\n disable\n};\n\nexport default keyboardInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/keyboardInput.js","import external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet isClickEvent = true;\nlet preventClickTimeout;\nconst clickDelay = 200;\n\nfunction getEventWhich (event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler () {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = 'CornerstoneToolsMouseDoubleClick';\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n const lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n}\n\nfunction mouseDown (e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = 'CornerstoneToolsMouseDown';\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n external.$(element).off('mousemove', mouseMove);\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n const eventPropagated = triggerEvent(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = 'CornerstoneToolsMouseDownActivate';\n triggerEvent(eventData.element, 'CornerstoneToolsMouseDownActivate', eventData);\n }\n\n const whichMouseButton = getEventWhich(e);\n\n function onMouseMove (e) {\n // Calculate our current points in page and image coordinates\n const eventType = 'CornerstoneToolsMouseDrag';\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n\n // Prevent left click selection of DOM elements\n return pauseEvent(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp (e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n let eventType = 'CornerstoneToolsMouseUp';\n\n if (isClickEvent) {\n eventType = 'CornerstoneToolsMouseClick';\n }\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n external.$(document).off('mousemove', onMouseMove);\n external.$(document).off('mouseup', onMouseUp);\n\n external.$(eventData.element).on('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n external.$(document).on('mousemove', onMouseMove);\n external.$(document).on('mouseup', onMouseUp);\n\n return pauseEvent(e);\n}\n\nfunction mouseMove (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = 'CornerstoneToolsMouseMove';\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n\n const whichMouseButton = getEventWhich(e);\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n}\n\nfunction disable (element) {\n external.$(element).off('mousedown', mouseDown);\n external.$(element).off('mousemove', mouseMove);\n external.$(element).off('dblclick', mouseDoubleClick);\n}\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n external.$(element).on('mousedown', mouseDown);\n external.$(element).on('mousemove', mouseMove);\n external.$(element).on('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nconst mouseInput = {\n enable,\n disable\n};\n\nexport default mouseInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseInput.js","import external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction mouseWheel (e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n let x;\n let y;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else if (e.originalEvent &&\n e.originalEvent.pageX !== undefined &&\n e.originalEvent.pageY !== undefined) {\n x = e.originalEvent.pageX;\n y = e.originalEvent.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n const startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = (window.event && window.event.wheelDelta) ? window.event : e; // Old IE support\n\n let wheelDelta;\n\n if (e.originalEvent && e.originalEvent.wheelDelta) {\n wheelDelta = -e.originalEvent.wheelDelta;\n } else if (e.originalEvent && e.originalEvent.deltaY) {\n wheelDelta = -e.originalEvent.deltaY;\n } else if (e.originalEvent && e.originalEvent.detail) {\n wheelDelta = -e.originalEvent.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n const direction = wheelDelta < 0 ? -1 : 1;\n\n const mouseWheelData = {\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n triggerEvent(element, 'CornerstoneToolsMouseWheel', mouseWheelData);\n}\n\nconst mouseWheelEvents = 'mousewheel DOMMouseScroll';\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n external.$(element).on(mouseWheelEvents, mouseWheel);\n}\n\nfunction disable (element) {\n external.$(element).unbind(mouseWheelEvents, mouseWheel);\n}\n\n// Module exports\nconst mouseWheelInput = {\n enable,\n disable\n};\n\nexport default mouseWheelInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseWheelInput.js","import external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport preventGhostClick from '../inputSources/preventGhostClick.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet startPoints,\n currentPoints,\n lastPoints,\n deltaPoints,\n eventData,\n touchStartDelay,\n pressTimeout,\n pageDistanceMoved;\n\nlet lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta;\n\nconst pressDelay = 700,\n pressMaxDistance = 5;\n\nfunction onTouch (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget || e.srcEvent.currentTarget;\n let eventType,\n scaleChange,\n delta,\n remainingPointers,\n rotation;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if ((e.pointers && e.pointers.length > 1) ||\n (e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 1)) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = 'CornerstoneToolsTap';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = 'CornerstoneToolsDoubleTap';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchPinch';\n eventData = {\n event: e,\n startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY),\n client: {\n x: e.originalEvent.touches[0].clientX,\n y: e.originalEvent.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchStart';\n if (e.originalEvent.touches.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchStart';\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n const eventPropagated = triggerEvent(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = 'CornerstoneToolsTouchStartActive';\n if (e.originalEvent.touches.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchStartActive';\n }\n\n eventData.type = eventType;\n triggerEvent(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = copyPoints(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY),\n client: {\n x: e.originalEvent.touches[0].clientX,\n y: e.originalEvent.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchPress';\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.originalEvent.changedTouches[0].pageX, e.originalEvent.changedTouches[0].pageY),\n client: {\n x: e.originalEvent.changedTouches[0].clientX,\n y: e.originalEvent.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = 'CornerstoneToolsTouchEnd';\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = 'CornerstoneToolsTouchDrag';\n if (e.pointers.length > 1) {\n eventType = 'CornerstoneToolsMultiTouchDrag';\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = 'CornerstoneToolsDragEnd';\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return pauseEvent(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = 'CornerstoneToolsTouchRotate';\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n rotation,\n type: eventType\n };\n triggerEvent(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable (element) {\n disable(element);\n const Hammer = external.Hammer;\n\n const hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n const mc = new Hammer.Manager(element, hammerOptions);\n\n const panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n const pan = new Hammer.Pan(panOptions);\n const pinch = new Hammer.Pinch({\n threshold: 0\n });\n const rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n // We want to detect both the same time\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n const doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n preventGhostClick.enable(element);\n external.$(element).on('touchstart touchend', onTouch);\n external.$(element).data('hammer', mc);\n}\n\nfunction disable (element) {\n preventGhostClick.disable(element);\n external.$(element).off('touchstart touchend', onTouch);\n const mc = external.$(element).data('hammer');\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nconst touchInput = {\n enable,\n disable\n};\n\nexport default touchInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/touchInput.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = angle.getConfiguration();\n const cornerstone = external.cornerstone;\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n let handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n let handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n drawHandles(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n const dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n const dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n const dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n const dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n let angle = Math.acos(Math.abs(((dx1 * dx2) + (dy1 * dy2)) / (Math.sqrt((dx1 * dx1) + (dy1 * dy1)) * Math.sqrt((dx2 * dx2) + (dy2 * dy2)))));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n const textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n const textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n drawTextBox(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst angle = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst angleTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n angle,\n angleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/angleTool.js","/* eslint no-alert:0 */\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawArrow from '../util/drawArrow.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const measurementData = createNewMeasurement(mouseEventData);\n const cornerstone = external.cornerstone;\n\n const eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(mouseEventData.element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(mouseEventData.element);\n\n external.$(mouseEventData.element).on('CornerstoneToolsMouseMove', eventData, arrowAnnotate.mouseMoveCallback);\n external.$(mouseEventData.element).on('CornerstoneToolsMouseDown', eventData, arrowAnnotate.mouseDownCallback);\n external.$(mouseEventData.element).on('CornerstoneToolsMouseDownActivate', eventData, arrowAnnotate.mouseDownActivateCallback);\n external.$(mouseEventData.element).on('CornerstoneToolsMouseDoubleClick', eventData, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(mouseEventData.element).off('CornerstoneToolsMouseMove', arrowAnnotate.mouseMoveCallback);\n external.$(mouseEventData.element).off('CornerstoneToolsMouseDown', arrowAnnotate.mouseDownCallback);\n external.$(mouseEventData.element).off('CornerstoneToolsMouseDownActivate', arrowAnnotate.mouseDownActivateCallback);\n external.$(mouseEventData.element).off('CornerstoneToolsMouseDoubleClick', arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(mouseEventData.element);\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(mouseEventData.element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const enabledElement = eventData.enabledElement;\n const cornerstone = external.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = arrowAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the arrow\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n drawArrow(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n drawArrow(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(data.text).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const element = touchEventData.element;\n const measurementData = createNewMeasurement(touchEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n }\n\n addToolState(element, toolType, measurementData);\n external.$(element).off('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback (e, eventData) {\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback (e, eventData) {\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n external.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst arrowAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nconst arrowAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport { arrowAnnotate, arrowAnnotateTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/arrowAnnotate.js","import external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState, clearToolState } from '../stateManagement/toolState.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { imagePointToPatientPoint } from '../util/pointProjector.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nconst toolType = 'crosshairs';\n\nfunction chooseLocation (e, eventData) {\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n const cornerstone = external.cornerstone;\n const sourceElement = e.currentTarget;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n const sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n const patientPoint = imagePointToPatientPoint(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n const stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const row = convertToVector3(imagePlane.rowCosines);\n const column = convertToVector3(imagePlane.columnCosines);\n const normal = column.clone().cross(row.clone());\n const distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n chooseLocation(e, eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction mouseDragCallback (e, eventData) {\n chooseLocation(e, eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction enable (element, mouseButtonMask, synchronizationContext) {\n const eventData = {\n mouseButtonMask\n };\n\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n}\n\n// Module/private exports\nconst crosshairs = {\n activate: enable,\n deactivate: disable,\n enable,\n disable\n};\n\nfunction dragEndCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsTouchDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback);\n}\n\nfunction dragStartCallback (e, eventData) {\n external.$(eventData.element).on('CornerstoneToolsTouchDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback);\n chooseLocation(e, eventData);\n\n return false;\n}\n\nfunction dragCallback (e, eventData) {\n chooseLocation(e, eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction enableTouch (element, synchronizationContext) {\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n external.$(element).off('CornerstoneToolsTouchStart', dragStartCallback);\n\n external.$(element).on('CornerstoneToolsTouchStart', dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch (element) {\n external.$(element).off('CornerstoneToolsTouchStart', dragStartCallback);\n}\n\nconst crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexport {\n crosshairs,\n crosshairsTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/crosshairs.js","import external from '../externalModules.js';\nimport doubleTapTool from './doubleTapTool.js';\n\nfunction fitToWindowStrategy (eventData) {\n external.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback (e, eventData) {\n doubleTapZoom.strategy(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst doubleTapZoom = doubleTapTool(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexport default doubleTapZoom;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapZoom.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nlet dragEventData;\n\nfunction defaultStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const x = Math.round(eventData.currentPoints.image.x);\n const y = Math.round(eventData.currentPoints.image.y);\n\n let storedPixels;\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n text = `${x}, ${y}`;\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]} A: ${storedPixels[3]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n // Draw text\n const coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n let toolCoords;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() / 2);\n }\n\n let storedPixels;\n let text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 ||\n toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = getRGBPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n text = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n\n const modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += `HU: ${modalityPixelValueText}`;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n const suv = calculateSUV(eventData.image, sp);\n\n if (suv) {\n text += ` SUV: ${parseFloat(suv.toFixed(2))}`;\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n const textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n let translation;\n const handleRadius = 6;\n const width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -textStyle.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(textStyle.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n drawTextBox(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback (e, eventData) {\n const element = eventData.element;\n\n element.removeEventListener('cornerstoneimagerendered', imageRenderedCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e, eventData) {\n const element = eventData.element;\n\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n element.addEventListener('cornerstoneimagerendered', imageRenderedCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n dragProbe.strategy(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction imageRenderedCallback () {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback (e, eventData) {\n const element = eventData.element;\n\n dragEventData = eventData;\n external.cornerstone.updateImage(element);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst dragProbe = simpleMouseButtonTool(mouseDownCallback);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nconst options = {\n fireOnTouchStart: true\n};\n\nconst dragProbeTouch = touchDragTool(dragCallback, options);\n\nexport {\n dragProbe,\n dragProbeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/dragProbe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport drawEllipse from '../util/drawEllipse.js';\nimport pointInEllipse from '../util/pointInEllipse.js';\nimport calculateEllipseStatistics from '../util/calculateEllipseStatistics.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse (element, data, coords, distance) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n const majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n const pointInMinorEllipse = pointInEllipse(minorEllipse, coords);\n const pointInMajorEllipse = pointInEllipse(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool (element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch (element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = ellipticalRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n drawEllipse(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateEllipseStatistics(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst ellipticalRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst ellipticalRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType\n});\n\nexport { ellipticalRoi, ellipticalRoiTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/ellipticalRoi.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'freehand';\nlet configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n const data = toolData.data[config.currentTool];\n\n const handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle (eventData, toolIndex) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n const mousePoint = eventData.currentPoints.canvas;\n\n for (let i = 0; i < data.handles.length; i++) {\n const handleCanvas = external.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (external.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n let handleNearby;\n\n for (let toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby,\n toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n\n // Check if drawing is finished\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback (e, eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n let x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n let y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n const currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n const lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n const lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n const handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < (data.handles.length - 1)) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing (eventData) {\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n\n const measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n const config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n addToolState(eventData.element, toolType, measurementData);\n\n const toolData = getToolState(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing (eventData, handleNearby) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n const toolData = getToolState(eventData.element, toolType);\n\n let handleNearby, toolIndex;\n\n const config = freehand.getConfiguration();\n const currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n const nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n let fillColor = toolColors.getFillColor();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n fillColor = toolColors.getFillColor();\n } else {\n color = toolColors.getToolColor();\n fillColor = toolColors.getToolColor();\n }\n\n let handleStart;\n\n if (data.handles.length) {\n for (let j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (let k = 0; k < data.handles[j].lines.length; k++) {\n const lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n const mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === (data.handles.length - 1)) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n const options = {\n fill: fillColor\n };\n\n if (data.active) {\n drawHandles(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n drawHandles(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\nfunction enable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n external.$(element).off('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module/private exports\nconst freehand = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration\n};\n\nexport { freehand };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/freehand.js","import external from '../externalModules.js';\nimport mouseButtonRectangleTool from './mouseButtonRectangleTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n const existingToolData = getToolState(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n let insideBox = false;\n\n if ((coords.x >= rect.left && coords.x <= (rect.left + rect.width)) && coords.y >= rect.top && coords.y <= (rect.top + rect.height)) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this elemen\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n\n context.save();\n\n const data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n drawHandles(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst preventHandleOutsideImage = true;\n\nconst highlight = mouseButtonRectangleTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nconst highlightTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nexport {\n highlight,\n highlightTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/highlight.js","import displayTool from './displayTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction onImageRendered (e, eventData) {\n const image = eventData.image;\n const stats = image.stats;\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n const text = `${key} : ${stats[key]}`;\n\n textLines.push(text);\n });\n\n drawTextBox(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nconst imageStats = displayTool(onImageRendered);\n\nexport default imageStats;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/imageStats.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n const { image, element } = eventData;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = length.getConfiguration();\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n let rowPixelSpacing;\n let colPixelSpacing;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n const color = toolColors.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n const dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n const dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n const length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n let suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n const text = `${length.toFixed(2)}${suffix}`;\n\n if (!data.handles.textBox.hasMoved) {\n const coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst length = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst lengthTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n length,\n lengthTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/length.js","import external from '../externalModules.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getBrowserInfo } from '../util/getMaxSimultaneousRequests.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nlet configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nlet browserName;\n\nlet currentPoints;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback (e, eventData) {\n const element = eventData.element;\n\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool (eventData) {\n external.$(eventData.element).find('.magnifyTool').hide();\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback (e, eventData) {\n const element = eventData.element;\n\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(element).on('CornerstoneToolsMouseDrag', eventData, dragCallback);\n external.$(element).on('CornerstoneToolsMouseUp', eventData, mouseUpCallback);\n external.$(element).on('CornerstoneToolsMouseClick', eventData, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener('cornerstonenewimage', newImageCallback);\n drawMagnificationTool(eventData);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction newImageCallback (e) {\n const eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback (e, eventData) {\n const element = eventData.element;\n\n external.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback);\n external.$(eventData.element).off('CornerstoneToolsTouchEnd', dragEndCallback);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback (e, eventData) {\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n external.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback);\n external.$(eventData.element).on('CornerstoneToolsTouchEnd', dragEndCallback);\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool (eventData) {\n const magnifyCanvas = external.$(eventData.element).find('.magnifyTool').get(0);\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n const config = magnify.getConfiguration();\n\n const magnifySize = config.magnifySize;\n const magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n const canvas = external.$(eventData.element).find('canvas').not('.magnifyTool').get(0);\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n const getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n const canvasLocation = external.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n const copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n const scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = `${canvasLocation.y - 0.5 * magnifySize}px`;\n magnifyCanvas.style.left = `${canvasLocation.x - 0.5 * magnifySize}px`;\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas (element) {\n // If the magnifying glass canvas doesn't already exist\n if (external.$(element).find('.magnifyTool').length === 0) {\n // Create a canvas and append it as a child to the element\n const magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n const config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas (element) {\n external.$(element).find('.magnifyTool').remove();\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable (element) {\n if (!browserName) {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst magnify = {\n enable,\n activate,\n deactivate: disable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nconst options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nconst magnifyTouchDrag = touchDragTool(dragCallback, options);\n\nexport {\n magnify,\n magnifyTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/magnify.js","import external from '../externalModules.js';\nimport orientation from '../orientation/index.js';\nimport displayTool from './displayTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction getOrientationMarkers (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n const imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n const rowString = orientation.getOrientationString(imagePlaneMetaData.rowCosines);\n const columnString = orientation.getOrientationString(imagePlaneMetaData.columnCosines);\n\n const oppositeRowString = orientation.invertOrientationString(rowString);\n const oppositeColumnString = orientation.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n let coords;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n const top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n const bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n const left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n const right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top,\n bottom,\n left,\n right\n };\n}\n\nfunction onImageRendered (e, eventData) {\n const element = eventData.element;\n\n const markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n const coords = getOrientationMarkerPositions(element, markers);\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getToolColor();\n\n const textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n drawTextBox(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n drawTextBox(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n const config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n drawTextBox(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n drawTextBox(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst orientationMarkers = displayTool(onImageRendered);\n\nexport default orientationMarkers;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/orientationMarkers.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback (e, eventData) {\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n let widthScale = eventData.viewport.scale;\n let heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= (eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing);\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= (eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing);\n }\n\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / widthScale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / heightScale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst pan = simpleMouseButtonTool(mouseDownCallback);\nconst panTouchDrag = touchDragTool(dragCallback);\n\nexport {\n pan,\n panTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/pan.js","import external from '../externalModules.js';\nimport multiTouchDragTool from './multiTouchDragTool.js';\n\nfunction touchPanCallback (e, eventData) {\n const config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 2);\n }\n};\n\nconst panMultiTouch = multiTouchDragTool(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexport default panMultiTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/panMultiTouch.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n const endCanvas = external.cornerstone.pixelToCanvas(element, data.handles.end);\n\n\n return external.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n\n for (let i = 0; i < toolData.data.length; i++) {\n\n context.save();\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the handles\n drawHandles(context, eventData, data.handles, color);\n\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n let storedPixels;\n\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = `${x}, ${y}`;\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probe = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst probeTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n probe,\n probeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/probe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = rectangleRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = (ellipse.width * columnPixelSpacing) * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst rectangleRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst rectangleRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n rectangleRoi,\n rectangleRoiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rectangleRoi.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\n// --- Strategies --- //\nfunction defaultStrategy (eventData) {\n // Calculate distance from the center of the image\n const rect = eventData.element.getBoundingClientRect(eventData.element);\n\n const points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n const width = eventData.element.clientWidth;\n const height = eventData.element.clientHeight;\n\n const pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n const rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n const rotationDegrees = rotationRadians * (180 / Math.PI);\n const rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback (e, eventData) {\n rotate.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst rotate = simpleMouseButtonTool(mouseDownCallback);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nconst rotateTouchDrag = touchDragTool(dragCallback);\n\nexport {\n rotate,\n rotateTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotate.js","import external from '../externalModules.js';\n\nfunction touchRotateCallback (e, eventData) {\n eventData.viewport.rotation += eventData.rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback);\n}\n\nfunction activate (element) {\n external.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback);\n external.$(element).on('CornerstoneToolsTouchRotate', touchRotateCallback);\n}\n\nconst rotateTouch = {\n activate,\n disable\n};\n\nexport default rotateTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotateTouch.js","import external from '../externalModules.js';\n\nexport default function (element, filename, mimetype) {\n // Setting the default value for mimetype to image/png\n mimetype = mimetype || 'image/png';\n const canvas = external.$(element).find('canvas').get(0);\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n const lnk = document.createElement('a');\n\n // / the key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // / convert canvas content to data-uri for link. When download\n // / attribute is set the content pointed to by link will be\n // / pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n\n const e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n\n } else if (lnk.fireEvent) {\n\n lnk.fireEvent('onclick');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/saveAs.js","/* eslint no-alert:0 */\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawCircle from '../util/drawCircle.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n const realCoords = external.cornerstone.pixelToCanvas(element, data.handles.end);\n const distanceToPoint = external.cornerstoneMath.point.distance(realCoords, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n const canvasWidth = eventData.canvasContext.canvas.width;\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = seedAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw\n const handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n drawCircle(context, handleCanvas, color, lineWidth);\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n let textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = `${data.text} x: ${Math.round(data.handles.end.x)\n } y: ${Math.round(data.handles.end.y)}`;\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(textPlusCoords).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > (canvasWidth / 2)) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n const boundingBoxPoints = [\n {\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction pressCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return false;\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n external.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst seedAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nconst seedAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport {\n seedAnnotate,\n seedAnnotateTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/seedAnnotate.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport touchTool from './touchTool.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\n\nconst toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 25);\n}\n\nfunction length (vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = simpleAngle.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n const columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n const rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n let suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n const sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n const sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideALength = length(sideA);\n const sideBLength = length(sideB);\n const sideCLength = length(sideC);\n\n // Cosine law\n let angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n\n if (rAngle) {\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n const distance = 15;\n\n let textCoords;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n const textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(mouseEventData);\n const element = mouseEventData.element;\n\n const eventData = {\n mouseButtonMask: mouseEventData.which\n };\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(element).off('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', simpleAngle.mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n\n external.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n external.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(touchEventData);\n const element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n external.$(element).off('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n external.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n external.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n external.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback);\n external.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback);\n });\n });\n}\n\nconst simpleAngle = mouseButtonTool({\n createNewMeasurement,\n addNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst simpleAngleTouch = touchTool({\n createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n simpleAngle,\n simpleAngleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleAngle.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport { removeToolState, getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n const imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!external.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n let currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n const insideBoundingBox = pointInsideBoundingBox(data.handles.end, coords);\n\n\n return (distanceToPoint < 10) || insideBoundingBox;\n}\n\nfunction onImageRendered (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const config = textMarker.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n let color = toolColors.getToolColor();\n\n if (data.active) {\n color = toolColors.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n const measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n const textCoords = external.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n data.handles.end.boundingBox = boundingBox;\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n const mouseButtonData = {\n mouseButtonMask: e.data.mouseButtonMask\n };\n\n external.$(element).on('CornerstoneToolsMouseMove', mouseButtonData, textMarker.mouseMoveCallback);\n external.$(element).on('CornerstoneToolsMouseDown', mouseButtonData, textMarker.mouseDownCallback);\n external.$(element).on('CornerstoneToolsMouseDownActivate', mouseButtonData, textMarker.mouseDownActivateCallback);\n external.$(element).on('CornerstoneToolsMouseDoubleClick', mouseButtonData, textMarker.mouseDoubleClickCallback);\n }\n\n if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n return;\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsMouseMove', textMarker.mouseMoveCallback);\n external.$(element).off('CornerstoneToolsMouseDown', textMarker.mouseDownCallback);\n external.$(element).off('CornerstoneToolsMouseDownActivate', textMarker.mouseDownActivateCallback);\n external.$(element).off('CornerstoneToolsMouseDoubleClick', textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchPressCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n external.$(element).on('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n external.$(element).on('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n external.$(element).on('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n external.$(element).on('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n external.$(element).on('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n external.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n external.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback);\n external.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback);\n external.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback);\n external.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback);\n external.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nconst textMarker = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nconst textMarkerTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback: touchPressCallback\n});\n\nexport {\n textMarker,\n textMarkerTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/textMarker.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction defaultStrategy (eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n const maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n const minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n\n const deltaX = eventData.deltaPoints.page.x * multiplier;\n const deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += (deltaX);\n eventData.viewport.voi.windowCenter += (deltaY);\n}\n\nfunction mouseDragCallback (e, eventData) {\n wwwc.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchDragCallback (e, eventData) {\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n const dragData = eventData;\n\n const maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n const minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n const deltaX = dragData.deltaPoints.page.x * multiplier;\n const deltaY = dragData.deltaPoints.page.y * multiplier;\n\n const config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n } else {\n dragData.viewport.voi.windowWidth += (deltaY);\n dragData.viewport.voi.windowCenter += (deltaX);\n }\n } else {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n }\n\n external.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nconst wwwc = simpleMouseButtonTool(mouseDownCallback);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nconst wwwcTouchDrag = touchDragTool(touchDragCallback);\n\nexport {\n wwwc,\n wwwcTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwc.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport getLuminance from '../util/getLuminance.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\n\nconst toolType = 'wwwcRegion';\n\nlet configuration = {\n minWindowWidth: 10\n};\n\nlet currentMouseButtonMask;\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) {\n const numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n let min = globalMax;\n let max = globalMin;\n let sum = 0;\n\n for (let index = 0; index < numPixels; index++) {\n const spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min,\n max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback (e) {\n const eventData = e.detail;\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n external.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n\n external.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n const mouseData = {\n mouseButtonMask: currentMouseButtonMask\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n\n external.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n const mouseData = {\n mouseButtonMask: currentMouseButtonMask\n };\n\n external.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback);\n\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion (eventData) {\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n let width = Math.abs(startPoint.x - endPoint.x);\n let height = Math.abs(startPoint.y - endPoint.y);\n\n let left = Math.min(startPoint.x, endPoint.x);\n let top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n const pixelLuminanceData = getLuminance(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n const minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n const config = wwwcRegion.getConfiguration();\n const viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement (e, eventData) {\n const element = eventData.element;\n\n external.$(element).off('CornerstoneToolsMouseMove');\n external.$(element).off('CornerstoneToolsMouseDrag');\n\n external.$(element).on('CornerstoneToolsMouseMove', dragCallback);\n external.$(element).on('CornerstoneToolsMouseDrag', dragCallback);\n\n external.$(element).on('CornerstoneToolsMouseClick', dragEndCallback);\n if (e.type === 'CornerstoneToolsMouseDrag') {\n external.$(element).on('CornerstoneToolsMouseUp', dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', eventData, whichMovement);\n external.$(eventData.element).on('CornerstoneToolsMouseMove', eventData, whichMovement);\n\n external.$(eventData.element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n const measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n addToolState(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback (e, eventData) {\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n const endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n toolData.data[0].endPoint = endPoint;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n // Get the current element's canvas\n const canvas = external.$(eventData.element).find('canvas').get(0);\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n const color = toolColors.getActiveColor();\n\n // Calculate the rectangle parameters\n const startPointCanvas = cornerstone.pixelToCanvas(eventData.element, startPoint);\n const endPointCanvas = cornerstone.pixelToCanvas(eventData.element, endPoint);\n\n const left = Math.min(startPointCanvas.x, endPointCanvas.x);\n const top = Math.min(startPointCanvas.y, endPointCanvas.y);\n const width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n const height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable (element) {\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseMove', dragCallback);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n const eventData = {\n mouseButtonMask\n };\n\n currentMouseButtonMask = mouseButtonMask;\n\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback);\n\n external.$(element).off('CornerstoneToolsMouseUp', dragEndCallback);\n external.$(element).off('CornerstoneToolsMouseClick', dragEndCallback);\n\n external.$(element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(element).off('CornerstoneToolsMouseMove', dragCallback);\n\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n element.removeEventListener('cornerstonenewimage', newImageCallback);\n\n external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener('cornerstonenewimage', newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag (element) {\n external.$(element).off('CornerstoneToolsTouchDrag', dragCallback);\n external.$(element).off('CornerstoneToolsTouchStart', recordStartPoint);\n external.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n}\n\nfunction activateTouchDrag (element) {\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n external.$(element).off('CornerstoneToolsTouchDrag', dragCallback);\n external.$(element).off('CornerstoneToolsTouchStart', recordStartPoint);\n external.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.removeEventListener('cornerstoneimagerendered', onImageRendered);\n\n external.$(element).on('CornerstoneToolsTouchDrag', dragCallback);\n external.$(element).on('CornerstoneToolsTouchStart', recordStartPoint);\n external.$(element).on('CornerstoneToolsDragEnd', applyWWWCRegion);\n element.addEventListener('cornerstoneimagerendered', onImageRendered);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst wwwcRegion = {\n activate,\n deactivate: disable,\n disable,\n setConfiguration,\n getConfiguration\n};\n\nconst wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexport {\n wwwcRegion,\n wwwcRegionTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwcRegion.js","import external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport mouseWheelTool from './mouseWheelTool.js';\nimport touchPinchTool from './touchPinchTool.js';\nimport touchDragTool from './touchDragTool.js';\n\n\nlet startPoints;\n\nfunction changeViewportScale (viewport, ticks) {\n const config = zoom.getConfiguration();\n const pow = 1.7;\n\n const oldFactor = Math.log(viewport.scale) / Math.log(pow);\n const factor = oldFactor + ticks;\n\n const scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition (position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift (shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n const angle = viewport.rotation * Math.PI / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy (eventData, ticks) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy (eventData, ticks) {\n const element = eventData.element;\n const image = eventData.image;\n const config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n const shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n const translateSpeed = 8;\n const outwardsMinScaleToTranslate = 3;\n const minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n let desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n const distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy (eventData, ticks) {\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback (e, eventData) {\n external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback);\n}\n\nfunction mouseDownCallback (e, eventData) {\n if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback);\n external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n}\n\nfunction dragCallback (e, eventData) {\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n const ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n return false; // False = causes jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback (e, eventData) {\n let ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n const config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback (e, eventData) {\n const cornerstone = external.cornerstone;\n const config = zoom.getConfiguration();\n const viewport = eventData.viewport;\n const element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nconst zoom = simpleMouseButtonTool(mouseDownCallback);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nconst zoomWheel = mouseWheelTool(mouseWheelCallback);\nconst zoomTouchPinch = touchPinchTool(touchPinchCallback);\nconst zoomTouchDrag = touchDragTool(dragCallback);\n\nexport {\n zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/zoom.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'brush';\nconst configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet dragging = false;\n\nfunction paint (eventData) {\n const configuration = brush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown (e, eventData) {\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e, eventData) {\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e, eventData) {\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = brush.getConfiguration();\n const radius = configuration.radius;\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst brush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexport { brush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brush.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'adaptiveBrush';\nconst configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet thrMax;\nlet thrMin;\nlet currentRadius;\nlet dragging;\n\nfunction getGreyValues (pointerArray, pixelData, imageColumns) {\n const configuration = adaptiveBrush.getConfiguration();\n const tolerance = configuration.tolerance;\n let minValue = Number.MAX_VALUE;\n let maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach((point) => {\n const pixelIndex = point[1] * imageColumns + point[0];\n const greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush (imagePixelData, brushPixelData, rows, columns) {\n const configuration = adaptiveBrush.getConfiguration();\n const brushPixelValue = configuration.draw;\n const mouseX = Math.round(lastImageCoords.x);\n const mouseY = Math.round(lastImageCoords.y);\n let numPixelsOutsideThresholdWindow = null;\n let pointerArray = [];\n let radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = getCircle(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (let j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n const xCoord = pointerArray[j][0];\n const yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n const pixelIndex = yCoord * columns + xCoord;\n const pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n drawBrushPixels(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { rows, columns } = layer.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction erase (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n const configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown (e, eventData) {\n const element = eventData.element;\n const configuration = adaptiveBrush.getConfiguration();\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { x, y } = eventData.currentPoints.image;\n const { rows, columns } = layer.image;\n const pointerArray = getCircle(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e, eventData) {\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e, eventData) {\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e, eventData) {\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = adaptiveBrush.getConfiguration();\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const pointerArray = getCircle(currentRadius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst adaptiveBrush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexport { adaptiveBrush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/adaptiveBrush.js","export default '1.1.2';\n\n\n\n// WEBPACK FOOTER //\n// ./version.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///cornerstoneTools.min.js","webpack:///webpack/bootstrap 98876e733ba90be3f4b0","webpack:///./externalModules.js","webpack:///./events.js","webpack:///./stateManagement/toolState.js","webpack:///./enabledElementTools.js","webpack:///./util/isMouseButtonEnabled.js","webpack:///./util/triggerEvent.js","webpack:///./stateManagement/toolColors.js","webpack:///./util/drawTextBox.js","webpack:///./stateManagement/toolStyle.js","webpack:///./imageTools/mouseButtonTool.js","webpack:///./manipulators/drawHandles.js","webpack:///./imageTools/touchTool.js","webpack:///./stateManagement/loadHandlerManager.js","webpack:///./imageTools/touchDragTool.js","webpack:///./stateManagement/textStyle.js","webpack:///./manipulators/anyHandlesOutsideImage.js","webpack:///./imageTools/simpleMouseButtonTool.js","webpack:///./util/convertToVector3.js","webpack:///./stateManagement/imageIdSpecificStateManager.js","webpack:///./util/pointInsideBoundingBox.js","webpack:///./util/calculateSUV.js","webpack:///./manipulators/getHandleNearImagePoint.js","webpack:///./util/getMaxSimultaneousRequests.js","webpack:///./imageTools/mouseWheelTool.js","webpack:///./manipulators/moveHandle.js","webpack:///./manipulators/moveNewHandle.js","webpack:///./imageTools/displayTool.js","webpack:///./manipulators/moveNewHandleTouch.js","webpack:///./util/pointProjector.js","webpack:///./requestPool/requestPoolManager.js","webpack:///./imageTools/multiTouchDragTool.js","webpack:///./util/scroll.js","webpack:///./util/roundToDecimal.js","webpack:///./util/pointInEllipse.js","webpack:///./util/pauseEvent.js","webpack:///./util/getRGBPixels.js","webpack:///./util/copyPoints.js","webpack:///./stateManagement/toolCoordinates.js","webpack:///./manipulators/handleActivator.js","webpack:///./manipulators/moveAllHandles.js","webpack:///./timeSeriesTools/incrementTimePoint.js","webpack:///./referenceLines/calculateReferenceLine.js","webpack:///./referenceLines/renderActiveReferenceLine.js","webpack:///./orientation/index.js","webpack:///./util/scrollToIndex.js","webpack:///./stackTools/stackScroll.js","webpack:///./util/getLuminance.js","webpack:///./util/drawEllipse.js","webpack:///./util/drawCircle.js","webpack:///./util/drawArrow.js","webpack:///./util/calculateEllipseStatistics.js","webpack:///./imageTools/keyboardTool.js","webpack:///./manipulators/touchMoveAllHandles.js","webpack:///./manipulators/touchMoveHandle.js","webpack:///./inputSources/preventGhostClick.js","webpack:///./imageTools/doubleTapTool.js","webpack:///./imageTools/mouseButtonRectangleTool.js","webpack:///./imageTools/touchPinchTool.js","webpack:///./paintingTools/brushTool.js","webpack:///./paintingTools/getCircle.js","webpack:///./paintingTools/drawBrush.js","webpack:///./index.js","webpack:///./referenceLines/index.js","webpack:///./referenceLines/referenceLinesTool.js","webpack:///./orientation/getOrientationString.js","webpack:///./orientation/invertOrientationString.js","webpack:///./util/setContextToDisplayFontSize.js","webpack:///./timeSeriesTools/probeTool4D.js","webpack:///./measurementManager/measurementManager.js","webpack:///./measurementManager/lineSampleMeasurement.js","webpack:///./timeSeriesTools/timeSeriesPlayer.js","webpack:///./timeSeriesTools/timeSeriesScroll.js","webpack:///./synchronization/wwwcSynchronizer.js","webpack:///./synchronization/updateImageSynchronizer.js","webpack:///./synchronization/Synchronizer.js","webpack:///./synchronization/stackScrollSynchronizer.js","webpack:///./synchronization/stackImagePositionSynchronizer.js","webpack:///./synchronization/stackImagePositionOffsetSynchronizer.js","webpack:///./synchronization/stackImageIndexSynchronizer.js","webpack:///./synchronization/panZoomSynchronizer.js","webpack:///./stateManagement/timeSeriesSpecificStateManager.js","webpack:///./stateManagement/stackSpecificStateManager.js","webpack:///./stateManagement/frameOfReferenceStateManager.js","webpack:///./stateManagement/appState.js","webpack:///./stackTools/stackScrollKeyboard.js","webpack:///./stackTools/stackPrefetch.js","webpack:///./stackTools/scrollIndicator.js","webpack:///./stackTools/stackRenderers.js","webpack:///./stackTools/fusionRenderer.js","webpack:///./stackTools/playClip.js","webpack:///./inputSources/keyboardInput.js","webpack:///./inputSources/mouseInput.js","webpack:///./inputSources/mouseWheelInput.js","webpack:///./inputSources/touchInput.js","webpack:///./imageTools/angleTool.js","webpack:///./imageTools/arrowAnnotate.js","webpack:///./imageTools/crosshairs.js","webpack:///./imageTools/doubleTapZoom.js","webpack:///./imageTools/dragProbe.js","webpack:///./imageTools/ellipticalRoi.js","webpack:///./imageTools/freehand.js","webpack:///./imageTools/highlight.js","webpack:///./imageTools/imageStats.js","webpack:///./imageTools/length.js","webpack:///./imageTools/magnify.js","webpack:///./imageTools/orientationMarkers.js","webpack:///./imageTools/pan.js","webpack:///./imageTools/panMultiTouch.js","webpack:///./imageTools/probe.js","webpack:///./imageTools/rectangleRoi.js","webpack:///./imageTools/rotate.js","webpack:///./imageTools/rotateTouch.js","webpack:///./imageTools/saveAs.js","webpack:///./imageTools/seedAnnotate.js","webpack:///./imageTools/simpleAngle.js","webpack:///./imageTools/textMarker.js","webpack:///./imageTools/wwwc.js","webpack:///./imageTools/wwwcRegion.js","webpack:///./imageTools/zoom.js","webpack:///./paintingTools/brush.js","webpack:///./paintingTools/adaptiveBrush.js","webpack:///./version.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","value","cornerstone","window","cornerstoneMath","Hammer","default","cs","cm","EVENTS","IMAGE_RENDERED","NEW_IMAGE","IMAGE_CACHE_PROMISE_REMOVED","ELEMENT_DISABLED","MOUSE_DOWN","MOUSE_UP","MOUSE_DOWN_ACTIVATE","MOUSE_DRAG","MOUSE_MOVE","MOUSE_CLICK","MOUSE_DOUBLE_CLICK","MOUSE_WHEEL","TOUCH_START","TOUCH_START_ACTIVE","TOUCH_END","TOUCH_DRAG","TOUCH_DRAG_END","TOUCH_PINCH","TOUCH_ROTATE","TOUCH_PRESS","TAP","DOUBLE_TAP","MULTI_TOUCH_START","MULTI_TOUCH_START_ACTIVE","MULTI_TOUCH_DRAG","KEY_DOWN","KEY_UP","KEY_PRESS","MEASUREMENT_ADDED","MEASUREMENT_MODIFIED","MEASUREMENT_REMOVED","TOOL_DEACTIVATED","CLIP_STOPPED","STACK_SCROLL","LINE_SAMPLE_UPDATED","_interopRequireDefault","obj","getElementToolStateManager","element","enabledImage","_externalModules2","getEnabledElement","undefined","toolStateManager","_imageIdSpecificStateManager","globalImageIdSpecificToolStateManager","addToolState","toolType","measurementData","add","eventType","_events2","eventData","_triggerEvent2","getToolState","removeToolState","data","toolData","indexOfData","length","splice","clearToolState","setElementToolStateManager","_events","_externalModules","_triggerEvent","getToolOptions","elementToolOptions","toolOptions","optionsObject","find","toolOptionObject","options","setToolOptions","index","findIndex","push","which","mouseButtonMask","triggerEvent","el","type","detail","arguments","event","CustomEvent","cancelable","document","createEvent","initCustomEvent","dispatchEvent","setFillColor","color","fillColor","getFillColor","setToolColor","defaultColor","getToolColor","setActiveColor","activeColor","getActiveColor","getColorIfActive","active","toolColors","context","textLines","x","y","toString","font","_textStyle2","getFont","fontSize","getFontSize","backgroundColor","getBackgroundColor","save","textBaseline","strokeStyle","maxWidth","forEach","text","width","measureText","Math","max","fillStyle","boundingBox","padding","height","centering","left","top","debug","fillRect","fillText","restore","_textStyle","setToolWidth","defaultWidth","getToolWidth","setActiveWidth","activeWidth","getActiveWidth","toolStyle","mouseToolInterface","mouseDownActivateCallback","e","_enabledElementTools","_isMouseButtonEnabled2","addNewMeasurement","preventDefault","stopPropagation","mouseMoveCallback","_toolCoordinates2","setCoords","_toolState","imageNeedsUpdate","coords","currentPoints","canvas","_handleActivator2","handles","pointNearTool","updateImage","mouseDownCallback","handleDoneMove","invalidated","_anyHandlesOutsideImage2","addEventListener","mouseMove","startPoints","currentTarget","preventHandleOutsideImage","handle","_getHandleNearImagePoint2","removeEventListener","_moveHandle2","stopImmediatePropagation","opt","deleteIfHandleOutsideImage","_moveAllHandles2","mouseEventData","createNewMeasurement","mouseDown","mouseDownActivate","mouseDoubleClick","handleMover","keys","end","disable","onImageRendered","enable","activate","deactivate","statusChangeEventData","getConfiguration","configuration","setConfiguration","config","mouseDoubleClickCallback","toolInterface","_toolCoordinates","_getHandleNearImagePoint","_handleActivator","_moveHandle","_moveNewHandle","_moveNewHandle2","_moveAllHandles","_anyHandlesOutsideImage","_isMouseButtonEnabled","renderData","drawnIndependently","drawHandlesIfActive","beginPath","lineWidth","_toolStyle2","handleCanvasCoords","pixelToCanvas","arc","handleRadius","PI","fill","stroke","_toolStyle","deactivateAllHandles","deactivateAllToolInstances","touchTool","touchToolInterface","touchEventData","highlight","touchDownActivateCallback","tapCallback","touchStartCallback","_moveNewHandleTouch2","doneMovingCallback","_touchMoveHandle2","_touchMoveAllHandles2","lastEvent","lastEventData","pressCallback","doubleTapCallback","_touchMoveHandle","_moveNewHandleTouch","_touchMoveAllHandles","setStartLoadHandler","handler","defaultStartLoadHandler","getStartLoadHandler","setEndLoadHandler","defaultEndLoadHandler","getEndLoadHandler","setErrorLoadingHandler","defaultErrorLoadingHandler","getErrorLoadingHandler","loadHandlerManager","touchDragCallback","events","fireOnTouchStart","activateCallback","disableCallback","enableCallback","deactivateCallback","setFont","defaultFont","setFontSize","defaultFontSize","setBackgroundColor","defaultBackgroundColor","textStyle","image","imageRect","handleOutsideImage","allowedOutsideImage","point","insideRect","Error","convertToVector3","arrayOrVector3","Vector3","newImageIdSpecificToolStateManager","saveImageIdToolState","imageId","toolState","restoreImageIdToolState","imageIdToolState","saveToolState","restoreToolState","savedToolState","addImageIdSpecificToolState","getImageIdSpecificToolState","clearImageIdSpecificToolStateManager","clear","fracToDec","fractionalValue","parseFloat","storedPixelValue","patientStudyModule","metaData","seriesModule","modality","modalityPixelValue","slope","intercept","patientWeight","petSequenceModule","radiopharmaceuticalInfo","startTime","radiopharmaceuticalStartTime","totalDose","radionuclideTotalDose","halfLife","radionuclideHalfLife","seriesAcquisitionTime","seriesTime","acquisitionTimeInSeconds","fractionalSeconds","seconds","minutes","hours","injectionStartTimeInSeconds","durationInSeconds","exp","log","distanceThreshold","nearbyHandle","pointNearHandle","hasBoundingBox","_pointInsideBoundingBox2","handleCanvas","distance","_pointInsideBoundingBox","getBrowserInfo","ua","navigator","userAgent","M","match","tem","test","exec","slice","join","replace","appName","appVersion","setMaxSimultaneousRequests","newMaxSimultaneousRequests","configMaxSimultaneousRequests","getMaxSimultaneousRequests","getDefaultSimultaneousRequests","infoString","info","split","browserName","browserVersion","browserData","maxSimultaneousRequests","isMobileDevice","RegExp","IE","9","10","Firefox","Opera","11","12","Chrome","Safari","mouseWheelCallback","mouseDragCallback","hasMoved","distanceFromTool","min","modifiedEventData","mouseUpCallback","moveCallback","whichMovement","moveEndCallback","measurementRemovedCallback","toolDeactivatedCallback","distanceFromTouch","imageCoords","pageToPixel","page","projectPatientPointToImagePlane","patientPoint","imagePlane","rowCosines","_convertToVector2","columnCosines","imagePositionPatient","clone","sub","dot","columnPixelSpacing","rowPixelSpacing","imagePointToPatientPoint","imagePoint","multiplyScalar","getRectangleFromImagePlane","topLeft","topRight","columns","bottomLeft","rows","bottomRight","Line3","right","bottom","lineRectangleIntersection","line","rect","intersections","side","segment","intersection","intersectLine","planePlaneIntersection","targetImagePlane","referenceImagePlane","targetRowCosines","targetColumnCosines","targetImagePositionPatient","referenceRowCosines","referenceColumnCosines","referenceImagePositionPatient","targetNormal","cross","targetPlane","Plane","setFromNormalAndCoplanarPoint","referenceNormal","referencePlane","originDirection","intersectPlane","origin","direction","distanceTo","start","_convertToVector","addRequest","preventCache","doneCallback","failCallback","requestPool","requestDetails","imageLoadObject","imageCache","getImageLoadObject","promise","then","error","clearRequestStack","startAgain","awake","setTimeout","startGrabbing","grabDelay","sendRequest","numRequests","priority","loader","loadImage","loadAndCacheImage","_getMaxSimultaneousRequests","maxNumRequests","interaction","thumbnail","prefetch","currentRequests","requestsToSend","getNextRequest","shift","getRequestPool","images","loop","stackData","newImageIdIndex","currentImageIdIndex","imageIds","_scrollToIndex2","_scrollToIndex","precision","multiplier","pow","round","ellipse","location","xRadius","yRadius","center","normalized","cancelBubble","returnValue","enabledElement","storedPixelData","pixelData","getPixelData","spIndex","row","column","red","green","blue","alpha","points","copy","client","coordsData","getCoords","toolCoordinates","getActiveHandle","activeHandle","canvasPoint","movesIndependently","deltaPoints","timePoints","wrap","timeSeriesData","currentStack","stacks","currentStackIndex","newStackIndex","viewport","getViewport","newStack","startLoadingHandler","_loadHandlerManager2","endLoadingHandler","errorLoadingHandler","displayImage","_loadHandlerManager","_pointProjector","targetElement","referenceElement","targetImage","referenceImage","frameOfReferenceUID","angleInRadians","angleTo","abs","referenceLine","_calculateReferenceLine2","refLineStartCanvas","refLineEndCanvas","_toolColors2","setTransform","moveTo","lineTo","_calculateReferenceLine","_toolColors","_getOrientationString","_getOrientationString2","_invertOrientationString","_invertOrientationString2","orientation","getOrientationString","invertOrientationString","stackRenderer","render","stackRendererData","newImageId","_stackScroll","stackScroll","retryLoadOnScroll","Boolean","imagePromise","_requestPoolManager2","_requestPoolManager","dragCallback","mouseDragEventData","deltaY","_scroll2","pixelsPerImage","offsetHeight","stackScrollSpeed","imageDelta","imageIdIndexOffset","imageDeltaMod","multiTouchDragCallback","stackScrollMultiTouch","testPointers","stackScrollTouchDrag","stackScrollWheel","_touchDragTool","_touchDragTool2","_multiTouchDragTool","_multiTouchDragTool2","_simpleMouseButtonTool","_simpleMouseButtonTool2","_mouseWheelTool","_mouseWheelTool2","_scroll","numPointers","luminance","w","h","ox","oy","xe","ye","xm","ym","bezierCurveTo","closePath","angle","atan2","cos","sin","sp","sum","sumSquared","count","_pointInEllipse2","mean","variance","stdDev","sqrt","_pointInEllipse","keyDownCallback","touchEndCallback","handlesOutsideImage","animate","lastTime","runAnimation","targetLocation","time","Date","getTime","distanceRemaining","linearDistEachFrame","requestAnimationFrame","aboveFinger","fingerDistance","touchEndEvents","handlePressed","handleTap","now","lastInteractionType","lastInteractionTime","antiGhostDelay","attachEvents","eventList","interactionType","tapHandler","handleTapMouse","handleTapTouch","eventName","removeEvents","mouseEvents","pointerType","mouse","touchEvents","touch","bind","preventGhostClick","pointInsideRect","touchPinchCallback","brushTool","brushToolInterface","onMouseMove","onMouseUp","onDrag","onMouseDown","TOOL_STATE_TOOL_TYPE","Uint8ClampedArray","layer","getLayer","brushLayerId","setPixelData","invalid","_enabledElement$image","colormapId","colormap","colors","getColormap","setNumberOfColors","setColor","labelMapImage","minPixelValue","maxPixelValue","rgba","labelmap","invert","sizeInBytes","pixelReplication","addLayer","_mouseButtonTool2","_mouseButtonTool","getCircle","radius","xCoord","yCoord","x0","y0","circleArray","drawBrushPixels","pointerArray","storedPixels","brushPixelValue","getPixelIndex","drawBrushOnCanvas","canvasContext","canvasPtTL","canvasPtBR","sizeX","sizeY","canvasPt","_index","_index2","_setContextToDisplayFontSize","_roundToDecimal","_pauseEvent","_getRGBPixels","_getLuminance","_drawTextBox","_drawEllipse","_drawCircle","_drawArrow","_copyPoints","_calculateSUV","_calculateEllipseStatistics","_probeTool4D","_incrementTimePoint","_timeSeriesPlayer","_timeSeriesScroll","timeSeriesScroll","timeSeriesScrollWheel","timeSeriesScrollTouchDrag","_wwwcSynchronizer","_updateImageSynchronizer","_Synchronizer","_stackScrollSynchronizer","_stackImagePositionSynchronizer","_stackImagePositionOffsetSynchronizer","_stackImageIndexSynchronizer","_panZoomSynchronizer","_timeSeriesSpecificStateManager","addTimeSeriesStateManager","newTimeSeriesSpecificToolStateManager","_stackSpecificStateManager","stackSpecificStateManager","newStackSpecificToolStateManager","addStackStateManager","_frameOfReferenceStateManager","newFrameOfReferenceSpecificToolStateManager","globalFrameOfReferenceSpecificToolStateManager","_appState","_stackScrollKeyboard","_stackPrefetch","_scrollIndicator","_stackRenderers","_playClip","playClip","stopClip","_drawHandles","_keyboardInput","_mouseInput","_mouseWheelInput","_preventGhostClick","_touchInput","_angleTool","angleTouch","_arrowAnnotate","arrowAnnotate","arrowAnnotateTouch","_crosshairs","crosshairs","crosshairsTouch","_displayTool","_doubleTapTool","_doubleTapZoom","_dragProbe","dragProbe","dragProbeTouch","_ellipticalRoi","ellipticalRoi","ellipticalRoiTouch","_freehand","freehand","_highlight","highlightTouch","_imageStats","_keyboardTool","_length","lengthTouch","_magnify","magnify","magnifyTouchDrag","_mouseButtonRectangleTool","_orientationMarkers","_pan","pan","panTouchDrag","_panMultiTouch","_probe","probe","probeTouch","_rectangleRoi","rectangleRoi","rectangleRoiTouch","_rotate","rotate","rotateTouchDrag","_rotateTouch","_saveAs","_seedAnnotate","seedAnnotate","seedAnnotateTouch","_simpleAngle","simpleAngle","simpleAngleTouch","_textMarker","textMarker","textMarkerTouch","_touchPinchTool","_touchTool","_wwwc","wwwc","wwwcTouchDrag","_wwwcRegion","wwwcRegion","wwwcRegionTouch","_zoom","zoom","zoomWheel","zoomTouchPinch","zoomTouchDrag","_brush","brush","_adaptiveBrush","adaptiveBrush","_version","_referenceLinesTool","_referenceLinesTool2","_renderActiveReferenceLine","_renderActiveReferenceLine2","referenceLines","calculateReferenceLine","tool","renderActiveReferenceLine","syncContext","synchronizationContext","enabledElements","getSourceElements","renderer","getContext","setToPixelCoordinateSystem","referenceEnabledElement","vector","vec3","orientationX","orientationY","orientationZ","z","string","inverted","toUpperCase","scale","lineHeight","fontScale","updateLineSample","samples","timeSeries","stack","imageIdIndex","offset","sample","lineSample","set","timeSeriestoolData","_lineSampleMeasurement2","visible","_measurementManager2","_drawHandles2","textCoords","_drawTextBox2","_measurementManager","_lineSampleMeasurement","probeTool4D","MeasurementManager","that","measurements","measurement","eventDetail","remove","manager","framesPerSecond","timeSeriesToolData","playClipToolData","playClipData","intervalId","lastFrameTimeStamp","frameRate","setInterval","_incrementTimePoint2","clearInterval","timeSeriesPlayer","stop","pixelsPerTimeSeries","timeSeriesScrollSpeed","timeSeriesDelta","timeSeriesDeltaMod","mouseMoveData","originalEvent","synchronizer","sourceElement","sourceViewport","targetViewport","voi","windowWidth","windowCenter","setViewport","unique","array","filter","self","indexOf","Synchronizer","fireEvent","sourceElements","targetElements","ignoreFiredEvents","targetIndex","targetImageId","initialData","sourceIndex","sourceImageId","positionDifference","distances","eventHandler","onEvent","disableHandler","setHandler","getHandler","getDistances","sourceEnabledElement","sourceImagePlane","sourceImagePosition","targetEnabledElement","targetImagePosition","addSource","updateDisableHandlers","addTarget","removeSource","removeTarget","getTargetElements","concat","destroy","stackToolDataSource","sourceImage","minDistance","Number","MAX_VALUE","imagePosition","distanceToSquared","finalPosition","sourceStackToolDataSource","sourceStackData","targetStackToolDataSource","targetStackData","translation","toolTypes","oldStateManager","addStackSpecificToolState","getStackSpecificToolState","tools","timeSeriesSpecificStateManager","timeSeriesStateManagers","stackToolState","otherTools","stackTools","stackStateManagers","addFrameOfReferenceSpecificToolState","frameOfReference","frameOfReferenceToolState","getFrameOfReferenceSpecificToolState","removeFrameOfReferenceSpecificToolState","saveApplicationState","elements","appState","elementToolState","elementViewport","id","restoreApplicationState","elementId","getElementById","savedViewport","keyCode","UP","DOWN","_keyboardTool2","stackScrollKeyboard","range","lowEnd","highEnd","arr","nearestIndex","v","low","high","removeFromList","stackPrefetch","indicesToRequest","console","stackPrefetchData","enabled","sort","a","b","requestType","nearest","nextImageIdIndex","lowerIndex","higherIndex","currentIndex","shouldSkipLower","maxImagesToPrefetch","shouldSkipHigher","shouldLoadLower","shouldLoadHigher","getPromiseRemovedHandler","onImageUpdated","clearTimeout","resetPrefetchTimeout","target","resetPrefetchDelay","warn","indexOfCurrentImage","promiseRemovedHandler","Infinity","apply","scrollIndicator","scrollBarHeight","cursorWidth","cursorHeight","xPosition","yPosition","_displayTool2","_fusionRenderer","_fusionRenderer2","stackRenderers","FusionRenderer","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","writable","key","protoProps","staticProps","layerIds","findImageFn","imageStacks","_this","isInteger","baseImageObject","currentImageId","overlayImageStacks","baseImage","baseLayerId","setLayerImage","imgObj","overlayLayerIndex","layerIndex","currentLayerId","setActiveLayer","getPlayClipTimeouts","speed","delay","limit","timeouts","isTimeVarying","stopClipWithData","usingFrameTimeVector","triggerStopEvent","playClipTimeouts","stackToolData","frameTimeVector","ignoreFrameTimeVector","reverse","playClipAction","imageCount","playClipTimeoutHandler","keyPress","keyPressData","mouseX","mouseY","keyPressEvents","keydown","keypress","keyup","pageX","pageY","keyboardEvents","keyboardInput","getEventWhich","buttons","preventClickHandler","isClickEvent","pageToPoint","clientX","clientY","lastPoints","_copyPoints2","subtract","whichMouseButton","ctrlKey","metaKey","shiftKey","_pauseEvent2","preventClickTimeout","clickDelay","mouseInput","mouseWheel","wheelDeltaY","axis","startingCoords","wheelDelta","mouseWheelData","imageX","imageY","mouseWheelEvents","mouseWheelInput","onTouch","srcEvent","scaleChange","delta","remainingPointers","rotation","pointers","touches","isPress","pressTimeout","isTouchEvent","lastScale","preventNextPinch","touchStartDelay","pageDistanceMoved","pressDelay","changedTouches","deltaX","lastDelta","pressMaxDistance","changedPointers","lastRotation","hammerOptions","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","TouchInput","mc","Manager","panOptions","DIRECTION_ALL","threshold","Pan","pinch","Pinch","Rotate","recognizeWith","doubleTap","Tap","taps","interval","posThreshold","on","_preventGhostClick2","hammer","off","touchInput","start2","end2","lineSegment","distanceToPoint","shadow","shadowColor","shadowOffsetX","shadowOffsetY","handleStartCanvas","handleEndCanvas","dx1","ceil","dy1","dx2","dy2","acos","rAngle","_roundToDecimal2","String","fromCharCode","parseInt","textX","textY","_touchTool2","getTextCallback","doneChangingTextCallback","prompt","changeTextCallback","textBox","arrowFirst","_drawArrow2","handleOptions","drawHandlesOnHover","drawHandles","textWidth","textHeight","transform","internal","getTransform","transformPoint","link","midpointCanvas","findClosestPoint","boundingBoxPoints","setLineDash","addNewMeasurementTouch","doubleClickCallback","updatedText","deleteTool","chooseLocation","sourceImagePoint","normal","dragEndCallback","dragStartCallback","enableTouch","disableTouch","fitToWindowStrategy","fitToWindow","doubleTapZoom","strategy","_doubleTapTool2","strategies","defaultStrategy","fontHeight","str","_getRGBPixels2","getStoredPixels","mo","suv","_calculateSUV2","toFixed","minimalStrategy","toolCoords","modalityPixelValueText","imageRenderedCallback","dragEventData","minimal","pointNearEllipse","startCanvas","endCanvas","minorEllipse","majorEllipse","pointInMinorEllipse","pointNearToolTouch","numberWithCommas","parts","leftCanvas","topCanvas","widthCanvas","heightCanvas","_drawEllipse2","area","meanStdDev","meanStdDevSUV","pixels","getPixels","_calculateEllipseStatistics2","isNaN","moSuffix","meanText","stdDevText","suffix","areaText","ellipsePoints","addPoint","currentTool","handleData","lines","currentHandle","toolIndex","mousePoint","pointNearHandleAllTools","handleNearby","mouseLocation","modifying","lastLineIndex","lastLine","startDrawing","endDrawing","nearby","handleStart","j","k","lineCanvas","mouseLocationCanvas","existingToolData","insideBox","clientWidth","clientHeight","strokeRect","_mouseButtonRectangleTool2","stats","imageStats","colPixelSpacing","rowImagePixelSpacing","colImagePixelSpacing","dx","dy","newImageCallback","hideTool","querySelector","style","display","body","cursor","drawMagnificationTool","magnifyCanvas","createMagnificationCanvas","magnifySize","magnificationLevel","zoomCtx","getSize","canvasLocation","clearRect","copyFrom","scaledMagnify","drawImage","createElement","classList","position","appendChild","removeMagnificationCanvas","removeChild","getOrientationMarkers","imagePlaneMetaData","rowString","columnString","oppositeRowString","getOrientationMarkerPositions","markers","textWidths","orientationMarkers","drawAllMarkers","widthScale","heightScale","touchPanCallback","panMultiTouch","calculateMeanStdDev","getBoundingClientRect","pointsFromCenter","rotationRadians","rotationDegrees","horizontalStrategy","verticalStrategy","horizontal","vertical","touchRotateCallback","rotateTouch","saveAs","filename","mimetype","lnk","download","href","toDataURL","initMouseEvent","doneGetTextCallback","realCoords","canvasWidth","_drawCircle2","textPlusCoords","showCoordinates","currentLetter","currentNumber","countUp","middle","handleMiddleCanvas","sideA","sideB","sideC","sideALength","sideBLength","sideCLength","touchMoveCallback","current","ascending","insideBoundingBox","touchPressCallback","maxVOI","minVOI","imageDynamicRange","dragData","calculateMinMaxMean","storedPixelLuminanceData","globalMin","globalMax","numPixels","spv","endPoint","applyWWWCRegion","startPoint","floor","pixelLuminanceData","_getLuminance2","minMaxMean","minWindowWidth","recordStartPoint","startPointCanvas","endPointCanvas","disableTouchDrag","activateTouchDrag","changeViewportScale","ticks","oldFactor","factor","maxScale","minScale","boundPosition","correctShift","hflip","vflip","cosA","sinA","newX","newY","newCoords","translateStrategy","preventZoomOutsideImage","desiredTranslation","distanceToDesired","zoomToCenterStrategy","_touchPinchTool2","translate","zoomToCenter","paint","_layer$image","_eventData$currentPoi","draw","_getCircle2","_drawBrush","lastImageCoords","dragging","_eventData$image","_lastImageCoords","dragColor","hoverColor","_brushTool","_brushTool2","_getCircle","getGreyValues","imageColumns","tolerance","minValue","maxValue","pixelIndex","greyValue","thrMin","thrMax","paintAdaptiveBrush","imagePixelData","brushPixelData","numPixelsOutsideThresholdWindow","minRadius","pixelValue","baseLayer","getLayers","brushData","currentRadius","erase","_layer$image2","_eventData$currentPoi2","_layer$image3"],"mappings":"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","file":"cornerstoneTools.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/*! cornerstone-tools - 2.0.0 - 2017-12-12 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 61);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar cornerstone = window.cornerstone;\nvar cornerstoneMath = window.cornerstoneMath;\nvar Hammer = window.Hammer;\n\nexports.default = {\n set cornerstone(cs) {\n cornerstone = cs;\n },\n get cornerstone() {\n return cornerstone;\n },\n set cornerstoneMath(cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath() {\n return cornerstoneMath;\n },\n set Hammer(module) {\n Hammer = module;\n },\n get Hammer() {\n return Hammer;\n }\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar EVENTS = {\n // Events from Cornerstone Core\n IMAGE_RENDERED: 'cornerstoneimagerendered',\n NEW_IMAGE: 'cornerstonenewimage',\n IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',\n ELEMENT_DISABLED: 'cornerstoneelementdisabled',\n\n // Mouse events\n MOUSE_DOWN: 'cornerstonetoolsmousedown',\n MOUSE_UP: 'cornerstonetoolsmouseup',\n MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',\n MOUSE_DRAG: 'cornerstonetoolsmousedrag',\n MOUSE_MOVE: 'cornerstonetoolsmousemove',\n MOUSE_CLICK: 'cornerstonetoolsmouseclick',\n MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',\n MOUSE_WHEEL: 'cornerstonetoolsmousewheel',\n\n // Touch events\n TOUCH_START: 'cornerstonetoolstouchstart',\n TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',\n TOUCH_END: 'cornerstonetoolstouchend',\n TOUCH_DRAG: 'cornerstonetoolstouchdrag',\n TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',\n TOUCH_PINCH: 'cornerstonetoolstouchpinch',\n TOUCH_ROTATE: 'cornerstonetoolstouchrotate',\n TOUCH_PRESS: 'cornerstonetoolstouchpress',\n TAP: 'cornerstonetoolstap',\n DOUBLE_TAP: 'cornerstonetoolsdoubletap',\n MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',\n MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',\n MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',\n\n // Keyboard events\n KEY_DOWN: 'cornerstonetoolskeydown',\n KEY_UP: 'cornerstonetoolskeyup',\n KEY_PRESS: 'cornerstonetoolskeypress',\n\n // Measurement / tool events\n MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',\n MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',\n MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved',\n TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',\n CLIP_STOPPED: 'cornerstonetoolsclipstopped',\n STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed\n\n LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated'\n};\n\nexports.default = EVENTS;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getElementToolStateManager = exports.setElementToolStateManager = exports.clearToolState = exports.removeToolState = exports.getToolState = exports.addToolState = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getElementToolStateManager(element) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState(element, toolType, measurementData) {\n var toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n var eventType = _events2.default.MEASUREMENT_ADDED;\n var eventData = {\n toolType: toolType,\n element: element,\n measurementData: measurementData\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState(element, toolType) {\n var toolStateManager = getElementToolStateManager(element);\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState(element, toolType, data) {\n var toolStateManager = getElementToolStateManager(element);\n var toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n var indexOfData = -1;\n\n for (var i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n var eventType = _events2.default.MEASUREMENT_REMOVED;\n var eventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }\n}\n\nfunction clearToolState(element, toolType) {\n var toolStateManager = getElementToolStateManager(element);\n var toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager(element, toolStateManager) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexports.addToolState = addToolState;\nexports.getToolState = getToolState;\nexports.removeToolState = removeToolState;\nexports.clearToolState = clearToolState;\nexports.setElementToolStateManager = setElementToolStateManager;\nexports.getElementToolStateManager = getElementToolStateManager;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar elementToolOptions = {};\n\nfunction getToolOptions(toolType, element) {\n if (!elementToolOptions[toolType]) {\n return {};\n }\n\n var toolOptions = elementToolOptions[toolType];\n var optionsObject = toolOptions.find(function (toolOptionObject) {\n return toolOptionObject.element === element;\n });\n\n if (!optionsObject) {\n return {};\n }\n\n return optionsObject.options;\n}\n\nfunction setToolOptions(toolType, element, options) {\n if (!elementToolOptions[toolType]) {\n elementToolOptions[toolType] = [{\n element: element,\n options: options\n }];\n\n return;\n }\n\n var toolOptions = elementToolOptions[toolType];\n var index = toolOptions.findIndex(function (toolOptionObject) {\n return toolOptionObject.element === element;\n });\n\n if (index === -1) {\n elementToolOptions[toolType].push({\n element: element,\n options: options\n });\n } else {\n elementToolOptions[toolType][index].options = options;\n }\n}\n\nexports.getToolOptions = getToolOptions;\nexports.setToolOptions = setToolOptions;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (which, mouseButtonMask) {\n var mouseButton = 1 << which - 1;\n\n return (mouseButtonMask & mouseButton) !== 0;\n};\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = triggerEvent;\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nfunction triggerEvent(el, type) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n var event = void 0;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail: detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor(color) {\n fillColor = color;\n}\n\nfunction getFillColor() {\n return fillColor;\n}\n\nfunction setToolColor(color) {\n defaultColor = color;\n}\n\nfunction getToolColor() {\n return defaultColor;\n}\n\nfunction setActiveColor(color) {\n activeColor = color;\n}\n\nfunction getActiveColor() {\n return activeColor;\n}\n\nfunction getColorIfActive(active) {\n return active ? activeColor : defaultColor;\n}\n\nvar toolColors = {\n setFillColor: setFillColor,\n getFillColor: getFillColor,\n setToolColor: setToolColor,\n getToolColor: getToolColor,\n setActiveColor: setActiveColor,\n getActiveColor: getActiveColor,\n getColorIfActive: getColorIfActive\n};\n\nexports.default = toolColors;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n var padding = 5;\n var font = _textStyle2.default.getFont();\n var fontSize = _textStyle2.default.getFontSize();\n var backgroundColor = _textStyle2.default.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n var maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n var width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n var boundingBox = {\n width: maxWidth + padding * 2,\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n};\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth(width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth() {\n return defaultWidth;\n}\n\nfunction setActiveWidth(width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth() {\n return activeWidth;\n}\n\nvar toolStyle = {\n setToolWidth: setToolWidth,\n getToolWidth: getToolWidth,\n setActiveWidth: setActiveWidth,\n getActiveWidth: getActiveWidth\n};\n\nexports.default = toolStyle;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseToolInterface) {\n var configuration = {};\n var toolType = mouseToolInterface.toolType;\n\n function mouseDownActivateCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback(e) {\n var eventData = e.detail;\n\n _toolCoordinates2.default.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n var imageNeedsUpdate = false;\n\n for (var i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n var coords = eventData.currentPoints.canvas;\n\n var data = toolData.data[i];\n\n if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if (mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback(e) {\n var eventData = e.detail;\n var data = void 0;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove() {\n data.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n }\n\n var coords = eventData.startPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var i = void 0;\n\n // Now check to see if there is a handle we can move\n\n var preventHandleOutsideImage = void 0;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var distance = 6;\n var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n data.active = true;\n (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n var opt = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n\n var mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback;\n var mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback;\n var mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback;\n var mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n\n var handleMover = void 0;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = _moveHandle2.default;\n } else {\n handleMover = _moveNewHandle2.default;\n }\n\n var preventHandleOutsideImage = void 0;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n var eventType = _events2.default.TOOL_DEACTIVATED;\n var statusChangeEventData = {\n mouseButtonMask: mouseButtonMask,\n toolType: toolType,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, statusChangeEventData);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n function getConfiguration() {\n return configuration;\n }\n\n function setConfiguration(config) {\n configuration = config;\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration,\n mouseDownCallback: mouseDownCallback,\n mouseMoveCallback: mouseMoveCallback,\n mouseDownActivateCallback: mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseDoubleClick) {\n toolInterface.mouseDoubleClickCallback = mouseDoubleClick;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolCoordinates = __webpack_require__(37);\n\nvar _toolCoordinates2 = _interopRequireDefault(_toolCoordinates);\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _handleActivator = __webpack_require__(38);\n\nvar _handleActivator2 = _interopRequireDefault(_handleActivator);\n\nvar _moveHandle = __webpack_require__(24);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _moveNewHandle = __webpack_require__(25);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveAllHandles = __webpack_require__(39);\n\nvar _moveAllHandles2 = _interopRequireDefault(_moveAllHandles);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = _toolStyle2.default.getActiveWidth();\n } else {\n context.lineWidth = _toolStyle2.default.getToolWidth();\n }\n\n var handleCanvasCoords = _externalModules2.default.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar handleRadius = 6;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _touchMoveHandle = __webpack_require__(53);\n\nvar _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _touchMoveAllHandles = __webpack_require__(52);\n\nvar _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deactivateAllHandles(handles) {\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances(toolData) {\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n var data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool(touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n\n var measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n (0, _toolState.addToolState)(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === _events2.default.TAP) {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n (0, _moveNewHandleTouch2.default)(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchTool tapCallback');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType);\n var data = void 0;\n var i = void 0;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback() {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var distanceSq = 25; // Should probably make this a settable property later\n var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distanceSq);\n\n if (handle) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e);\n } else {\n touchDownActivateCallback(e);\n }\n\n return false;\n }\n\n function touchStartCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchTool touchStartCallback');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var coords = eventData.startPoints.canvas;\n var data = void 0;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType);\n var i = void 0;\n\n function doneMovingCallback(lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === _events2.default.TOUCH_PRESS) {\n (0, _triggerEvent2.default)(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n var distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n data.active = true;\n (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n element.addEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element) {\n var eventType = _events2.default.TOOL_DEACTIVATED;\n var statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, statusChangeEventData);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexports.default = touchTool;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultStartLoadHandler = void 0;\nvar defaultEndLoadHandler = void 0;\nvar defaultErrorLoadingHandler = void 0;\n\nfunction setStartLoadHandler(handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler() {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler(handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler() {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler(handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler() {\n return defaultErrorLoadingHandler;\n}\n\nvar loadHandlerManager = {\n setStartLoadHandler: setStartLoadHandler,\n getStartLoadHandler: getStartLoadHandler,\n setEndLoadHandler: setEndLoadHandler,\n getEndLoadHandler: getEndLoadHandler,\n setErrorLoadingHandler: setErrorLoadingHandler,\n getErrorLoadingHandler: getErrorLoadingHandler\n};\n\nexports.default = loadHandlerManager;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchDragCallback, options) {\n var events = _events2.default.TOUCH_DRAG;\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsTouchStart';\n }\n\n var toolInterface = {\n activate: function activate(element) {\n element.removeEventListener(events, touchDragCallback);\n\n if (options && options.eventData) {\n element.addEventListener(events, options.eventData, touchDragCallback);\n } else {\n element.addEventListener(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable: function disable(element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable: function enable(element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n\n return toolInterface;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultFontSize = 15,\n defaultFont = defaultFontSize + 'px Arial',\n defaultBackgroundColor = 'transparent';\n\nfunction setFont(font) {\n defaultFont = font;\n}\n\nfunction getFont() {\n return defaultFont;\n}\n\nfunction setFontSize(fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize() {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor(backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor() {\n return defaultBackgroundColor;\n}\n\nvar textStyle = {\n setFont: setFont,\n getFont: getFont,\n setFontSize: setFontSize,\n getFontSize: getFontSize,\n setBackgroundColor: setBackgroundColor,\n getBackgroundColor: getBackgroundColor\n};\n\nexports.default = textStyle;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (renderData, handles) {\n var image = renderData.image;\n var imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n var handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (_externalModules2.default.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseDownCallback, toolType) {\n if (!toolType) {\n throw new Error('simpleMouseButtonTool: toolType is required');\n }\n\n var configuration = {};\n\n return {\n activate: function activate(element, mouseButtonMask) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n options.mouseButtonMask = mouseButtonMask;\n (0, _enabledElementTools.setToolOptions)(toolType, element, options);\n\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = convertToVector3;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nfunction convertToVector3(arrayOrVector3) {\n var cornerstoneMath = _externalModules2.default.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.globalImageIdSpecificToolStateManager = exports.newImageIdSpecificToolStateManager = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager() {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState(imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState(imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState() {\n return toolState;\n }\n\n function restoreToolState(savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState(element, toolType, data) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n var imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n var toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState(element, toolType) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n var imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = imageIdToolState[toolType];\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager(element) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState: saveImageIdToolState,\n restoreImageIdToolState: restoreImageIdToolState,\n saveToolState: saveToolState,\n restoreToolState: restoreToolState,\n toolState: toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nvar globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexports.newImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager;\nexports.globalImageIdSpecificToolStateManager = globalImageIdSpecificToolStateManager;\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return _externalModules2.default.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, storedPixelValue) {\n var cornerstone = _externalModules2.default.cornerstone;\n var patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n var modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n var modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n var patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n var petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n var radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n var startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n var totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n var halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n var seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n var acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n var injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n var durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n var correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n var suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Returns a decimal value given a fractional value\nfunction fracToDec(fractionalValue) {\n return parseFloat('.' + fractionalValue);\n}\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, handles, coords, distanceThreshold) {\n var nearbyHandle = void 0;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if ((0, _pointInsideBoundingBox2.default)(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n var handleCanvas = _externalModules2.default.cornerstone.pixelToCanvas(element, handle);\n var distance = _externalModules2.default.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar configMaxSimultaneousRequests = void 0;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nvar maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo() {\n var ua = navigator.userAgent;\n var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n var tem = void 0;\n\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n\n return 'IE ' + (tem[1] || '');\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests(newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests() {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests() {\n var infoString = getBrowserInfo();\n var info = infoString.split(' ');\n var browserName = info[0];\n var browserVersion = info[1];\n var browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice() {\n var pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n return pattern.test(navigator.userAgent);\n}\n\nexports.getDefaultSimultaneousRequests = getDefaultSimultaneousRequests;\nexports.getMaxSimultaneousRequests = getMaxSimultaneousRequests;\nexports.setMaxSimultaneousRequests = setMaxSimultaneousRequests;\nexports.getBrowserInfo = getBrowserInfo;\nexports.isMobileDevice = isMobileDevice;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseWheelCallback) {\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n element.addEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n var distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback(e) {\n var eventData = e.detail;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback() {\n handle.active = false;\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n function moveCallback(e) {\n var eventData = e.detail;\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n function whichMovement(e) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n element.removeEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, moveCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, moveCallback);\n\n element.addEventListener(_events2.default.MOUSE_CLICK, moveEndCallback);\n if (e.type === _events2.default.MOUSE_DRAG) {\n element.addEventListener(_events2.default.MOUSE_UP, moveEndCallback);\n }\n }\n\n function measurementRemovedCallback(e) {\n var eventData = e.detail;\n\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback(e) {\n var eventData = e.detail;\n\n if (eventData.toolType === toolType) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, moveEndCallback);\n element.removeEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n element.addEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n element.addEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.addEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n function moveEndCallback() {\n element.removeEventListener(_events2.default.MOUSE_MOVE, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, moveEndCallback);\n element.removeEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (onImageRendered) {\n var configuration = {};\n\n return {\n disable: function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n var distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback(e) {\n var eventData = e.detail;\n\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback(e) {\n var eventData = e.detail;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, moveCallback);\n element.removeEventListener(_events2.default.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, moveEndCallback);\n element.removeEventListener(_events2.default.TAP, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n if (e.type === _events2.default.TOUCH_PINCH || e.type === _events2.default.TOUCH_PRESS) {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation(e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, moveCallback);\n element.addEventListener(_events2.default.TOUCH_PINCH, moveEndCallback);\n element.addEventListener(_events2.default.TOUCH_END, moveEndCallback);\n element.addEventListener(_events2.default.TAP, moveEndCallback);\n element.addEventListener(_events2.default.TOUCH_START, stopImmediatePropagation);\n\n function toolDeactivatedCallback() {\n element.removeEventListener(_events2.default.TOUCH_DRAG, moveCallback);\n element.removeEventListener(_events2.default.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, moveEndCallback);\n element.removeEventListener(_events2.default.TAP, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.projectPatientPointToImagePlane = projectPatientPointToImagePlane;\nexports.imagePointToPatientPoint = imagePointToPatientPoint;\nexports.planePlaneIntersection = planePlaneIntersection;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Projects a patient point to an image point\nfunction projectPatientPointToImagePlane(patientPoint, imagePlane) {\n var rowCosines = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var columnCosines = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var imagePositionPatient = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var point = patientPoint.clone().sub(imagePositionPatient);\n var x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n var y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n return {\n x: x,\n y: y\n };\n}\n\n// Projects an image point to a patient point\nfunction imagePointToPatientPoint(imagePoint, imagePlane) {\n var rowCosines = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var columnCosines = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var imagePositionPatient = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n\n var x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n var y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n var patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane(imagePlane) {\n // Get the points\n var topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n var topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n var bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n var bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n var rect = {\n top: new _externalModules2.default.cornerstoneMath.Line3(topLeft, topRight),\n left: new _externalModules2.default.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new _externalModules2.default.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new _externalModules2.default.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n return rect;\n}\n\nfunction lineRectangleIntersection(line, rect) {\n var intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n var segment = rect[side];\n var intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nfunction planePlaneIntersection(targetImagePlane, referenceImagePlane) {\n var targetRowCosines = (0, _convertToVector2.default)(targetImagePlane.rowCosines);\n var targetColumnCosines = (0, _convertToVector2.default)(targetImagePlane.columnCosines);\n var targetImagePositionPatient = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n var referenceRowCosines = (0, _convertToVector2.default)(referenceImagePlane.rowCosines);\n var referenceColumnCosines = (0, _convertToVector2.default)(referenceImagePlane.columnCosines);\n var referenceImagePositionPatient = (0, _convertToVector2.default)(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n var targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n var targetPlane = new _externalModules2.default.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n var referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n var referencePlane = new _externalModules2.default.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n var originDirection = referencePlane.clone().intersectPlane(targetPlane);\n var origin = originDirection.origin;\n var direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n var bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n var distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n var line = new _externalModules2.default.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n var rect = getRectangleFromImagePlane(referenceImagePlane);\n var intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nvar numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nvar maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nvar awake = false;\nvar grabDelay = 20;\n\nfunction addRequest(element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n var requestDetails = {\n type: type,\n imageId: imageId,\n preventCache: preventCache,\n doneCallback: doneCallback,\n failCallback: failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n var imageLoadObject = _externalModules2.default.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.promise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack(type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain() {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest(requestDetails) {\n var cornerstone = _externalModules2.default.cornerstone;\n // Increment the number of current requests of this type\n var type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n var imageId = requestDetails.imageId;\n var doneCallback = requestDetails.doneCallback;\n var failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n var imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imageLoadObject.promise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority(requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n var priority = requestTypeToLoadPriority(requestDetails);\n\n var loader = void 0;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority: priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority: priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing() {\n // Begin by grabbing X images\n var maxSimultaneousRequests = (0, _getMaxSimultaneousRequests.getMaxSimultaneousRequests)();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n var currentRequests = numRequests.interaction + numRequests.thumbnail + numRequests.prefetch;\n var requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (var i = 0; i < requestsToSend; i++) {\n var requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest() {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length && !requestPool.thumbnail.length && !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool() {\n return requestPool;\n}\n\nexports.default = {\n addRequest: addRequest,\n clearRequestStack: clearRequestStack,\n startGrabbing: startGrabbing,\n getRequestPool: getRequestPool\n};\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchDragCallback, options) {\n var configuration = {};\n var events = [_events2.default.MULTI_TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(_events2.default.MULTI_TOUCH_START);\n }\n\n return {\n activate: function activate(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable: function disable(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable: function enable(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate: function deactivate(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, images) {\n var loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var stackData = toolData.data[0];\n\n var newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n var nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n (0, _scrollToIndex2.default)(element, newImageIdIndex);\n};\n\nvar _scrollToIndex = __webpack_require__(44);\n\nvar _scrollToIndex2 = _interopRequireDefault(_scrollToIndex);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (value, precision) {\n var multiplier = Math.pow(10, precision);\n\n return Math.round(value * multiplier) / multiplier;\n};\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (ellipse, location) {\n var xRadius = ellipse.width / 2;\n var yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n var center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n var normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n var inEllipse = normalized.x * normalized.x / (xRadius * xRadius) + normalized.y * normalized.y / (yRadius * yRadius) <= 1.0;\n\n return inEllipse;\n};\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n};\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var storedPixelData = [];\n var index = 0;\n var pixelData = enabledElement.image.getPixelData();\n var spIndex = void 0,\n row = void 0,\n column = void 0;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * enabledElement.image.columns + (column + x)) * 4;\n var red = pixelData[spIndex];\n var green = pixelData[spIndex + 1];\n var blue = pixelData[spIndex + 2];\n var alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (points) {\n var page = _externalModules2.default.cornerstoneMath.point.copy(points.page);\n var image = _externalModules2.default.cornerstoneMath.point.copy(points.image);\n var client = _externalModules2.default.cornerstoneMath.point.copy(points.client);\n var canvas = _externalModules2.default.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page: page,\n image: image,\n client: client,\n canvas: canvas\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar coordsData = void 0;\n\nfunction setCoords(eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords() {\n return coordsData;\n}\n\nvar toolCoordinates = {\n setCoords: setCoords,\n getCoords: getCoords\n};\n\nexports.default = toolCoordinates;\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n var activeHandle = getActiveHandle(handles);\n var nearbyHandle = (0, _getHandleNearImagePoint2.default)(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n};\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getActiveHandle(handles) {\n var activeHandle = void 0;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (e, data, toolData, toolType, options, doneMovingCallback) {\n var cornerstone = _externalModules2.default.cornerstone;\n var mouseEventData = e.detail;\n var element = mouseEventData.element;\n\n function mouseDragCallback(e) {\n var eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n var handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback(e) {\n var eventData = e.detail;\n\n data.invalidated = true;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true && (0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n return true;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, timePoints, wrap) {\n var toolData = (0, _toolState.getToolState)(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var timeSeriesData = toolData.data[0];\n var currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n var currentImageIdIndex = currentStack.currentImageIdIndex;\n var newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n var viewport = cornerstone.getViewport(element);\n var newStack = timeSeriesData.stacks[newStackIndex];\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n var loader = void 0;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n var imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (targetImagePlane, referenceImagePlane) {\n var points = (0, _pointProjector.planePlaneIntersection)(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: (0, _pointProjector.projectPatientPointToImagePlane)(points.start, targetImagePlane),\n end: (0, _pointProjector.projectPatientPointToImagePlane)(points.end, targetImagePlane)\n };\n};\n\nvar _pointProjector = __webpack_require__(28);\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, eventData, targetElement, referenceElement) {\n var cornerstone = _externalModules2.default.cornerstone;\n var targetImage = cornerstone.getEnabledElement(targetElement).image;\n var referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n var referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane || !referenceImagePlane || !targetImagePlane.rowCosines || !targetImagePlane.columnCosines || !targetImagePlane.imagePositionPatient || !referenceImagePlane.rowCosines || !referenceImagePlane.columnCosines || !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = (0, _convertToVector2.default)(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = (0, _convertToVector2.default)(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = (0, _convertToVector2.default)(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = (0, _convertToVector2.default)(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = (0, _convertToVector2.default)(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n var targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n var referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n var angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) {\n // 0.5 radians = ~30 degrees\n return;\n }\n\n var referenceLine = (0, _calculateReferenceLine2.default)(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n var refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n var refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n var color = _toolColors2.default.getActiveColor();\n var lineWidth = _toolStyle2.default.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _calculateReferenceLine = __webpack_require__(41);\n\nvar _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _getOrientationString = __webpack_require__(64);\n\nvar _getOrientationString2 = _interopRequireDefault(_getOrientationString);\n\nvar _invertOrientationString = __webpack_require__(65);\n\nvar _invertOrientationString2 = _interopRequireDefault(_invertOrientationString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar orientation = {\n getOrientationString: _getOrientationString2.default,\n invertOrientationString: _invertOrientationString2.default\n};\n\nexports.default = orientation;\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, newImageIdIndex) {\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n var stackRenderer = void 0;\n\n if (toolData.data.length > 1) {\n var stackRendererData = (0, _toolState.getToolState)(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n var stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n function doneCallback(image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch (error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback(error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n var eventData = {\n newImageIdIndex: newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n var newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n var config = _stackScroll.stackScroll.getConfiguration();\n\n if (config && config.retryLoadOnScroll === true) {}\n // Const newImageLoadObject = cornerstone.imageCache.getImageLoadObject(newImageId);\n\n // TODO: No way to check state of Promise. No way to know if it is rejected.\n /* If (newImageLoadObject && newImagePromise.state() === 'rejected') {\n cornerstone.imageCache.removeImagePromise(newImageId);\n }*/\n\n\n // Convert the preventCache value in stack data to a boolean\n var preventCache = Boolean(stackData.preventCache);\n\n var imagePromise = void 0;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n _requestPoolManager2.default.startGrabbing();\n\n (0, _triggerEvent2.default)(element, _events2.default.STACK_SCROLL, eventData);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _requestPoolManager = __webpack_require__(29);\n\nvar _requestPoolManager2 = _interopRequireDefault(_requestPoolManager);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _stackScroll = __webpack_require__(45);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.stackScrollMultiTouch = exports.stackScrollTouchDrag = exports.stackScrollWheel = exports.stackScroll = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _multiTouchDragTool = __webpack_require__(30);\n\nvar _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _mouseWheelTool = __webpack_require__(23);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _scroll = __webpack_require__(31);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'stackScroll';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n var mouseDragEventData = {\n deltaY: 0\n };\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragEventData, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback(e) {\n var eventData = e.detail;\n var images = -eventData.direction;\n\n var config = stackScroll.getConfiguration();\n\n var loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n (0, _scroll2.default)(eventData.element, images, loop);\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var stackData = toolData.data[0];\n\n var config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n var pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n e.data.deltaY = e.data.deltaY || 0;\n e.data.deltaY += eventData.deltaPoints.page.y;\n if (Math.abs(e.data.deltaY) >= pixelsPerImage) {\n var imageDelta = e.data.deltaY / pixelsPerImage;\n var imageIdIndexOffset = Math.round(imageDelta);\n var imageDeltaMod = e.data.deltaY % pixelsPerImage;\n\n e.data.deltaY = imageDeltaMod;\n (0, _scroll2.default)(element, imageIdIndexOffset);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Module/private exports\nvar stackScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\nvar stackScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\n\nvar options = {\n eventData: {\n deltaY: 0\n }\n};\nvar stackScrollTouchDrag = (0, _touchDragTool2.default)(dragCallback, options);\n\nfunction multiTouchDragCallback(e) {\n var eventData = e.detail;\n var config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e);\n }\n}\n\nvar configuration = {\n testPointers: function testPointers(eventData) {\n return eventData.numPointers >= 3;\n }\n};\n\nvar stackScrollMultiTouch = (0, _multiTouchDragTool2.default)(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexports.stackScroll = stackScroll;\nexports.stackScrollWheel = stackScrollWheel;\nexports.stackScrollTouchDrag = stackScrollTouchDrag;\nexports.stackScrollMultiTouch = stackScrollMultiTouch;\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var image = enabledElement.image;\n var luminance = [];\n var index = 0;\n var pixelData = image.getPixelData();\n var spIndex = void 0,\n row = void 0,\n column = void 0;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns + (column + x)) * 4;\n var red = pixelData[spIndex];\n var green = pixelData[spIndex + 1];\n var blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (row + y) * image.columns + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, x, y, w, h) {\n var kappa = 0.5522848,\n ox = w / 2 * kappa,\n // Control point offset horizontal\n oy = h / 2 * kappa,\n // Control point offset vertical\n xe = x + w,\n // X-end\n ye = y + h,\n // Y-end\n xm = x + w / 2,\n // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n};\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, start, color, lineWidth) {\n var handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n};\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n var headLength = 10;\n\n var angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n};\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n var sum = 0;\n var sumSquared = 0;\n var count = 0;\n var index = 0;\n\n for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n var point = {\n x: x,\n y: y\n };\n\n if ((0, _pointInEllipse2.default)(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count: count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n var mean = sum / count;\n var variance = sumSquared / count - mean * mean;\n\n return {\n count: count,\n mean: mean,\n variance: variance,\n stdDev: Math.sqrt(variance)\n };\n};\n\nvar _pointInEllipse = __webpack_require__(33);\n\nvar _pointInEllipse2 = _interopRequireDefault(_pointInEllipse);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (keyDownCallback) {\n var configuration = {};\n\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n element.addEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n var touchEventData = event.detail;\n var element = touchEventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n\n function touchDragCallback(e) {\n var eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n var handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchEndCallback);\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, touchEndCallback);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, touchEndCallback);\n element.removeEventListener(_events2.default.TAP, touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n var handlesOutsideImage = (0, _anyHandlesOutsideImage2.default)(eventData, data.handles);\n\n if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n element.addEventListener(_events2.default.TOUCH_PINCH, touchEndCallback);\n element.addEventListener(_events2.default.TOUCH_PRESS, touchEndCallback);\n element.addEventListener(_events2.default.TOUCH_END, touchEndCallback);\n element.addEventListener(_events2.default.TOUCH_DRAG_END, touchEndCallback);\n element.addEventListener(_events2.default.TAP, touchEndCallback);\n\n return true;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (event, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n var touchEventData = event.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n var enabledElement = cornerstone.getEnabledElement(element);\n\n var time = new Date().getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n var fingerDistance = -57;\n\n var aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n var targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n var currentPoints = eventData.currentPoints;\n var aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback(e) {\n var eventData = e.detail;\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n\n runAnimation.value = false;\n\n handle.active = false;\n element.removeEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n touchEndEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, touchEndCallback);\n });\n\n cornerstone.updateImage(element);\n\n if (e.type === _events2.default.TOUCH_PRESS) {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n touchEndEvents.forEach(function (eventType) {\n element.addEventListener(eventType, touchEndCallback);\n });\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nvar runAnimation = {\n value: false\n};\n\nvar touchEndEvents = [_events2.default.TOUCH_END, _events2.default.TOUCH_DRAG_END, _events2.default.TOUCH_PINCH, _events2.default.TOUCH_PRESS, _events2.default.TAP];\n\nfunction animate(lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Update\n var time = new Date().getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n var distanceRemaining = Math.abs(handle.y - targetLocation.y);\n var linearDistEachFrame = distanceRemaining / 10;\n\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nvar antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n};\n\nvar lastInteractionType = void 0,\n lastInteractionTime = void 0;\n\nfunction handleTap(type, e) {\n var now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nvar handleTapMouse = handleTap.bind(null, pointerType.mouse);\nvar handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents(element, eventList, interactionType) {\n var tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.addEventListener(eventName, tapHandler);\n });\n}\n\nfunction removeEvents(element, eventList, interactionType) {\n var tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.removeEventListener(eventName, tapHandler);\n });\n}\n\nvar mouseEvents = ['mousedown', 'mouseup'];\nvar touchEvents = ['touchstart', 'touchend'];\n\nfunction disable(element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable(element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nvar preventGhostClick = {\n enable: enable,\n disable: disable\n};\n\nexports.default = preventGhostClick;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (doubleTapCallback) {\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n element.addEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseToolInterface, preventHandleOutsideImage) {\n var toolType = mouseToolInterface.toolType;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(mouseEventData) {\n var element = mouseEventData.element;\n var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n (0, _moveHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback(e) {\n var eventData = e.detail;\n\n _toolCoordinates2.default.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n var imageNeedsUpdate = false;\n var coords = eventData.currentPoints.canvas;\n\n for (var i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n var data = toolData.data[i];\n\n if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove() {\n data.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(eventData.element, toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n }\n\n var coords = eventData.startPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n var i = void 0;\n\n // Now check to see if there is a handle we can move\n var distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n data.active = true;\n (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n var opt = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate\n };\n\n return toolInterface;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolCoordinates = __webpack_require__(37);\n\nvar _toolCoordinates2 = _interopRequireDefault(_toolCoordinates);\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _handleActivator = __webpack_require__(38);\n\nvar _handleActivator2 = _interopRequireDefault(_handleActivator);\n\nvar _moveHandle = __webpack_require__(24);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _moveAllHandles = __webpack_require__(39);\n\nvar _moveAllHandles2 = _interopRequireDefault(_moveAllHandles);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchPinchCallback) {\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n element.addEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = brushTool;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar brushLayerId = void 0;\n\nfunction brushTool(brushToolInterface) {\n var toolType = brushToolInterface.toolType;\n\n function mouseMoveCallback(e) {\n brushToolInterface.onMouseMove(e);\n }\n\n function mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n brushToolInterface.onMouseUp(e);\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n }\n\n function dragCallback(e) {\n brushToolInterface.onDrag(e);\n\n return false;\n }\n\n function mouseDownActivateCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n brushToolInterface.onMouseDown(e);\n\n return false;\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n }\n\n function onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = void 0;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n (0, _toolState.addToolState)(element, TOOL_STATE_TOOL_TYPE, { pixelData: pixelData });\n }\n\n var layer = _externalModules2.default.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n\n brushToolInterface.onImageRendered(e);\n }\n\n function activate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n // TODO: Fix jQuery event\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var _enabledElement$image = enabledElement.image,\n width = _enabledElement$image.width,\n height = _enabledElement$image.height;\n\n var pixelData = new Uint8ClampedArray(width * height);\n\n var configuration = brushTool.getConfiguration();\n var colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n var colormap = _externalModules2.default.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n var labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: function getPixelData() {\n return pixelData;\n },\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height: height,\n width: width,\n pixelData: pixelData,\n setPixelData: function setPixelData(data) {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n var layer = void 0;\n var options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = _externalModules2.default.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = _externalModules2.default.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n (0, _toolState.addToolState)(element, TOOL_STATE_TOOL_TYPE, { pixelData: pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n function deactivate(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n }\n\n var brushTool = (0, _mouseButtonTool2.default)({\n mouseMoveCallback: mouseMoveCallback,\n mouseDownActivateCallback: mouseDownActivateCallback,\n onImageRendered: onImageRendered,\n deactivate: deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getCircle;\nfunction getCircle(radius, rows, columns) {\n var xCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var yCoord = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n\n var x0 = Math.round(xCoord);\n var y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n var circleArray = [];\n var index = 0;\n\n for (var y = -radius; y <= radius; y++) {\n var _yCoord = y0 + y;\n\n if (_yCoord > rows || _yCoord < 0) {\n continue;\n }\n\n for (var x = -radius; x <= radius; x++) {\n var _xCoord = x0 + x;\n\n if (_xCoord > columns || _xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.drawBrushOnCanvas = exports.drawBrushPixels = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction drawBrushPixels(pointerArray, storedPixels, brushPixelValue, columns) {\n var getPixelIndex = function getPixelIndex(x, y) {\n return y * columns + x;\n };\n\n pointerArray.forEach(function (point) {\n var spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas(pointerArray, canvasContext, color, element) {\n var canvasPtTL = _externalModules2.default.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n var canvasPtBR = _externalModules2.default.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n var sizeX = canvasPtBR.x - canvasPtTL.x;\n var sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach(function (point) {\n var canvasPt = _externalModules2.default.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexports.drawBrushPixels = drawBrushPixels;\nexports.drawBrushOnCanvas = drawBrushOnCanvas;\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nObject.defineProperty(exports, 'external', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_externalModules).default;\n }\n});\n\nvar _index = __webpack_require__(62);\n\nObject.defineProperty(exports, 'referenceLines', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index).default;\n }\n});\n\nvar _index2 = __webpack_require__(43);\n\nObject.defineProperty(exports, 'orientation', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index2).default;\n }\n});\n\nvar _requestPoolManager = __webpack_require__(29);\n\nObject.defineProperty(exports, 'requestPoolManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_requestPoolManager).default;\n }\n});\n\nvar _setContextToDisplayFontSize = __webpack_require__(66);\n\nObject.defineProperty(exports, 'setContextToDisplayFontSize', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setContextToDisplayFontSize).default;\n }\n});\n\nvar _scrollToIndex = __webpack_require__(44);\n\nObject.defineProperty(exports, 'scrollToIndex', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scrollToIndex).default;\n }\n});\n\nvar _scroll = __webpack_require__(31);\n\nObject.defineProperty(exports, 'scroll', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scroll).default;\n }\n});\n\nvar _roundToDecimal = __webpack_require__(32);\n\nObject.defineProperty(exports, 'roundToDecimal', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_roundToDecimal).default;\n }\n});\n\nvar _pointProjector = __webpack_require__(28);\n\nObject.defineProperty(exports, 'projectPatientPointToImagePlane', {\n enumerable: true,\n get: function get() {\n return _pointProjector.projectPatientPointToImagePlane;\n }\n});\nObject.defineProperty(exports, 'imagePointToPatientPoint', {\n enumerable: true,\n get: function get() {\n return _pointProjector.imagePointToPatientPoint;\n }\n});\nObject.defineProperty(exports, 'planePlaneIntersection', {\n enumerable: true,\n get: function get() {\n return _pointProjector.planePlaneIntersection;\n }\n});\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nObject.defineProperty(exports, 'pointInsideBoundingBox', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pointInsideBoundingBox).default;\n }\n});\n\nvar _pointInEllipse = __webpack_require__(33);\n\nObject.defineProperty(exports, 'pointInEllipse', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pointInEllipse).default;\n }\n});\n\nvar _pauseEvent = __webpack_require__(34);\n\nObject.defineProperty(exports, 'pauseEvent', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pauseEvent).default;\n }\n});\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nObject.defineProperty(exports, 'isMouseButtonEnabled', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_isMouseButtonEnabled).default;\n }\n});\n\nvar _getRGBPixels = __webpack_require__(35);\n\nObject.defineProperty(exports, 'getRGBPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getRGBPixels).default;\n }\n});\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nObject.defineProperty(exports, 'getDefaultSimultaneousRequests', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getDefaultSimultaneousRequests;\n }\n});\nObject.defineProperty(exports, 'getMaxSimultaneousRequests', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getMaxSimultaneousRequests;\n }\n});\nObject.defineProperty(exports, 'getBrowserInfo', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getBrowserInfo;\n }\n});\nObject.defineProperty(exports, 'isMobileDevice', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.isMobileDevice;\n }\n});\n\nvar _getLuminance = __webpack_require__(46);\n\nObject.defineProperty(exports, 'getLuminance', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getLuminance).default;\n }\n});\n\nvar _drawTextBox = __webpack_require__(7);\n\nObject.defineProperty(exports, 'drawTextBox', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawTextBox).default;\n }\n});\n\nvar _drawEllipse = __webpack_require__(47);\n\nObject.defineProperty(exports, 'drawEllipse', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawEllipse).default;\n }\n});\n\nvar _drawCircle = __webpack_require__(48);\n\nObject.defineProperty(exports, 'drawCircle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawCircle).default;\n }\n});\n\nvar _drawArrow = __webpack_require__(49);\n\nObject.defineProperty(exports, 'drawArrow', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawArrow).default;\n }\n});\n\nvar _copyPoints = __webpack_require__(36);\n\nObject.defineProperty(exports, 'copyPoints', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_copyPoints).default;\n }\n});\n\nvar _calculateSUV = __webpack_require__(20);\n\nObject.defineProperty(exports, 'calculateSUV', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_calculateSUV).default;\n }\n});\n\nvar _calculateEllipseStatistics = __webpack_require__(50);\n\nObject.defineProperty(exports, 'calculateEllipseStatistics', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_calculateEllipseStatistics).default;\n }\n});\n\nvar _probeTool4D = __webpack_require__(67);\n\nObject.defineProperty(exports, 'probeTool4D', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_probeTool4D).default;\n }\n});\n\nvar _incrementTimePoint = __webpack_require__(40);\n\nObject.defineProperty(exports, 'incrementTimePoint', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_incrementTimePoint).default;\n }\n});\n\nvar _timeSeriesPlayer = __webpack_require__(70);\n\nObject.defineProperty(exports, 'timeSeriesPlayer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_timeSeriesPlayer).default;\n }\n});\n\nvar _timeSeriesScroll = __webpack_require__(71);\n\nObject.defineProperty(exports, 'timeSeriesScroll', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScroll;\n }\n});\nObject.defineProperty(exports, 'timeSeriesScrollWheel', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScrollWheel;\n }\n});\nObject.defineProperty(exports, 'timeSeriesScrollTouchDrag', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScrollTouchDrag;\n }\n});\n\nvar _wwwcSynchronizer = __webpack_require__(72);\n\nObject.defineProperty(exports, 'wwwcSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_wwwcSynchronizer).default;\n }\n});\n\nvar _updateImageSynchronizer = __webpack_require__(73);\n\nObject.defineProperty(exports, 'updateImageSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_updateImageSynchronizer).default;\n }\n});\n\nvar _Synchronizer = __webpack_require__(74);\n\nObject.defineProperty(exports, 'Synchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_Synchronizer).default;\n }\n});\n\nvar _stackScrollSynchronizer = __webpack_require__(75);\n\nObject.defineProperty(exports, 'stackScrollSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackScrollSynchronizer).default;\n }\n});\n\nvar _stackImagePositionSynchronizer = __webpack_require__(76);\n\nObject.defineProperty(exports, 'stackImagePositionSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImagePositionSynchronizer).default;\n }\n});\n\nvar _stackImagePositionOffsetSynchronizer = __webpack_require__(77);\n\nObject.defineProperty(exports, 'stackImagePositionOffsetSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImagePositionOffsetSynchronizer).default;\n }\n});\n\nvar _stackImageIndexSynchronizer = __webpack_require__(78);\n\nObject.defineProperty(exports, 'stackImageIndexSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImageIndexSynchronizer).default;\n }\n});\n\nvar _panZoomSynchronizer = __webpack_require__(79);\n\nObject.defineProperty(exports, 'panZoomSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_panZoomSynchronizer).default;\n }\n});\n\nvar _toolStyle = __webpack_require__(8);\n\nObject.defineProperty(exports, 'toolStyle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolStyle).default;\n }\n});\n\nvar _toolState = __webpack_require__(2);\n\nObject.defineProperty(exports, 'addToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.addToolState;\n }\n});\nObject.defineProperty(exports, 'getToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.getToolState;\n }\n});\nObject.defineProperty(exports, 'removeToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.removeToolState;\n }\n});\nObject.defineProperty(exports, 'clearToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.clearToolState;\n }\n});\nObject.defineProperty(exports, 'setElementToolStateManager', {\n enumerable: true,\n get: function get() {\n return _toolState.setElementToolStateManager;\n }\n});\nObject.defineProperty(exports, 'getElementToolStateManager', {\n enumerable: true,\n get: function get() {\n return _toolState.getElementToolStateManager;\n }\n});\n\nvar _toolCoordinates = __webpack_require__(37);\n\nObject.defineProperty(exports, 'toolCoordinates', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolCoordinates).default;\n }\n});\n\nvar _toolColors = __webpack_require__(6);\n\nObject.defineProperty(exports, 'toolColors', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolColors).default;\n }\n});\n\nvar _timeSeriesSpecificStateManager = __webpack_require__(80);\n\nObject.defineProperty(exports, 'addTimeSeriesStateManager', {\n enumerable: true,\n get: function get() {\n return _timeSeriesSpecificStateManager.addTimeSeriesStateManager;\n }\n});\nObject.defineProperty(exports, 'newTimeSeriesSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _timeSeriesSpecificStateManager.newTimeSeriesSpecificToolStateManager;\n }\n});\n\nvar _textStyle = __webpack_require__(14);\n\nObject.defineProperty(exports, 'textStyle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_textStyle).default;\n }\n});\n\nvar _stackSpecificStateManager = __webpack_require__(81);\n\nObject.defineProperty(exports, 'stackSpecificStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.stackSpecificStateManager;\n }\n});\nObject.defineProperty(exports, 'newStackSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.newStackSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'addStackStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.addStackStateManager;\n }\n});\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nObject.defineProperty(exports, 'loadHandlerManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_loadHandlerManager).default;\n }\n});\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nObject.defineProperty(exports, 'newImageIdSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _imageIdSpecificStateManager.newImageIdSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'globalImageIdSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n});\n\nvar _frameOfReferenceStateManager = __webpack_require__(82);\n\nObject.defineProperty(exports, 'newFrameOfReferenceSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _frameOfReferenceStateManager.newFrameOfReferenceSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'globalFrameOfReferenceSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _frameOfReferenceStateManager.globalFrameOfReferenceSpecificToolStateManager;\n }\n});\n\nvar _appState = __webpack_require__(83);\n\nObject.defineProperty(exports, 'appState', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_appState).default;\n }\n});\n\nvar _stackScrollKeyboard = __webpack_require__(84);\n\nObject.defineProperty(exports, 'stackScrollKeyboard', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackScrollKeyboard).default;\n }\n});\n\nvar _stackScroll = __webpack_require__(45);\n\nObject.defineProperty(exports, 'stackScroll', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScroll;\n }\n});\nObject.defineProperty(exports, 'stackScrollWheel', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollWheel;\n }\n});\nObject.defineProperty(exports, 'stackScrollTouchDrag', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollTouchDrag;\n }\n});\nObject.defineProperty(exports, 'stackScrollMultiTouch', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollMultiTouch;\n }\n});\n\nvar _stackPrefetch = __webpack_require__(85);\n\nObject.defineProperty(exports, 'stackPrefetch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackPrefetch).default;\n }\n});\n\nvar _scrollIndicator = __webpack_require__(86);\n\nObject.defineProperty(exports, 'scrollIndicator', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scrollIndicator).default;\n }\n});\n\nvar _stackRenderers = __webpack_require__(87);\n\nObject.defineProperty(exports, 'stackRenderers', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackRenderers).default;\n }\n});\n\nvar _playClip = __webpack_require__(89);\n\nObject.defineProperty(exports, 'playClip', {\n enumerable: true,\n get: function get() {\n return _playClip.playClip;\n }\n});\nObject.defineProperty(exports, 'stopClip', {\n enumerable: true,\n get: function get() {\n return _playClip.stopClip;\n }\n});\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nObject.defineProperty(exports, 'anyHandlesOutsideImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_anyHandlesOutsideImage).default;\n }\n});\n\nvar _drawHandles = __webpack_require__(10);\n\nObject.defineProperty(exports, 'drawHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawHandles).default;\n }\n});\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nObject.defineProperty(exports, 'getHandleNearImagePoint', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getHandleNearImagePoint).default;\n }\n});\n\nvar _handleActivator = __webpack_require__(38);\n\nObject.defineProperty(exports, 'handleActivator', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_handleActivator).default;\n }\n});\n\nvar _moveAllHandles = __webpack_require__(39);\n\nObject.defineProperty(exports, 'moveAllHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveAllHandles).default;\n }\n});\n\nvar _moveHandle = __webpack_require__(24);\n\nObject.defineProperty(exports, 'moveHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveHandle).default;\n }\n});\n\nvar _moveNewHandle = __webpack_require__(25);\n\nObject.defineProperty(exports, 'moveNewHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveNewHandle).default;\n }\n});\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nObject.defineProperty(exports, 'moveNewHandleTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveNewHandleTouch).default;\n }\n});\n\nvar _touchMoveAllHandles = __webpack_require__(52);\n\nObject.defineProperty(exports, 'touchMoveAllHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchMoveAllHandles).default;\n }\n});\n\nvar _touchMoveHandle = __webpack_require__(53);\n\nObject.defineProperty(exports, 'touchMoveHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchMoveHandle).default;\n }\n});\n\nvar _keyboardInput = __webpack_require__(90);\n\nObject.defineProperty(exports, 'keyboardInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyboardInput).default;\n }\n});\n\nvar _mouseInput = __webpack_require__(91);\n\nObject.defineProperty(exports, 'mouseInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseInput).default;\n }\n});\n\nvar _mouseWheelInput = __webpack_require__(92);\n\nObject.defineProperty(exports, 'mouseWheelInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseWheelInput).default;\n }\n});\n\nvar _preventGhostClick = __webpack_require__(54);\n\nObject.defineProperty(exports, 'preventGhostClick', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_preventGhostClick).default;\n }\n});\n\nvar _touchInput = __webpack_require__(93);\n\nObject.defineProperty(exports, 'touchInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchInput).default;\n }\n});\n\nvar _angleTool = __webpack_require__(94);\n\nObject.defineProperty(exports, 'angle', {\n enumerable: true,\n get: function get() {\n return _angleTool.angle;\n }\n});\nObject.defineProperty(exports, 'angleTouch', {\n enumerable: true,\n get: function get() {\n return _angleTool.angleTouch;\n }\n});\n\nvar _arrowAnnotate = __webpack_require__(95);\n\nObject.defineProperty(exports, 'arrowAnnotate', {\n enumerable: true,\n get: function get() {\n return _arrowAnnotate.arrowAnnotate;\n }\n});\nObject.defineProperty(exports, 'arrowAnnotateTouch', {\n enumerable: true,\n get: function get() {\n return _arrowAnnotate.arrowAnnotateTouch;\n }\n});\n\nvar _crosshairs = __webpack_require__(96);\n\nObject.defineProperty(exports, 'crosshairs', {\n enumerable: true,\n get: function get() {\n return _crosshairs.crosshairs;\n }\n});\nObject.defineProperty(exports, 'crosshairsTouch', {\n enumerable: true,\n get: function get() {\n return _crosshairs.crosshairsTouch;\n }\n});\n\nvar _displayTool = __webpack_require__(26);\n\nObject.defineProperty(exports, 'displayTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_displayTool).default;\n }\n});\n\nvar _doubleTapTool = __webpack_require__(55);\n\nObject.defineProperty(exports, 'doubleTapTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_doubleTapTool).default;\n }\n});\n\nvar _doubleTapZoom = __webpack_require__(97);\n\nObject.defineProperty(exports, 'doubleTapZoom', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_doubleTapZoom).default;\n }\n});\n\nvar _dragProbe = __webpack_require__(98);\n\nObject.defineProperty(exports, 'dragProbe', {\n enumerable: true,\n get: function get() {\n return _dragProbe.dragProbe;\n }\n});\nObject.defineProperty(exports, 'dragProbeTouch', {\n enumerable: true,\n get: function get() {\n return _dragProbe.dragProbeTouch;\n }\n});\n\nvar _ellipticalRoi = __webpack_require__(99);\n\nObject.defineProperty(exports, 'ellipticalRoi', {\n enumerable: true,\n get: function get() {\n return _ellipticalRoi.ellipticalRoi;\n }\n});\nObject.defineProperty(exports, 'ellipticalRoiTouch', {\n enumerable: true,\n get: function get() {\n return _ellipticalRoi.ellipticalRoiTouch;\n }\n});\n\nvar _freehand = __webpack_require__(100);\n\nObject.defineProperty(exports, 'freehand', {\n enumerable: true,\n get: function get() {\n return _freehand.freehand;\n }\n});\n\nvar _highlight = __webpack_require__(101);\n\nObject.defineProperty(exports, 'highlight', {\n enumerable: true,\n get: function get() {\n return _highlight.highlight;\n }\n});\nObject.defineProperty(exports, 'highlightTouch', {\n enumerable: true,\n get: function get() {\n return _highlight.highlightTouch;\n }\n});\n\nvar _imageStats = __webpack_require__(102);\n\nObject.defineProperty(exports, 'imageStats', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_imageStats).default;\n }\n});\n\nvar _keyboardTool = __webpack_require__(51);\n\nObject.defineProperty(exports, 'keyboardTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyboardTool).default;\n }\n});\n\nvar _length = __webpack_require__(103);\n\nObject.defineProperty(exports, 'length', {\n enumerable: true,\n get: function get() {\n return _length.length;\n }\n});\nObject.defineProperty(exports, 'lengthTouch', {\n enumerable: true,\n get: function get() {\n return _length.lengthTouch;\n }\n});\n\nvar _magnify = __webpack_require__(104);\n\nObject.defineProperty(exports, 'magnify', {\n enumerable: true,\n get: function get() {\n return _magnify.magnify;\n }\n});\nObject.defineProperty(exports, 'magnifyTouchDrag', {\n enumerable: true,\n get: function get() {\n return _magnify.magnifyTouchDrag;\n }\n});\n\nvar _mouseButtonRectangleTool = __webpack_require__(56);\n\nObject.defineProperty(exports, 'mouseButtonRectangleTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseButtonRectangleTool).default;\n }\n});\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nObject.defineProperty(exports, 'mouseButtonTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseButtonTool).default;\n }\n});\n\nvar _mouseWheelTool = __webpack_require__(23);\n\nObject.defineProperty(exports, 'mouseWheelTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseWheelTool).default;\n }\n});\n\nvar _multiTouchDragTool = __webpack_require__(30);\n\nObject.defineProperty(exports, 'multiTouchDragTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_multiTouchDragTool).default;\n }\n});\n\nvar _orientationMarkers = __webpack_require__(105);\n\nObject.defineProperty(exports, 'orientationMarkers', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_orientationMarkers).default;\n }\n});\n\nvar _pan = __webpack_require__(106);\n\nObject.defineProperty(exports, 'pan', {\n enumerable: true,\n get: function get() {\n return _pan.pan;\n }\n});\nObject.defineProperty(exports, 'panTouchDrag', {\n enumerable: true,\n get: function get() {\n return _pan.panTouchDrag;\n }\n});\n\nvar _panMultiTouch = __webpack_require__(107);\n\nObject.defineProperty(exports, 'panMultiTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_panMultiTouch).default;\n }\n});\n\nvar _probe = __webpack_require__(108);\n\nObject.defineProperty(exports, 'probe', {\n enumerable: true,\n get: function get() {\n return _probe.probe;\n }\n});\nObject.defineProperty(exports, 'probeTouch', {\n enumerable: true,\n get: function get() {\n return _probe.probeTouch;\n }\n});\n\nvar _rectangleRoi = __webpack_require__(109);\n\nObject.defineProperty(exports, 'rectangleRoi', {\n enumerable: true,\n get: function get() {\n return _rectangleRoi.rectangleRoi;\n }\n});\nObject.defineProperty(exports, 'rectangleRoiTouch', {\n enumerable: true,\n get: function get() {\n return _rectangleRoi.rectangleRoiTouch;\n }\n});\n\nvar _rotate = __webpack_require__(110);\n\nObject.defineProperty(exports, 'rotate', {\n enumerable: true,\n get: function get() {\n return _rotate.rotate;\n }\n});\nObject.defineProperty(exports, 'rotateTouchDrag', {\n enumerable: true,\n get: function get() {\n return _rotate.rotateTouchDrag;\n }\n});\n\nvar _rotateTouch = __webpack_require__(111);\n\nObject.defineProperty(exports, 'rotateTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_rotateTouch).default;\n }\n});\n\nvar _saveAs = __webpack_require__(112);\n\nObject.defineProperty(exports, 'saveAs', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_saveAs).default;\n }\n});\n\nvar _seedAnnotate = __webpack_require__(113);\n\nObject.defineProperty(exports, 'seedAnnotate', {\n enumerable: true,\n get: function get() {\n return _seedAnnotate.seedAnnotate;\n }\n});\nObject.defineProperty(exports, 'seedAnnotateTouch', {\n enumerable: true,\n get: function get() {\n return _seedAnnotate.seedAnnotateTouch;\n }\n});\n\nvar _simpleAngle = __webpack_require__(114);\n\nObject.defineProperty(exports, 'simpleAngle', {\n enumerable: true,\n get: function get() {\n return _simpleAngle.simpleAngle;\n }\n});\nObject.defineProperty(exports, 'simpleAngleTouch', {\n enumerable: true,\n get: function get() {\n return _simpleAngle.simpleAngleTouch;\n }\n});\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nObject.defineProperty(exports, 'simpleMouseButtonTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_simpleMouseButtonTool).default;\n }\n});\n\nvar _textMarker = __webpack_require__(115);\n\nObject.defineProperty(exports, 'textMarker', {\n enumerable: true,\n get: function get() {\n return _textMarker.textMarker;\n }\n});\nObject.defineProperty(exports, 'textMarkerTouch', {\n enumerable: true,\n get: function get() {\n return _textMarker.textMarkerTouch;\n }\n});\n\nvar _touchDragTool = __webpack_require__(13);\n\nObject.defineProperty(exports, 'touchDragTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchDragTool).default;\n }\n});\n\nvar _touchPinchTool = __webpack_require__(57);\n\nObject.defineProperty(exports, 'touchPinchTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchPinchTool).default;\n }\n});\n\nvar _touchTool = __webpack_require__(11);\n\nObject.defineProperty(exports, 'touchTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchTool).default;\n }\n});\n\nvar _wwwc = __webpack_require__(116);\n\nObject.defineProperty(exports, 'wwwc', {\n enumerable: true,\n get: function get() {\n return _wwwc.wwwc;\n }\n});\nObject.defineProperty(exports, 'wwwcTouchDrag', {\n enumerable: true,\n get: function get() {\n return _wwwc.wwwcTouchDrag;\n }\n});\n\nvar _wwwcRegion = __webpack_require__(117);\n\nObject.defineProperty(exports, 'wwwcRegion', {\n enumerable: true,\n get: function get() {\n return _wwwcRegion.wwwcRegion;\n }\n});\nObject.defineProperty(exports, 'wwwcRegionTouch', {\n enumerable: true,\n get: function get() {\n return _wwwcRegion.wwwcRegionTouch;\n }\n});\n\nvar _zoom = __webpack_require__(118);\n\nObject.defineProperty(exports, 'zoom', {\n enumerable: true,\n get: function get() {\n return _zoom.zoom;\n }\n});\nObject.defineProperty(exports, 'zoomWheel', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomWheel;\n }\n});\nObject.defineProperty(exports, 'zoomTouchPinch', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomTouchPinch;\n }\n});\nObject.defineProperty(exports, 'zoomTouchDrag', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomTouchDrag;\n }\n});\n\nvar _brush = __webpack_require__(119);\n\nObject.defineProperty(exports, 'brush', {\n enumerable: true,\n get: function get() {\n return _brush.brush;\n }\n});\n\nvar _adaptiveBrush = __webpack_require__(120);\n\nObject.defineProperty(exports, 'adaptiveBrush', {\n enumerable: true,\n get: function get() {\n return _adaptiveBrush.adaptiveBrush;\n }\n});\n\nvar _version = __webpack_require__(121);\n\nObject.defineProperty(exports, 'version', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_version).default;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _calculateReferenceLine = __webpack_require__(41);\n\nvar _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine);\n\nvar _referenceLinesTool = __webpack_require__(63);\n\nvar _referenceLinesTool2 = _interopRequireDefault(_referenceLinesTool);\n\nvar _renderActiveReferenceLine = __webpack_require__(42);\n\nvar _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar referenceLines = {\n calculateReferenceLine: _calculateReferenceLine2.default,\n tool: _referenceLinesTool2.default,\n renderActiveReferenceLine: _renderActiveReferenceLine2.default\n};\n\nexports.default = referenceLines;\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _renderActiveReferenceLine = __webpack_require__(42);\n\nvar _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'referenceLines';\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n var syncContext = toolData.data[0].synchronizationContext;\n var enabledElements = syncContext.getSourceElements();\n\n var renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach(function (referenceEnabledElement) {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable(element, synchronizationContext, renderer) {\n renderer = renderer || _renderActiveReferenceLine2.default;\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext,\n renderer: renderer\n });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nvar tool = {\n enable: enable,\n disable: disable\n};\n\nexports.default = tool;\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (vector) {\n var vec3 = (0, _convertToVector2.default)(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n var orientation = '';\n var orientationX = vec3.x < 0 ? 'R' : 'L';\n var orientationY = vec3.y < 0 ? 'A' : 'P';\n var orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n var abs = new _externalModules2.default.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (var i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (string) {\n var inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n};\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, context, fontSize) {\n var fontScale = 0.1;\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n var lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n return {\n fontSize: scaledFontSize,\n lineHeight: lineHeight,\n fontScale: fontScale\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nvar _measurementManager = __webpack_require__(68);\n\nvar _measurementManager2 = _interopRequireDefault(_measurementManager);\n\nvar _lineSampleMeasurement = __webpack_require__(69);\n\nvar _lineSampleMeasurement2 = _interopRequireDefault(_lineSampleMeasurement);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'probe4D';\n\nfunction updateLineSample(measurementData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n var loader = void 0;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n var offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n var sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n var timeSeriestoolData = (0, _toolState.getToolState)(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n var timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n timeSeries: timeSeries,\n lineSample: new _lineSampleMeasurement2.default(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n _measurementManager2.default.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = 'white';\n var font = _textStyle2.default.getFont();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n var data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n context.stroke();\n\n context.font = font;\n\n var coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, data.handles.end.x + ', ' + data.handles.end.y, textCoords.x, textCoords.y, color);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar probeTool4D = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n toolType: toolType\n});\n\nexports.default = probeTool4D;\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This object manages a collection of measurements\nfunction MeasurementManager() {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n var index = that.measurements.push(measurement);\n // Fire event\n var eventDetail = {\n index: index,\n measurement: measurement\n };\n\n (0, _triggerEvent2.default)(cornerstone.events, _events2.default.MEASUREMENT_ADDED, eventDetail);\n };\n\n this.remove = function (index) {\n var measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n var eventDetail = {\n index: index,\n measurement: measurement\n };\n\n (0, _triggerEvent2.default)(cornerstone.events, _events2.default.MEASUREMENT_REMOVED, eventDetail);\n };\n}\n\n// Module/private exports\nvar manager = new MeasurementManager();\n\nexports.default = manager;\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n\n that.samples = [];\n\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n (0, _triggerEvent2.default)(cornerstone.events, _events2.default.LINE_SAMPLE_UPDATED);\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _toolState = __webpack_require__(2);\n\nvar _incrementTimePoint = __webpack_require__(40);\n\nvar _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip(element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n var timeSeriesToolData = (0, _toolState.getToolState)(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n var playClipData = void 0;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n (0, _toolState.addToolState)(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n (0, _incrementTimePoint2.default)(element, 1, true);\n } else {\n (0, _incrementTimePoint2.default)(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip(element) {\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n var playClipData = playClipToolData.data[0];\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nvar timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexports.default = timeSeriesPlayer;\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.timeSeriesScrollTouchDrag = exports.timeSeriesScrollWheel = exports.timeSeriesScroll = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _mouseWheelTool = __webpack_require__(23);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _incrementTimePoint = __webpack_require__(40);\n\nvar _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'timeSeriesScroll';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n (0, _enabledElementTools.setToolOptions)(toolType, element, options);\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n var toolData = (0, _toolState.getToolState)(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n var timeSeriesData = toolData.data[0];\n\n var pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n var timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n var timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n (0, _incrementTimePoint2.default)(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback(e) {\n var eventData = e.detail;\n var images = -eventData.direction;\n\n (0, _incrementTimePoint2.default)(eventData.element, images);\n}\n\nfunction onDrag(e) {\n var mouseMoveData = e.originalEvent.detail;\n var eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n var toolData = (0, _toolState.getToolState)(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n var timeSeriesDelta = eventData.deltaY / 3;\n var timeSeriesDeltaMod = eventData.deltaY % 3;\n\n (0, _incrementTimePoint2.default)(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nvar timeSeriesScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\nvar timeSeriesScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\nvar timeSeriesScrollTouchDrag = (0, _touchDragTool2.default)(onDrag);\n\nexports.timeSeriesScroll = timeSeriesScroll;\nexports.timeSeriesScrollWheel = timeSeriesScrollWheel;\nexports.timeSeriesScrollTouchDrag = timeSeriesScrollTouchDrag;\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the source and target viewports\n var sourceViewport = cornerstone.getViewport(sourceElement);\n var targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n _externalModules2.default.cornerstone.updateImage(targetElement);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction unique(array) {\n return array.filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n}\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer(event, handler) {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n var sourceElements = []; // Source elements fire the events we want to synchronize to\n var targetElements = []; // Target elements we want to synchronize to source elements\n\n var ignoreFiredEvents = false;\n var initialData = {};\n var eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n var sourceImageId = sourceEnabledElement.image.imageId;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n var targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n var targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n var targetImagePosition = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent(sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n var targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n var targetImageId = initialData.imageIds.targetElements[targetIndex];\n var sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n var sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n var positionDifference = void 0;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent(e) {\n var eventData = e.detail;\n\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n var index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n element.addEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n var index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n var index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n element.removeEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n var index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler(e) {\n var element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n var elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener(_events2.default.ELEMENT_DISABLED, disableHandler);\n element.addEventListener(_events2.default.ELEMENT_DISABLED, disableHandler);\n });\n };\n\n this.destroy = function () {\n var elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexports.default = Synchronizer;\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the stack of the target viewport\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n var newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n var finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceStackToolDataSource = (0, _toolState.getToolState)(sourceElement, 'stack');\n var sourceStackData = sourceStackToolDataSource.data[0];\n var targetStackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var targetStackData = targetStackToolDataSource.data[0];\n\n var newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the source and target viewports\n var sourceViewport = cornerstone.getViewport(sourceElement);\n var targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newTimeSeriesSpecificToolStateManager = exports.addTimeSeriesStateManager = undefined;\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _toolState = __webpack_require__(2);\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager(toolTypes, oldStateManager) {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState(element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n var toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState(element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n var imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n return imageIdToolStateManager;\n}\n\nvar timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager(element, tools) {\n tools = tools || ['timeSeries'];\n var oldStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n var timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n (0, _toolState.setElementToolStateManager)(element, timeSeriesSpecificStateManager);\n}\n\nexports.addTimeSeriesStateManager = addTimeSeriesStateManager;\nexports.newTimeSeriesSpecificToolStateManager = newTimeSeriesSpecificToolStateManager;\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addStackStateManager = exports.newStackSpecificToolStateManager = exports.stackSpecificStateManager = undefined;\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _toolState = __webpack_require__(2);\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager(toolTypes, oldStateManager) {\n var toolState = {};\n\n function saveToolState() {\n return toolState;\n }\n\n function restoreToolState(stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState(element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n var toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState(element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n var stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState: saveToolState,\n restoreToolState: restoreToolState,\n toolState: toolState\n };\n\n return stackSpecificToolStateManager;\n}\n\nvar stackStateManagers = [];\n\nfunction addStackStateManager(element, otherTools) {\n var oldStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (!oldStateManager) {\n oldStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n var stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n var stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n (0, _toolState.setElementToolStateManager)(element, stackSpecificStateManager);\n}\n\nvar stackSpecificStateManager = {\n newStackSpecificToolStateManager: newStackSpecificToolStateManager,\n addStackStateManager: addStackStateManager\n};\n\nexports.stackSpecificStateManager = stackSpecificStateManager;\nexports.newStackSpecificToolStateManager = newStackSpecificToolStateManager;\nexports.addStackStateManager = addStackStateManager;\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager() {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState(frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n var indexOfData = -1;\n\n for (var i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nvar globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexports.newFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager;\nexports.globalFrameOfReferenceSpecificToolStateManager = globalFrameOfReferenceSpecificToolStateManager;\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction saveApplicationState(elements) {\n // Save imageId-specific tool state data\n var appState = {\n imageIdToolState: _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n var toolStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (toolStateManager === _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = _externalModules2.default.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState(appState) {\n if (!appState.hasOwnProperty('imageIdToolState') || !appState.hasOwnProperty('elementToolState') || !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n\n // Restore all the imageId specific tool data\n _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n var element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n var toolStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (toolStateManager === _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n var savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nvar appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexports.default = appState;\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _scroll = __webpack_require__(31);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _keyboardTool = __webpack_require__(51);\n\nvar _keyboardTool2 = _interopRequireDefault(_keyboardTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback(e) {\n var eventData = e.detail;\n var keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n var images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n (0, _scroll2.default)(eventData.element, images);\n}\n\n// Module/private exports\nvar stackScrollKeyboard = (0, _keyboardTool2.default)(keyDownCallback);\n\nexports.default = stackScrollKeyboard;\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _requestPoolManager = __webpack_require__(29);\n\nvar _requestPoolManager2 = _interopRequireDefault(_requestPoolManager);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(2);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'stackPrefetch';\nvar requestType = 'prefetch';\n\nvar configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nvar resetPrefetchTimeout = void 0;\nvar resetPrefetchDelay = 10;\n\nfunction range(lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n var arr = [];\n var c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nvar max = function max(arr) {\n return Math.max.apply(null, arr);\n};\n\nvar min = function min(arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex(arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n var l = [];\n var h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch(element) {\n // Check to make sure stack data exists\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n var stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList(imageIdIndex) {\n var index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) {\n // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort(function (a, b) {\n return a - b;\n });\n var indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n var imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n var imageLoadObject = _externalModules2.default.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n _requestPoolManager2.default.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n var nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n var imageId = void 0;\n var nextImageIdIndex = void 0;\n var preventCache = false;\n\n function doneCallback(image) {\n // Console.log('prefetch done: ' + image.imageId);\n var imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n function failCallback(error) {\n console.log('prefetch errored: ' + error);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n var lowerIndex = nearest.low;\n var higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n var currentIndex = stack.currentImageIdIndex;\n var shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n var shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n var shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n var shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n _requestPoolManager2.default.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n _requestPoolManager2.default.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n _requestPoolManager2.default.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler(element) {\n return function (e) {\n var eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n var stackData = void 0;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = (0, _toolState.getToolState)(element, 'stack');\n } catch (error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n var imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated(e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n var element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch (error) {\n return;\n }\n }, resetPrefetchDelay);\n}\n\nfunction enable(element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n var stackPrefetchDataArray = (0, _toolState.getToolState)(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n var stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n var indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n (0, _toolState.addToolState)(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener(_events2.default.NEW_IMAGE, onImageUpdated);\n element.addEventListener(_events2.default.NEW_IMAGE, onImageUpdated);\n\n var promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n _externalModules2.default.cornerstone.events.removeEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n _externalModules2.default.cornerstone.events.addEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n}\n\nfunction disable(element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener(_events2.default.NEW_IMAGE, onImageUpdated);\n\n var promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n _externalModules2.default.cornerstone.events.removeEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n _requestPoolManager2.default.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n (0, _getMaxSimultaneousRequests.setMaxSimultaneousRequests)(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nvar stackPrefetch = {\n enable: enable,\n disable: disable,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nexports.default = stackPrefetch;\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _displayTool = __webpack_require__(26);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nvar scrollBarHeight = 6;\n\nvar configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var width = eventData.enabledElement.canvas.width;\n var height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n var context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n var config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var imageIds = stackData.data[0].imageIds;\n var currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n var cursorWidth = width / imageIds.length;\n var cursorHeight = height / imageIds.length;\n var xPosition = cursorWidth * currentImageIdIndex;\n var yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nvar scrollIndicator = (0, _displayTool2.default)(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexports.default = scrollIndicator;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fusionRenderer = __webpack_require__(88);\n\nvar _fusionRenderer2 = _interopRequireDefault(_fusionRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar stackRenderers = {};\n\nstackRenderers.FusionRenderer = _fusionRenderer2.default;\n\nexports.default = stackRenderers;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar FusionRenderer = function () {\n function FusionRenderer() {\n _classCallCheck(this, FusionRenderer);\n\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n _createClass(FusionRenderer, [{\n key: 'render',\n value: function render(element, imageStacks) {\n var _this = this;\n\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n var cornerstone = _externalModules2.default.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n var baseImageObject = imageStacks[0];\n var currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n var overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then(function (baseImage) {\n var baseLayerId = _this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n _this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach(function (imgObj, overlayLayerIndex) {\n var imageId = _this.findImageFn(imgObj.imageIds, currentImageId);\n var layerIndex = overlayLayerIndex + 1;\n var currentLayerId = _this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n _this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then(function (image) {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n }]);\n\n return FusionRenderer;\n}();\n\nexports.default = FusionRenderer;\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.stopClip = exports.playClip = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\n/* eslint no-bitwise:0 */\nfunction getPlayClipTimeouts(vector, speed) {\n\n var i = void 0;\n var sample = void 0;\n var delay = void 0;\n var sum = 0;\n var limit = vector.length;\n var timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = Number(vector[i]) / speed | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) {\n // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = sum / timeouts.length | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData(playClipData) {\n var id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent(element) {\n var eventDetail = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, _events2.default.CLIP_STOPPED, eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip(element, framesPerSecond) {\n var playClipData = void 0;\n var playClipTimeouts = void 0;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n var stackToolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n var stackRenderer = void 0;\n\n if (stackToolData.data.length > 1) {\n var stackRendererData = (0, _toolState.getToolState)(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n var stackData = stackToolData.data[0];\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n (0, _toolState.addToolState)(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (playClipData.ignoreFrameTimeVector !== true && playClipData.frameTimeVector && playClipData.frameTimeVector.length === stackData.imageIds.length) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n var playClipAction = function playClipAction() {\n\n // Hoisting of context variables\n var loader = void 0,\n startLoadingHandler = void 0,\n endLoadingHandler = void 0,\n errorLoadingHandler = void 0,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n var imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler() {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip(element) {\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n}\n\nexports.playClip = playClip;\nexports.stopClip = stopClip;\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mouseX = void 0;\nvar mouseY = void 0;\n\nfunction keyPress(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n\n var keyPressData = {\n event: window.event || e, // Old IE support\n element: element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n var keyPressEvents = {\n keydown: _events2.default.KEY_DOWN,\n keypress: _events2.default.KEY_PRESS,\n keyup: _events2.default.KEY_UP\n };\n\n (0, _triggerEvent2.default)(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove(e) {\n mouseX = e.pageX;\n mouseY = e.pageY;\n}\n\nvar keyboardEvents = ['keydown', 'keypress', 'keyup'];\n\nfunction enable(element) {\n keyboardEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, keyPress);\n element.addEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n element.addEventListener('mousemove', mouseMove);\n}\n\nfunction disable(element) {\n keyboardEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n}\n\n// Module exports\nvar keyboardInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = keyboardInput;\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _copyPoints = __webpack_require__(36);\n\nvar _copyPoints2 = _interopRequireDefault(_copyPoints);\n\nvar _pauseEvent = __webpack_require__(34);\n\nvar _pauseEvent2 = _interopRequireDefault(_pauseEvent);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isClickEvent = true;\nvar preventClickTimeout = void 0;\nvar clickDelay = 200;\n\nfunction getEventWhich(event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler() {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = _events2.default.MOUSE_DOUBLE_CLICK;\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n\n /* Note: It seems we can't trust MouseEvent.buttons for dblclick events?\n For some reason they are always firing with e.buttons = 0\n so we have to use e.which for now instead.\n Might be related to using preventDefault on the original mousedown or click events?\n */\n var eventData = {\n event: e,\n which: e.which,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n}\n\nfunction mouseDown(e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = _events2.default.MOUSE_DOWN;\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n element.removeEventListener('mousemove', mouseMove);\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n var eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n var eventPropagated = (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = _events2.default.MOUSE_DOWN_ACTIVATE;\n (0, _triggerEvent2.default)(eventData.element, _events2.default.MOUSE_DOWN_ACTIVATE, eventData);\n }\n\n var whichMouseButton = getEventWhich(e);\n\n function onMouseMove(e) {\n // Calculate our current points in page and image coordinates\n var eventType = _events2.default.MOUSE_DRAG;\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n\n // Prevent left click selection of DOM elements\n return (0, _pauseEvent2.default)(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp(e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n var eventType = _events2.default.MOUSE_UP;\n\n if (isClickEvent) {\n eventType = _events2.default.MOUSE_CLICK;\n }\n\n // Calculate our current points in page and image coordinates\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.addEventListener('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n\n return (0, _pauseEvent2.default)(e);\n}\n\nfunction mouseMove(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = _events2.default.MOUSE_MOVE;\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n\n // Calculate our current points in page and image coordinates\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n // Update the last points\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n}\n\nfunction disable(element) {\n element.removeEventListener('mousedown', mouseDown);\n element.removeEventListener('mousemove', mouseMove);\n element.removeEventListener('dblclick', mouseDoubleClick);\n}\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n element.addEventListener('mousedown', mouseDown);\n element.addEventListener('mousemove', mouseMove);\n element.addEventListener('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nvar mouseInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = mouseInput;\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseWheel(e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.type === 'mousewheel' && e.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.type === 'DOMMouseScroll' && e.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n\n var x = void 0;\n var y = void 0;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n var startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = window.event && window.event.wheelDelta ? window.event : e; // Old IE support\n\n var wheelDelta = void 0;\n\n if (e.wheelDelta) {\n wheelDelta = -e.wheelDelta;\n } else if (e.deltaY) {\n wheelDelta = -e.deltaY;\n } else if (e.detail) {\n wheelDelta = -e.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n var direction = wheelDelta < 0 ? -1 : 1;\n\n var mouseWheelData = {\n element: element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction: direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n (0, _triggerEvent2.default)(element, _events2.default.MOUSE_WHEEL, mouseWheelData);\n}\n\nvar mouseWheelEvents = ['mousewheel', 'DOMMouseScroll'];\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n mouseWheelEvents.forEach(function (eventType) {\n element.addEventListener(eventType, mouseWheel);\n });\n}\n\nfunction disable(element) {\n mouseWheelEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, mouseWheel);\n });\n}\n\n// Module exports\nvar mouseWheelInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = mouseWheelInput;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _copyPoints = __webpack_require__(36);\n\nvar _copyPoints2 = _interopRequireDefault(_copyPoints);\n\nvar _pauseEvent = __webpack_require__(34);\n\nvar _pauseEvent2 = _interopRequireDefault(_pauseEvent);\n\nvar _preventGhostClick = __webpack_require__(54);\n\nvar _preventGhostClick2 = _interopRequireDefault(_preventGhostClick);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar startPoints = void 0,\n currentPoints = void 0,\n lastPoints = void 0,\n deltaPoints = void 0,\n eventData = void 0,\n touchStartDelay = void 0,\n pressTimeout = void 0,\n pageDistanceMoved = void 0;\n\nvar lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta = void 0;\n\nvar pressDelay = 700,\n pressMaxDistance = 5;\n\nvar toolType = 'touchInput';\n\nfunction onTouch(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget || e.srcEvent.currentTarget;\n var eventType = void 0,\n scaleChange = void 0,\n delta = void 0,\n remainingPointers = void 0,\n rotation = void 0;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if (e.pointers && e.pointers.length > 1 || e.touches && e.touches.length > 1) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = _events2.default.TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = _events2.default.DOUBLE_TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_PINCH;\n eventData = {\n event: e,\n startPoints: startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange: scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_START;\n if (e.touches.length > 1) {\n eventType = _events2.default.MULTI_TOUCH_START;\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n var eventPropagated = (0, _triggerEvent2.default)(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = _events2.default.TOUCH_START_ACTIVE;\n if (e.touches.length > 1) {\n eventType = _events2.default.MULTI_TOUCH_START_ACTIVE;\n }\n\n eventData.type = eventType;\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = (0, _copyPoints2.default)(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_PRESS;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),\n client: {\n x: e.changedTouches[0].clientX,\n y: e.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_END;\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = _events2.default.TOUCH_DRAG;\n if (e.pointers.length > 1) {\n eventType = _events2.default.MULTI_TOUCH_DRAG;\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = _events2.default.TOUCH_DRAG_END;\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return (0, _pauseEvent2.default)(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = _events2.default.TOUCH_ROTATE;\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n rotation: rotation,\n type: eventType\n };\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable(element) {\n disable(element);\n var Hammer = _externalModules2.default.Hammer;\n\n var hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n var mc = new Hammer.Manager(element, hammerOptions);\n\n var panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n var pan = new Hammer.Pan(panOptions);\n var pinch = new Hammer.Pinch({\n threshold: 0\n });\n var rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n var doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n _preventGhostClick2.default.enable(element);\n\n var touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach(function (eventType) {\n element.addEventListener(eventType, onTouch);\n });\n\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n options.hammer = mc;\n\n (0, _enabledElementTools.setToolOptions)(toolType, element, options);\n}\n\nfunction disable(element) {\n _preventGhostClick2.default.disable(element);\n\n var touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, onTouch);\n });\n\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n var mc = options.hammer;\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nvar touchInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = touchInput;\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.angleTouch = exports.angle = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _roundToDecimal = __webpack_require__(32);\n\nvar _roundToDecimal2 = _interopRequireDefault(_roundToDecimal);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = angle.getConfiguration();\n var cornerstone = _externalModules2.default.cornerstone;\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n var dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n var dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n var dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n var dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n var _angle = Math.acos(Math.abs((dx1 * dx2 + dy1 * dy2) / (Math.sqrt(dx1 * dx1 + dy1 * dy1) * Math.sqrt(dx2 * dx2 + dy2 * dy2))));\n\n _angle *= 180 / Math.PI;\n\n var rAngle = (0, _roundToDecimal2.default)(_angle, 2);\n var str = '00B0'; // Degrees symbol\n var text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n var textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n var textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n (0, _drawTextBox2.default)(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar angle = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar angleTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.angle = angle;\nexports.angleTouch = angleTouch;\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.arrowAnnotateTouch = exports.arrowAnnotate = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawArrow = __webpack_require__(49);\n\nvar _drawArrow2 = _interopRequireDefault(_drawArrow);\n\nvar _moveNewHandle = __webpack_require__(25);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\n/* eslint no-alert:0 */\nfunction getTextCallback(doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback(data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nvar configuration = {\n getTextCallback: getTextCallback,\n changeTextCallback: changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var element = mouseEventData.element;\n var measurementData = createNewMeasurement(mouseEventData);\n var cornerstone = _externalModules2.default.cornerstone;\n\n function doneChangingTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(element);\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement(eventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var enabledElement = eventData.enabledElement;\n var cornerstone = _externalModules2.default.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = arrowAnnotate.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the arrow\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n (0, _drawArrow2.default)(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n (0, _drawArrow2.default)(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n if (config.drawHandles) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n var textWidth = context.measureText(data.text).width + 10;\n var textHeight = _textStyle2.default.getFontSize() + 10;\n\n var distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n var textCoords = void 0;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n var boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n var midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n var points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch(touchEventData) {\n var element = touchEventData.element;\n var measurementData = createNewMeasurement(touchEventData);\n var cornerstone = _externalModules2.default.cornerstone;\n\n function doneChangingTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n (0, _toolState.addToolState)(element, toolType, measurementData);\n element.removeEventListener(_events2.default.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n var data = void 0;\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar arrowAnnotate = (0, _mouseButtonTool2.default)({\n addNewMeasurement: addNewMeasurement,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nvar arrowAnnotateTouch = (0, _touchTool2.default)({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: pressCallback\n});\n\nexports.arrowAnnotate = arrowAnnotate;\nexports.arrowAnnotateTouch = arrowAnnotateTouch;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.crosshairsTouch = exports.crosshairs = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(2);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointProjector = __webpack_require__(28);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'crosshairs';\n\nfunction chooseLocation(e) {\n var eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceElement = e.currentTarget;\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n var sourceImageId = sourceEnabledElement.image.imageId;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n var sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n var patientPoint = (0, _pointProjector.imagePointToPatientPoint)(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n var syncContext = toolData.data[0].synchronizationContext;\n var enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n var stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var row = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var column = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var normal = column.clone().cross(row.clone());\n var distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction mouseDragCallback(e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enable(element, mouseButtonMask, synchronizationContext) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n // Clear any currently existing toolData\n (0, _toolState.clearToolState)(element, toolType);\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext\n });\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Module/private exports\nvar crosshairs = {\n activate: enable,\n deactivate: disable,\n enable: enable,\n disable: disable\n};\n\nfunction dragEndCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n}\n\nfunction dragStartCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.addEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.addEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n chooseLocation(e);\n\n return false;\n}\n\nfunction dragCallback(e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enableTouch(element, synchronizationContext) {\n // Clear any currently existing toolData\n (0, _toolState.clearToolState)(element, toolType);\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext\n });\n\n element.removeEventListener(_events2.default.TOUCH_START, dragStartCallback);\n\n element.addEventListener(_events2.default.TOUCH_START, dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch(element) {\n element.removeEventListener(_events2.default.TOUCH_START, dragStartCallback);\n}\n\nvar crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexports.crosshairs = crosshairs;\nexports.crosshairsTouch = crosshairsTouch;\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _doubleTapTool = __webpack_require__(55);\n\nvar _doubleTapTool2 = _interopRequireDefault(_doubleTapTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fitToWindowStrategy(eventData) {\n _externalModules2.default.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback(e) {\n var eventData = e.detail;\n\n doubleTapZoom.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar doubleTapZoom = (0, _doubleTapTool2.default)(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexports.default = doubleTapZoom;\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.dragProbeTouch = exports.dragProbe = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _getRGBPixels = __webpack_require__(35);\n\nvar _getRGBPixels2 = _interopRequireDefault(_getRGBPixels);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'dragProbe';\n\nvar dragEventData = void 0;\n\nfunction defaultStrategy(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getActiveColor();\n var font = _textStyle2.default.getFont();\n var fontHeight = _textStyle2.default.getFontSize();\n var config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var x = Math.round(eventData.currentPoints.image.x);\n var y = Math.round(eventData.currentPoints.image.y);\n\n var storedPixels = void 0;\n var text = void 0,\n str = void 0;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = (0, _getRGBPixels2.default)(eventData.element, x, y, 1, 1);\n text = x + ', ' + y;\n str = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2] + ' A: ' + storedPixels[3];\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n // Draw text\n text = x + ', ' + y;\n str = 'SP: ' + sp + ' MO: ' + parseFloat(mo.toFixed(3));\n if (suv) {\n str += ' SUV: ' + parseFloat(suv.toFixed(3));\n }\n }\n\n // Draw text\n var coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var enabledElement = cornerstone.getEnabledElement(element);\n var image = enabledElement.image;\n\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getActiveColor();\n var font = _textStyle2.default.getFont();\n var config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n var toolCoords = void 0;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y - _textStyle2.default.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y - _textStyle2.default.getFontSize() / 2);\n }\n\n var storedPixels = void 0;\n var text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 || toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = (0, _getRGBPixels2.default)(element, toolCoords.x, toolCoords.y, 1, 1);\n text = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2];\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n\n var modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += 'HU: ' + modalityPixelValueText;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n if (suv) {\n text += ' SUV: ' + parseFloat(suv.toFixed(2));\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n var textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n var translation = void 0;\n var handleRadius = 6;\n var width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -_textStyle2.default.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(_textStyle2.default.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n (0, _drawTextBox2.default)(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, imageRenderedCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.IMAGE_RENDERED, imageRenderedCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n dragProbe.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction imageRenderedCallback() {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n dragEventData = eventData;\n _externalModules2.default.cornerstone.updateImage(element);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar dragProbe = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nvar options = {\n fireOnTouchStart: true\n};\n\nvar dragProbeTouch = (0, _touchDragTool2.default)(dragCallback, options);\n\nexports.dragProbe = dragProbe;\nexports.dragProbeTouch = dragProbeTouch;\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ellipticalRoiTouch = exports.ellipticalRoi = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _drawEllipse = __webpack_require__(47);\n\nvar _drawEllipse2 = _interopRequireDefault(_drawEllipse);\n\nvar _pointInEllipse = __webpack_require__(33);\n\nvar _pointInEllipse2 = _interopRequireDefault(_pointInEllipse);\n\nvar _calculateEllipseStatistics = __webpack_require__(50);\n\nvar _calculateEllipseStatistics2 = _interopRequireDefault(_calculateEllipseStatistics);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse(element, data, coords, distance) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n var majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n var pointInMinorEllipse = (0, _pointInEllipse2.default)(minorEllipse, coords);\n var pointInMajorEllipse = (0, _pointInEllipse2.default)(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool(element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch(element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas(x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n var parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var image = eventData.image;\n var element = eventData.element;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = ellipticalRoi.getConfiguration();\n var context = eventData.canvasContext.canvas.getContext('2d');\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n var leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n var topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n var widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n var heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n (0, _drawEllipse2.default)(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n var handleOptions = {\n drawHandlesIfActive: true\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n var area = void 0,\n meanStdDev = void 0,\n meanStdDevSUV = void 0;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n var ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n var pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = (0, _calculateEllipseStatistics2.default)(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: (0, _calculateSUV2.default)(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: (0, _calculateSUV2.default)(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n var columnPixelSpacing = image.columnPixelSpacing || 1;\n var rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n var textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n var moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n var meanText = 'Mean: ' + numberWithCommas(meanStdDev.mean.toFixed(2)) + moSuffix;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n var stdDevText = 'StdDev: ' + numberWithCommas(meanStdDev.stdDev.toFixed(2)) + moSuffix;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n var SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n var suffix = ' mm' + String.fromCharCode(178);\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ' pixels' + String.fromCharCode(178);\n }\n\n // Create a line of text to display the area and its units\n var areaText = 'Area: ' + numberWithCommas(area.toFixed(2)) + suffix;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n var textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n var boundingBox = (0, _drawTextBox2.default)(context, textLines, textCoords.x, textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n var link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n var ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar ellipticalRoi = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar ellipticalRoiTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType: toolType\n});\n\nexports.ellipticalRoi = ellipticalRoi;\nexports.ellipticalRoiTouch = ellipticalRoiTouch;\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.freehand = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'freehand';\nvar configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n var data = toolData.data[config.currentTool];\n\n var handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle(eventData, toolIndex) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n var mousePoint = eventData.currentPoints.canvas;\n\n for (var i = 0; i < data.handles.length; i++) {\n var handleCanvas = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (_externalModules2.default.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var handleNearby = void 0;\n\n for (var toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby: handleNearby,\n toolIndex: toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n\n // Check if drawing is finished\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback(e) {\n var eventData = e.detail;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n var data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n var x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n var y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n var currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n var lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n var lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n var handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < data.handles.length - 1) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing(eventData) {\n var element = eventData.element;\n\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n\n var measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n var config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n (0, _toolState.addToolState)(eventData.element, toolType, measurementData);\n\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing(eventData, handleNearby) {\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n var data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n var handleNearby = void 0,\n toolIndex = void 0;\n\n var config = freehand.getConfiguration();\n var currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n var nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var fillColor = _toolColors2.default.getFillColor();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n fillColor = _toolColors2.default.getFillColor();\n } else {\n color = _toolColors2.default.getToolColor();\n fillColor = _toolColors2.default.getToolColor();\n }\n\n var handleStart = void 0;\n\n if (data.handles.length) {\n for (var j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (var k = 0; k < data.handles[j].lines.length; k++) {\n var lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n var mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === data.handles.length - 1) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n var options = {\n fill: fillColor\n };\n\n if (data.active) {\n (0, _drawHandles2.default)(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n\n// /////// END IMAGE RENDERING ///////\nfunction enable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module/private exports\nvar freehand = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nexports.freehand = freehand;\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.highlightTouch = exports.highlight = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonRectangleTool = __webpack_require__(56);\n\nvar _mouseButtonRectangleTool2 = _interopRequireDefault(_mouseButtonRectangleTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n var existingToolData = (0, _toolState.getToolState)(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var insideBox = false;\n\n if (coords.x >= rect.left && coords.x <= rect.left + rect.width && coords.y >= rect.top && coords.y <= rect.top + rect.height) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this elemen\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n\n context.save();\n\n var data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n var rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar preventHandleOutsideImage = true;\n\nvar highlight = (0, _mouseButtonRectangleTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n pointInsideRect: pointInsideRect,\n toolType: toolType\n}, preventHandleOutsideImage);\n\nvar highlightTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n pointInsideRect: pointInsideRect,\n toolType: toolType\n}, preventHandleOutsideImage);\n\nexports.highlight = highlight;\nexports.highlightTouch = highlightTouch;\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _displayTool = __webpack_require__(26);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var image = eventData.image;\n var stats = image.stats;\n\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n var text = key + ' : ' + stats[key];\n\n textLines.push(text);\n });\n\n (0, _drawTextBox2.default)(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nvar imageStats = (0, _displayTool2.default)(onImageRendered);\n\nexports.default = imageStats;\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.lengthTouch = exports.length = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n var image = eventData.image,\n element = eventData.element;\n\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = length.getConfiguration();\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n var rowPixelSpacing = void 0;\n var colPixelSpacing = void 0;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n var dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n var dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n var _length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = _length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n var suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n var text = '' + _length.toFixed(2) + suffix;\n\n if (!data.handles.textBox.hasMoved) {\n var coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n var textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n var boundingBox = (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n var link = {\n start: {},\n end: {}\n };\n\n var midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n var points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar length = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar lengthTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.length = length;\nexports.lengthTouch = lengthTouch;\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.magnifyTouchDrag = exports.magnify = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'magnify';\n\nvar configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nvar browserName = void 0;\n\nvar currentPoints = void 0;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool(eventData) {\n var element = eventData.element;\n\n element.querySelector('.magnifyTool').style.display = 'none';\n\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n drawMagnificationTool(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction newImageCallback(e) {\n var eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, dragEndCallback);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n element.addEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n element.addEventListener(_events2.default.TOUCH_END, dragEndCallback);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool(eventData) {\n var element = eventData.element;\n var magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n var config = magnify.getConfiguration();\n\n var magnifySize = config.magnifySize;\n var magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n var canvas = element.querySelector('canvas:not(.magnifyTool)');\n var context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n var getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n var canvasLocation = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n var copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n var scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = canvasLocation.y - 0.5 * magnifySize + 'px';\n magnifyCanvas.style.left = canvasLocation.x - 0.5 * magnifySize + 'px';\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas(element) {\n // If the magnifying glass canvas doesn't already exist\n if (element.querySelector('.magnifyTool') === null) {\n // Create a canvas and append it as a child to the element\n var magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n var config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas(element) {\n var magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (magnifyCanvas) {\n element.removeChild(magnifyCanvas);\n }\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable(element) {\n if (!browserName) {\n var infoString = (0, _getMaxSimultaneousRequests.getBrowserInfo)();\n var info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module exports\nvar magnify = {\n enable: enable,\n activate: activate,\n deactivate: disable,\n disable: disable,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nvar options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nvar magnifyTouchDrag = (0, _touchDragTool2.default)(dragCallback, options);\n\nexports.magnify = magnify;\nexports.magnifyTouchDrag = magnifyTouchDrag;\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _index = __webpack_require__(43);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _displayTool = __webpack_require__(26);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getOrientationMarkers(element) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(element);\n var imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n var rowString = _index2.default.getOrientationString(imagePlaneMetaData.rowCosines);\n var columnString = _index2.default.getOrientationString(imagePlaneMetaData.columnCosines);\n\n var oppositeRowString = _index2.default.invertOrientationString(rowString);\n var oppositeColumnString = _index2.default.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions(element) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(element);\n var coords = void 0;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n var top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n var bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n var left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n var right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right\n };\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n var markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n var coords = getOrientationMarkerPositions(element, markers);\n\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getToolColor();\n\n var textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n (0, _drawTextBox2.default)(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n (0, _drawTextBox2.default)(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n var config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n (0, _drawTextBox2.default)(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n (0, _drawTextBox2.default)(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar orientationMarkers = (0, _displayTool2.default)(onImageRendered);\n\nexports.default = orientationMarkers;\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.panTouchDrag = exports.pan = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'pan';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n var widthScale = eventData.viewport.scale;\n var heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing;\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing;\n }\n\n eventData.viewport.translation.x += eventData.deltaPoints.page.x / widthScale;\n eventData.viewport.translation.y += eventData.deltaPoints.page.y / heightScale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar pan = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\nvar panTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.pan = pan;\nexports.panTouchDrag = panTouchDrag;\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _multiTouchDragTool = __webpack_require__(30);\n\nvar _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction touchPanCallback(e) {\n var eventData = e.detail;\n var config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += eventData.deltaPoints.page.x / eventData.viewport.scale;\n eventData.viewport.translation.y += eventData.deltaPoints.page.y / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nvar configuration = {\n testPointers: function testPointers(eventData) {\n return eventData.numPointers >= 2;\n }\n};\n\nvar panMultiTouch = (0, _multiTouchDragTool2.default)(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexports.default = panMultiTouch;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.probeTouch = exports.probe = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _getRGBPixels = __webpack_require__(35);\n\nvar _getRGBPixels2 = _interopRequireDefault(_getRGBPixels);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool(element, data, coords) {\n var endCanvas = _externalModules2.default.cornerstone.pixelToCanvas(element, data.handles.end);\n\n return _externalModules2.default.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var font = _textStyle2.default.getFont();\n var fontHeight = _textStyle2.default.getFontSize();\n\n for (var i = 0; i < toolData.data.length; i++) {\n\n context.save();\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n\n var x = Math.round(data.handles.end.x);\n var y = Math.round(data.handles.end.y);\n var storedPixels = void 0;\n\n var text = void 0,\n str = void 0;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = x + ', ' + y;\n storedPixels = (0, _getRGBPixels2.default)(eventData.element, x, y, 1, 1);\n str = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2];\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n // Draw text\n text = x + ', ' + y;\n str = 'SP: ' + sp + ' MO: ' + parseFloat(mo.toFixed(3));\n if (suv) {\n str += ' SUV: ' + parseFloat(suv.toFixed(3));\n }\n }\n\n var coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar probe = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar probeTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.probe = probe;\nexports.probeTouch = probeTouch;\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rectangleRoiTouch = exports.rectangleRoi = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev(sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n var sum = 0;\n var sumSquared = 0;\n var count = 0;\n var index = 0;\n\n for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count: count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n var mean = sum / count;\n var variance = sumSquared / count - mean * mean;\n\n return {\n count: count,\n mean: mean,\n variance: variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas(x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n var parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var image = eventData.image;\n var element = eventData.element;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = rectangleRoi.getConfiguration();\n var context = eventData.canvasContext.canvas.getContext('2d');\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n var leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n var topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n var widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n var heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n var handleOptions = {\n drawHandlesIfActive: true\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n var area = void 0,\n meanStdDev = void 0,\n meanStdDevSUV = void 0;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n var ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n var pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: (0, _calculateSUV2.default)(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: (0, _calculateSUV2.default)(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n var columnPixelSpacing = image.columnPixelSpacing || 1;\n var rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = ellipse.width * columnPixelSpacing * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n var textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n var moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n var meanText = 'Mean: ' + numberWithCommas(meanStdDev.mean.toFixed(2)) + moSuffix;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n var stdDevText = 'StdDev: ' + numberWithCommas(meanStdDev.stdDev.toFixed(2)) + moSuffix;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n var SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n var suffix = ' mm' + String.fromCharCode(178);\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ' pixels' + String.fromCharCode(178);\n }\n\n // Create a line of text to display the area and its units\n var areaText = 'Area: ' + numberWithCommas(area.toFixed(2)) + suffix;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n var textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n var boundingBox = (0, _drawTextBox2.default)(context, textLines, textCoords.x, textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n var link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n var ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar rectangleRoi = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar rectangleRoiTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.rectangleRoi = rectangleRoi;\nexports.rectangleRoiTouch = rectangleRoiTouch;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rotateTouchDrag = exports.rotate = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'rotate';\n\n// --- Strategies --- //\nfunction defaultStrategy(eventData) {\n // Calculate distance from the center of the image\n var rect = eventData.element.getBoundingClientRect(eventData.element);\n\n var points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n var width = eventData.element.clientWidth;\n var height = eventData.element.clientHeight;\n\n var pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n var rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n var rotationDegrees = rotationRadians * (180 / Math.PI);\n var rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy(eventData) {\n eventData.viewport.rotation += eventData.deltaPoints.page.x / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy(eventData) {\n eventData.viewport.rotation += eventData.deltaPoints.page.y / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n\n rotate.strategy(eventData);\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar rotate = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nvar rotateTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.rotate = rotate;\nexports.rotateTouchDrag = rotateTouchDrag;\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction touchRotateCallback(e) {\n var eventData = e.detail;\n\n eventData.viewport.rotation += eventData.rotation;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable(element) {\n element.removeEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback);\n}\n\nfunction activate(element) {\n element.removeEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback);\n element.addEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback);\n}\n\nvar rotateTouch = {\n activate: activate,\n disable: disable\n};\n\nexports.default = rotateTouch;\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = saveAs;\nfunction saveAs(element, filename) {\n var mimetype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png';\n\n // Setting the default value for mimetype to image/png\n var canvas = element.querySelector('canvas');\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n var lnk = document.createElement('a');\n\n // The key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // Convert canvas content to data-uri for link. When download\n // Attribute is set the content pointed to by link will be\n // Pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n var e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n } else if (lnk.fireEvent) {\n lnk.fireEvent('onclick');\n }\n}\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.seedAnnotateTouch = exports.seedAnnotate = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _moveHandle = __webpack_require__(24);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawCircle = __webpack_require__(48);\n\nvar _drawCircle2 = _interopRequireDefault(_drawCircle);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-alert:0 */\nvar toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback(doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback(data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nvar configuration = {\n getTextCallback: getTextCallback,\n changeTextCallback: changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n var config = seedAnnotate.getConfiguration();\n var measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n (0, _moveHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n var realCoords = _externalModules2.default.cornerstone.pixelToCanvas(element, data.handles.end);\n var distanceToPoint = _externalModules2.default.cornerstoneMath.point.distance(realCoords, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n var canvasWidth = eventData.canvasContext.canvas.width;\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = seedAnnotate.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw\n var handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n (0, _drawCircle2.default)(context, handleCanvas, color, lineWidth);\n\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n if (config.drawHandles) {\n (0, _drawHandles2.default)(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n var textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = data.text + ' x: ' + Math.round(data.handles.end.x) + ' y: ' + Math.round(data.handles.end.y);\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n var textWidth = context.measureText(textPlusCoords).width + 10;\n var textHeight = _textStyle2.default.getFontSize() + 10;\n\n var distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > canvasWidth / 2) {\n distance = -distance;\n }\n\n var textCoords = void 0;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n var boundingBox = (0, _drawTextBox2.default)(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch(touchEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n var config = seedAnnotate.getConfiguration();\n var measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n (0, _moveHandle2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n var config = seedAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction pressCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback);\n }\n\n var config = seedAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar seedAnnotate = (0, _mouseButtonTool2.default)({\n addNewMeasurement: addNewMeasurement,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nvar seedAnnotateTouch = (0, _touchTool2.default)({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: pressCallback\n});\n\nexports.seedAnnotate = seedAnnotate;\nexports.seedAnnotateTouch = seedAnnotateTouch;\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleAngleTouch = exports.simpleAngle = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _roundToDecimal = __webpack_require__(32);\n\nvar _roundToDecimal2 = _interopRequireDefault(_roundToDecimal);\n\nvar _textStyle = __webpack_require__(14);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _anyHandlesOutsideImage = __webpack_require__(15);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _moveNewHandle = __webpack_require__(25);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\nfunction length(vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = simpleAngle.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n var columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n var rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n var suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n var sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n var sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n var sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n var sideALength = length(sideA);\n var sideBLength = length(sideB);\n var sideCLength = length(sideC);\n\n // Cosine law\n var angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= 180 / Math.PI;\n\n var rAngle = (0, _roundToDecimal2.default)(angle, 2);\n\n if (rAngle) {\n var str = '00B0'; // Degrees symbol\n var text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n var distance = 15;\n\n var textCoords = void 0;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n var textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n var boundingBox = (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n var points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var measurementData = createNewMeasurement(mouseEventData);\n var element = mouseEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch(touchEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var measurementData = createNewMeasurement(touchEventData);\n var element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n element.addEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback);\n });\n });\n}\n\nvar simpleAngle = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n addNewMeasurement: addNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar simpleAngleTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.simpleAngle = simpleAngle;\nexports.simpleAngleTouch = simpleAngleTouch;\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.textMarkerTouch = exports.textMarker = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolState = __webpack_require__(2);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n var config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n var imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!_externalModules2.default.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n var currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool(element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n var insideBoundingBox = (0, _pointInsideBoundingBox2.default)(data.handles.end, coords);\n\n return distanceToPoint < 10 || insideBoundingBox;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var config = textMarker.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n var data = toolData.data[i];\n\n var color = _toolColors2.default.getToolColor();\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n var measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n var textCoords = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n var options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n data.handles.end.boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n }\n\n var config = textMarker.getConfiguration();\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction touchPressCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.addEventListener(_events2.default.TAP, textMarkerTouch.tapCallback);\n element.addEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback);\n }\n\n var config = textMarker.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar textMarker = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nvar textMarkerTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: touchPressCallback\n});\n\nexports.textMarker = textMarker;\nexports.textMarkerTouch = textMarkerTouch;\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.wwwcTouchDrag = exports.wwwc = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'wwwc';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction defaultStrategy(eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n var maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n var minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n var imageDynamicRange = maxVOI - minVOI;\n var multiplier = imageDynamicRange / 1024;\n\n var deltaX = eventData.deltaPoints.page.x * multiplier;\n var deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += deltaX;\n eventData.viewport.voi.windowCenter += deltaY;\n}\n\nfunction mouseDragCallback(e) {\n var eventData = e.detail;\n\n wwwc.strategy(eventData);\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchDragCallback(e) {\n var eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n var dragData = eventData;\n\n var maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n var minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n var imageDynamicRange = maxVOI - minVOI;\n var multiplier = imageDynamicRange / 1024;\n var deltaX = dragData.deltaPoints.page.x * multiplier;\n var deltaY = dragData.deltaPoints.page.y * multiplier;\n\n var config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += deltaX;\n dragData.viewport.voi.windowCenter += deltaY;\n } else {\n dragData.viewport.voi.windowWidth += deltaY;\n dragData.viewport.voi.windowCenter += deltaX;\n }\n } else {\n dragData.viewport.voi.windowWidth += deltaX;\n dragData.viewport.voi.windowCenter += deltaY;\n }\n\n _externalModules2.default.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nvar wwwc = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nvar wwwcTouchDrag = (0, _touchDragTool2.default)(touchDragCallback);\n\nexports.wwwc = wwwc;\nexports.wwwcTouchDrag = wwwcTouchDrag;\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.wwwcRegionTouch = exports.wwwcRegion = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _toolState = __webpack_require__(2);\n\nvar _getLuminance = __webpack_require__(46);\n\nvar _getLuminance2 = _interopRequireDefault(_getLuminance);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'wwwcRegion';\n\nvar configuration = {\n minWindowWidth: 10\n};\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean(storedPixelLuminanceData, globalMin, globalMax) {\n var numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n var min = globalMax;\n var max = globalMin;\n var sum = 0;\n\n for (var index = 0; index < numPixels; index++) {\n var spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min: min,\n max: max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var startPoint = toolData.data[0].startPoint;\n var endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n var width = Math.abs(startPoint.x - endPoint.x);\n var height = Math.abs(startPoint.y - endPoint.y);\n\n var left = Math.min(startPoint.x, endPoint.x);\n var top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n var pixelLuminanceData = (0, _getLuminance2.default)(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n var minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n var config = wwwcRegion.getConfiguration();\n var viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n element.removeEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n\n element.addEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n if (e.type === _events2.default.MOUSE_DRAG) {\n element.addEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n element.addEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n var measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n (0, _toolState.addToolState)(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var context = eventData.canvasContext;\n var cornerstone = _externalModules2.default.cornerstone;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var startPoint = toolData.data[0].startPoint;\n var endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n var color = _toolColors2.default.getActiveColor();\n\n // Calculate the rectangle parameters\n var startPointCanvas = cornerstone.pixelToCanvas(element, startPoint);\n var endPointCanvas = cornerstone.pixelToCanvas(element, endPoint);\n\n var left = Math.min(startPointCanvas.x, endPointCanvas.x);\n var top = Math.min(startPointCanvas.y, endPointCanvas.y);\n var width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n var height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction activate(element, mouseButtonMask) {\n (0, _enabledElementTools.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData) {\n var data = [];\n\n (0, _toolState.addToolState)(element, toolType, data);\n }\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag(element) {\n element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.removeEventListener(_events2.default.TOUCH_START, recordStartPoint);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction activateTouchDrag(element) {\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData) {\n var data = [];\n\n (0, _toolState.addToolState)(element, toolType, data);\n }\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.removeEventListener(_events2.default.TOUCH_START, recordStartPoint);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.addEventListener(_events2.default.TOUCH_START, recordStartPoint);\n element.addEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module exports\nvar wwwcRegion = {\n activate: activate,\n deactivate: disable,\n disable: disable,\n setConfiguration: setConfiguration,\n getConfiguration: getConfiguration\n};\n\nvar wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexports.wwwcRegion = wwwcRegion;\nexports.wwwcRegionTouch = wwwcRegionTouch;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.zoomTouchDrag = exports.zoomTouchPinch = exports.zoomWheel = exports.zoom = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _mouseWheelTool = __webpack_require__(23);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _touchPinchTool = __webpack_require__(57);\n\nvar _touchPinchTool2 = _interopRequireDefault(_touchPinchTool);\n\nvar _touchDragTool = __webpack_require__(13);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _enabledElementTools = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'zoom';\nvar startPoints = void 0;\n\nfunction changeViewportScale(viewport, ticks) {\n var config = zoom.getConfiguration();\n var pow = 1.7;\n\n var oldFactor = Math.log(viewport.scale) / Math.log(pow);\n var factor = oldFactor + ticks;\n\n var scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition(position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift(shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n var angle = viewport.rotation * Math.PI / 180;\n\n var cosA = Math.cos(angle);\n var sinA = Math.sin(angle);\n\n var newX = shift.x * cosA - shift.y * sinA;\n var newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy(eventData, ticks) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n var newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n var shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy(eventData, ticks) {\n var element = eventData.element;\n var image = eventData.image;\n var config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n var shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n var translateSpeed = 8;\n var outwardsMinScaleToTranslate = 3;\n var minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n var desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n var distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n _externalModules2.default.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy(eventData, ticks) {\n var element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n _externalModules2.default.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _enabledElementTools.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n var ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction mouseWheelCallback(e) {\n var eventData = e.detail;\n var ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n var config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n _externalModules2.default.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var config = zoom.getConfiguration();\n var viewport = eventData.viewport;\n var element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n var newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n var shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nvar zoom = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nvar zoomWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\nvar zoomTouchPinch = (0, _touchPinchTool2.default)(touchPinchCallback);\nvar zoomTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.zoom = zoom;\nexports.zoomWheel = zoomWheel;\nexports.zoomTouchPinch = zoomTouchPinch;\nexports.zoomTouchDrag = zoomTouchDrag;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.brush = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _brushTool = __webpack_require__(58);\n\nvar _brushTool2 = _interopRequireDefault(_brushTool);\n\nvar _getCircle = __webpack_require__(59);\n\nvar _getCircle2 = _interopRequireDefault(_getCircle);\n\nvar _drawBrush = __webpack_require__(60);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This module is for creating segmentation overlays\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar toolType = 'brush';\nvar configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nvar lastImageCoords = void 0;\nvar dragging = false;\n\nfunction paint(eventData) {\n var configuration = brush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var _layer$image = layer.image,\n rows = _layer$image.rows,\n columns = _layer$image.columns;\n var _eventData$currentPoi = eventData.currentPoints.image,\n x = _eventData$currentPoi.x,\n y = _eventData$currentPoi.y;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = toolData.data[0].pixelData;\n var brushPixelValue = configuration.draw;\n var radius = configuration.radius;\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushPixels)(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown(e) {\n var eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag(e) {\n var eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n var _eventData$image = eventData.image,\n rows = _eventData$image.rows,\n columns = _eventData$image.columns;\n var _lastImageCoords = lastImageCoords,\n x = _lastImageCoords.x,\n y = _lastImageCoords.y;\n\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n var configuration = brush.getConfiguration();\n var radius = configuration.radius;\n var context = eventData.canvasContext;\n var color = dragging ? configuration.dragColor : configuration.hoverColor;\n var element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushOnCanvas)(pointerArray, context, color, element);\n}\n\nvar brush = (0, _brushTool2.default)({\n onMouseMove: onMouseMove,\n onMouseDown: onMouseDown,\n onMouseUp: onMouseUp,\n onDrag: onDrag,\n toolType: toolType,\n onImageRendered: onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexports.brush = brush;\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.adaptiveBrush = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _brushTool = __webpack_require__(58);\n\nvar _brushTool2 = _interopRequireDefault(_brushTool);\n\nvar _getCircle = __webpack_require__(59);\n\nvar _getCircle2 = _interopRequireDefault(_getCircle);\n\nvar _drawBrush = __webpack_require__(60);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This module is for creating segmentation overlays\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar toolType = 'adaptiveBrush';\nvar configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nvar lastImageCoords = void 0;\nvar thrMax = void 0;\nvar thrMin = void 0;\nvar currentRadius = void 0;\nvar dragging = void 0;\n\nfunction getGreyValues(pointerArray, pixelData, imageColumns) {\n var configuration = adaptiveBrush.getConfiguration();\n var tolerance = configuration.tolerance;\n var minValue = Number.MAX_VALUE;\n var maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach(function (point) {\n var pixelIndex = point[1] * imageColumns + point[0];\n var greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush(imagePixelData, brushPixelData, rows, columns) {\n var configuration = adaptiveBrush.getConfiguration();\n var brushPixelValue = configuration.draw;\n var mouseX = Math.round(lastImageCoords.x);\n var mouseY = Math.round(lastImageCoords.y);\n var numPixelsOutsideThresholdWindow = null;\n var pointerArray = [];\n var radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = (0, _getCircle2.default)(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (var j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n var xCoord = pointerArray[j][0];\n var yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n var pixelIndex = yCoord * columns + xCoord;\n var pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n (0, _drawBrush.drawBrushPixels)(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint(eventData) {\n var configuration = adaptiveBrush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var baseLayer = _externalModules2.default.cornerstone.getLayers(element)[0];\n var _layer$image = layer.image,\n rows = _layer$image.rows,\n columns = _layer$image.columns;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction erase(eventData) {\n var configuration = adaptiveBrush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var _layer$image2 = layer.image,\n rows = _layer$image2.rows,\n columns = _layer$image2.columns;\n var _eventData$currentPoi = eventData.currentPoints.image,\n x = _eventData$currentPoi.x,\n y = _eventData$currentPoi.y;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = toolData.data[0].pixelData;\n var brushPixelValue = configuration.draw;\n var radius = configuration.radius;\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushPixels)(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n var configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown(e) {\n var eventData = e.detail;\n\n var element = eventData.element;\n var configuration = adaptiveBrush.getConfiguration();\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var baseLayer = _externalModules2.default.cornerstone.getLayers(element)[0];\n var _eventData$currentPoi2 = eventData.currentPoints.image,\n x = _eventData$currentPoi2.x,\n y = _eventData$currentPoi2.y;\n var _layer$image3 = layer.image,\n rows = _layer$image3.rows,\n columns = _layer$image3.columns;\n\n var pointerArray = (0, _getCircle2.default)(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag(e) {\n var eventData = e.detail;\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n var _eventData$image = eventData.image,\n rows = _eventData$image.rows,\n columns = _eventData$image.columns;\n var _lastImageCoords = lastImageCoords,\n x = _lastImageCoords.x,\n y = _lastImageCoords.y;\n\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n var configuration = adaptiveBrush.getConfiguration();\n var context = eventData.canvasContext;\n var color = dragging ? configuration.dragColor : configuration.hoverColor;\n var element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var pointerArray = (0, _getCircle2.default)(currentRadius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushOnCanvas)(pointerArray, context, color, element);\n}\n\nvar adaptiveBrush = (0, _brushTool2.default)({\n onMouseMove: onMouseMove,\n onMouseDown: onMouseDown,\n onMouseUp: onMouseUp,\n onDrag: onDrag,\n toolType: toolType,\n onImageRendered: onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexports.adaptiveBrush = adaptiveBrush;\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = '2.0.0';\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// cornerstoneTools.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 61);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 98876e733ba90be3f4b0","let cornerstone = window.cornerstone;\nlet cornerstoneMath = window.cornerstoneMath;\nlet Hammer = window.Hammer;\n\nexport default {\n set cornerstone (cs) {\n cornerstone = cs;\n },\n get cornerstone () {\n return cornerstone;\n },\n set cornerstoneMath (cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath () {\n return cornerstoneMath;\n },\n set Hammer (module) {\n Hammer = module;\n },\n get Hammer () {\n return Hammer;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","const EVENTS = {\n // Events from Cornerstone Core\n IMAGE_RENDERED: 'cornerstoneimagerendered',\n NEW_IMAGE: 'cornerstonenewimage',\n IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',\n ELEMENT_DISABLED: 'cornerstoneelementdisabled',\n\n // Mouse events\n MOUSE_DOWN: 'cornerstonetoolsmousedown',\n MOUSE_UP: 'cornerstonetoolsmouseup',\n MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',\n MOUSE_DRAG: 'cornerstonetoolsmousedrag',\n MOUSE_MOVE: 'cornerstonetoolsmousemove',\n MOUSE_CLICK: 'cornerstonetoolsmouseclick',\n MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',\n MOUSE_WHEEL: 'cornerstonetoolsmousewheel',\n\n // Touch events\n TOUCH_START: 'cornerstonetoolstouchstart',\n TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',\n TOUCH_END: 'cornerstonetoolstouchend',\n TOUCH_DRAG: 'cornerstonetoolstouchdrag',\n TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',\n TOUCH_PINCH: 'cornerstonetoolstouchpinch',\n TOUCH_ROTATE: 'cornerstonetoolstouchrotate',\n TOUCH_PRESS: 'cornerstonetoolstouchpress',\n TAP: 'cornerstonetoolstap',\n DOUBLE_TAP: 'cornerstonetoolsdoubletap',\n MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',\n MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',\n MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',\n\n // Keyboard events\n KEY_DOWN: 'cornerstonetoolskeydown',\n KEY_UP: 'cornerstonetoolskeyup',\n KEY_PRESS: 'cornerstonetoolskeypress',\n\n // Measurement / tool events\n MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',\n MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',\n MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved',\n TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',\n CLIP_STOPPED: 'cornerstonetoolsclipstopped',\n STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed\n\n LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated'\n};\n\nexport default EVENTS;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction getElementToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState (element, toolType, measurementData) {\n const toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n const eventType = EVENTS.MEASUREMENT_ADDED;\n const eventData = {\n toolType,\n element,\n measurementData\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState (element, toolType, data) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n const eventType = EVENTS.MEASUREMENT_REMOVED;\n const eventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, eventData);\n }\n}\n\nfunction clearToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager (element, toolStateManager) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexport {\n addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolState.js","const elementToolOptions = {};\n\nfunction getToolOptions (toolType, element) {\n if (!elementToolOptions[toolType]) {\n return {};\n }\n\n const toolOptions = elementToolOptions[toolType];\n const optionsObject = toolOptions.find((toolOptionObject) => toolOptionObject.element === element);\n\n if (!optionsObject) {\n return {};\n }\n\n return optionsObject.options;\n}\n\nfunction setToolOptions (toolType, element, options) {\n if (!elementToolOptions[toolType]) {\n elementToolOptions[toolType] = [{\n element,\n options\n }];\n\n return;\n }\n\n const toolOptions = elementToolOptions[toolType];\n const index = toolOptions.findIndex((toolOptionObject) => toolOptionObject.element === element);\n\n if (index === -1) {\n elementToolOptions[toolType].push({\n element,\n options\n });\n } else {\n elementToolOptions[toolType][index].options = options;\n }\n}\n\nexport { getToolOptions, setToolOptions };\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElementTools.js","/* eslint no-bitwise:0 */\n\nexport default function (which, mouseButtonMask) {\n const mouseButton = (1 << (which - 1));\n\n\n return ((mouseButtonMask & mouseButton) !== 0);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/isMouseButtonEnabled.js","/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/triggerEvent.js","\nlet defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor (color) {\n fillColor = color;\n}\n\nfunction getFillColor () {\n return fillColor;\n}\n\nfunction setToolColor (color) {\n defaultColor = color;\n}\n\nfunction getToolColor () {\n return defaultColor;\n}\n\nfunction setActiveColor (color) {\n activeColor = color;\n}\n\nfunction getActiveColor () {\n return activeColor;\n}\n\nfunction getColorIfActive (active) {\n return active ? activeColor : defaultColor;\n}\n\nconst toolColors = {\n setFillColor,\n getFillColor,\n setToolColor,\n getToolColor,\n setActiveColor,\n getActiveColor,\n getColorIfActive\n};\n\nexport default toolColors;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolColors.js","import textStyle from '../stateManagement/textStyle.js';\n\nexport default function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n const padding = 5;\n const font = textStyle.getFont();\n const fontSize = textStyle.getFontSize();\n const backgroundColor = textStyle.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n let maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n const width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n const boundingBox = {\n width: maxWidth + (padding * 2),\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawTextBox.js","let defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth (width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth () {\n return defaultWidth;\n}\n\nfunction setActiveWidth (width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth () {\n return activeWidth;\n}\n\nconst toolStyle = {\n setToolWidth,\n getToolWidth,\n setActiveWidth,\n getActiveWidth\n};\n\nexport default toolStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolStyle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\nimport { getToolOptions, setToolOptions } from '../enabledElementTools.js';\n\nexport default function (mouseToolInterface) {\n let configuration = {};\n const toolType = mouseToolInterface.toolType;\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e) {\n const eventData = e.detail;\n\n toolCoordinates.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n const coords = eventData.currentPoints.canvas;\n\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) ||\n (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e) {\n const eventData = e.detail;\n let data;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove () {\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, data);\n }\n\n external.cornerstone.updateImage(element);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n let i;\n\n // Now check to see if there is a handle we can move\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distance = 6;\n const handle = getHandleNearImagePoint(element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n data.active = true;\n moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n const opt = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n\n const mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback;\n const mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback;\n const mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback;\n const mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n\n let handleMover;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = moveHandle;\n } else {\n handleMover = moveNewHandle;\n }\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n const eventType = EVENTS.TOOL_DEACTIVATED;\n const statusChangeEventData = {\n mouseButtonMask,\n toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n function getConfiguration () {\n return configuration;\n }\n\n function setConfiguration (config) {\n configuration = config;\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration,\n mouseDownCallback,\n mouseMoveCallback,\n mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseDoubleClick) {\n toolInterface.mouseDoubleClickCallback = mouseDoubleClick;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonTool.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\n\nconst handleRadius = 6;\n\nexport default function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = toolStyle.getActiveWidth();\n } else {\n context.lineWidth = toolStyle.getToolWidth();\n }\n\n const handleCanvasCoords = external.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/drawHandles.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport touchMoveHandle from '../manipulators/touchMoveHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport touchMoveAllHandles from '../manipulators/touchMoveAllHandles.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction deactivateAllHandles (handles) {\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances (toolData) {\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool (touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n\n const measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n addToolState(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === EVENTS.TAP) {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n moveNewHandleTouch(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool tapCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let data;\n let i;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback () {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distanceSq = 25; // Should probably make this a settable property later\n const handle = getHandleNearImagePoint(element, data.handles, coords, distanceSq);\n\n if (handle) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e);\n } else {\n touchDownActivateCallback(e);\n }\n\n return false;\n }\n\n function touchStartCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool touchStartCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.startPoints.canvas;\n let data;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let i;\n\n function doneMovingCallback (lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === EVENTS.TOUCH_PRESS) {\n triggerEvent(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n data.active = true;\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n element.addEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element) {\n const eventType = EVENTS.TOOL_DEACTIVATED;\n const statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexport default touchTool;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchTool.js","let defaultStartLoadHandler;\nlet defaultEndLoadHandler;\nlet defaultErrorLoadingHandler;\n\nfunction setStartLoadHandler (handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler () {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler (handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler () {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler (handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler () {\n return defaultErrorLoadingHandler;\n}\n\nconst loadHandlerManager = {\n setStartLoadHandler,\n getStartLoadHandler,\n setEndLoadHandler,\n getEndLoadHandler,\n setErrorLoadingHandler,\n getErrorLoadingHandler\n};\n\nexport default loadHandlerManager;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/loadHandlerManager.js","import EVENTS from '../events.js';\n\nexport default function (touchDragCallback, options) {\n let events = EVENTS.TOUCH_DRAG;\n\n if (options && options.fireOnTouchStart === true) {\n events += ' CornerstoneToolsTouchStart';\n }\n\n const toolInterface = {\n activate (element) {\n element.removeEventListener(events, touchDragCallback);\n\n if (options && options.eventData) {\n element.addEventListener(events, options.eventData, touchDragCallback);\n } else {\n element.addEventListener(events, touchDragCallback);\n }\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n element.removeEventListener(events, touchDragCallback);\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchDragTool.js","let defaultFontSize = 15,\n defaultFont = `${defaultFontSize}px Arial`,\n defaultBackgroundColor = 'transparent';\n\nfunction setFont (font) {\n defaultFont = font;\n}\n\nfunction getFont () {\n return defaultFont;\n}\n\nfunction setFontSize (fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize () {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor (backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor () {\n return defaultBackgroundColor;\n}\n\nconst textStyle = {\n setFont,\n getFont,\n setFontSize,\n getFontSize,\n setBackgroundColor,\n getBackgroundColor\n};\n\nexport default textStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/textStyle.js","import external from '../externalModules.js';\n\nexport default function (renderData, handles) {\n const image = renderData.image;\n const imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n let handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (external.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/anyHandlesOutsideImage.js","import EVENTS from '../events.js';\nimport { setToolOptions } from '../enabledElementTools.js';\n\nexport default function (mouseDownCallback, toolType) {\n if (!toolType) {\n throw new Error('simpleMouseButtonTool: toolType is required');\n }\n\n let configuration = {};\n\n return {\n activate (element, mouseButtonMask, options = {}) {\n options.mouseButtonMask = mouseButtonMask;\n setToolOptions(toolType, element, options);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleMouseButtonTool.js","import external from '../externalModules.js';\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nexport default function convertToVector3 (arrayOrVector3) {\n const cornerstoneMath = external.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/convertToVector3.js","import external from '../externalModules.js';\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager () {\n let toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState (imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState (imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState (element, toolType, data) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState (element, toolType) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = imageIdToolState[toolType];\n\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState,\n restoreImageIdToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nconst globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexport {\n newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/imageIdSpecificStateManager.js","import external from '../externalModules.js';\n\nexport default function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return external.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInsideBoundingBox.js","import external from '../externalModules.js';\n\n// Returns a decimal value given a fractional value\nfunction fracToDec (fractionalValue) {\n return parseFloat(`.${fractionalValue}`);\n}\n\nexport default function (image, storedPixelValue) {\n const cornerstone = external.cornerstone;\n const patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n const modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n const modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n const patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n const petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n const startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n const totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n const halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n const seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n const acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n const injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n const durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n const correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n const suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateSUV.js","import external from '../externalModules.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\n\nexport default function (element, handles, coords, distanceThreshold) {\n let nearbyHandle;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if (pointInsideBoundingBox(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n const handleCanvas = external.cornerstone.pixelToCanvas(element, handle);\n const distance = external.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/getHandleNearImagePoint.js","let configMaxSimultaneousRequests;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nconst maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo () {\n const ua = navigator.userAgent;\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n let tem;\n\n if (/trident/i.test(M[1])) {\n tem = (/\\brv[ :]+(\\d+)/g).exec(ua) || [];\n\n return `IE ${tem[1] || ''}`;\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests (newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests () {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests () {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n const browserName = info[0];\n const browserVersion = info[1];\n const browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice () {\n const pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n\n return pattern.test(navigator.userAgent);\n}\n\nexport {\n getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n setMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice\n};\n\n\n\n// WEBPACK FOOTER //\n// ./util/getMaxSimultaneousRequests.js","import EVENTS from '../events.js';\n\nexport default function (mouseWheelCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n element.addEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseWheelTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback (e) {\n const eventData = e.detail;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback () {\n handle.active = false;\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveHandle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function moveCallback (e) {\n const eventData = e.detail;\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function whichMovement (e) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n\n element.addEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n if (e.type === EVENTS.MOUSE_DRAG) {\n element.addEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n }\n }\n\n function measurementRemovedCallback (e) {\n const eventData = e.detail;\n\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback (e) {\n const eventData = e.detail;\n\n if (eventData.toolType === toolType) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.addEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n function moveEndCallback () {\n element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandle.js","\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\n\nexport default function (onImageRendered) {\n let configuration = {};\n\n return {\n disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n },\n enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/displayTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n const distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback (e) {\n const eventData = e.detail;\n\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback (e) {\n const eventData = e.detail;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.removeEventListener(EVENTS.TAP, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n if (e.type === EVENTS.TOUCH_PINCH || e.type === EVENTS.TOUCH_PRESS) {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation (e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.addEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.addEventListener(EVENTS.TAP, moveEndCallback);\n element.addEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n\n function toolDeactivatedCallback () {\n element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.removeEventListener(EVENTS.TAP, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandleTouch.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Projects a patient point to an image point\nexport function projectPatientPointToImagePlane (patientPoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n const point = patientPoint.clone().sub(imagePositionPatient);\n const x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n const y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n\n return {\n x,\n y\n };\n}\n\n// Projects an image point to a patient point\nexport function imagePointToPatientPoint (imagePoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n\n const x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n const y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n const patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane (imagePlane) {\n // Get the points\n const topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n const topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n const bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n const bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n const rect = {\n top: new external.cornerstoneMath.Line3(topLeft, topRight),\n left: new external.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new external.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new external.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n\n return rect;\n}\n\nfunction lineRectangleIntersection (line, rect) {\n const intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n const segment = rect[side];\n const intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nexport function planePlaneIntersection (targetImagePlane, referenceImagePlane) {\n const targetRowCosines = convertToVector3(targetImagePlane.rowCosines);\n const targetColumnCosines = convertToVector3(targetImagePlane.columnCosines);\n const targetImagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n const referenceRowCosines = convertToVector3(referenceImagePlane.rowCosines);\n const referenceColumnCosines = convertToVector3(referenceImagePlane.columnCosines);\n const referenceImagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n const targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n const targetPlane = new external.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n const referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n const referencePlane = new external.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n const originDirection = referencePlane.clone().intersectPlane(targetPlane);\n const origin = originDirection.origin;\n const direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n const bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n const distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n const line = new external.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n const rect = getRectangleFromImagePlane(referenceImagePlane);\n const intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointProjector.js","import external from '../externalModules.js';\nimport { getMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nconst numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nlet maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nlet awake = false;\nconst grabDelay = 20;\n\nfunction addRequest (element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n const requestDetails = {\n type,\n imageId,\n preventCache,\n doneCallback,\n failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.promise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack (type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain () {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest (requestDetails) {\n const cornerstone = external.cornerstone;\n // Increment the number of current requests of this type\n const type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n const imageId = requestDetails.imageId;\n const doneCallback = requestDetails.doneCallback;\n const failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n const imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imageLoadObject.promise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority (requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n const priority = requestTypeToLoadPriority(requestDetails);\n\n let loader;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing () {\n // Begin by grabbing X images\n const maxSimultaneousRequests = getMaxSimultaneousRequests();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n const currentRequests = numRequests.interaction +\n numRequests.thumbnail +\n numRequests.prefetch;\n const requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest () {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length &&\n !requestPool.thumbnail.length &&\n !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool () {\n return requestPool;\n}\n\nexport default {\n addRequest,\n clearRequestStack,\n startGrabbing,\n getRequestPool\n};\n\n\n\n// WEBPACK FOOTER //\n// ./requestPool/requestPoolManager.js","import EVENTS from '../events.js';\n\nexport default function (touchDragCallback, options) {\n let configuration = {};\n const events = [EVENTS.MULTI_TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(EVENTS.MULTI_TOUCH_START);\n }\n\n return {\n activate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/multiTouchDragTool.js","import scrollToIndex from './scrollToIndex.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default function (element, images, loop = false) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n let newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n const nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n scrollToIndex(element, newImageIdIndex);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scroll.js","export default function (value, precision) {\n const multiplier = Math.pow(10, precision);\n\n\n return (Math.round(value * multiplier) / multiplier);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/roundToDecimal.js","export default function (ellipse, location) {\n const xRadius = ellipse.width / 2;\n const yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n const center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n const normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n const inEllipse = ((normalized.x * normalized.x) / (xRadius * xRadius)) + ((normalized.y * normalized.y) / (yRadius * yRadius)) <= 1.0;\n\n\n return inEllipse;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInEllipse.js","/**\n * This function is used to prevent selection from occuring when left click dragging on the image\n * @param e the event that is provided to your event handler\n * Based on: http://stackoverflow.com/questions/5429827/how-can-i-prevent-text-element-selection-with-cursor-drag\n * @returns {boolean}\n */\nexport default function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pauseEvent.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const storedPixelData = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * enabledElement.image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n const alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getRGBPixels.js","import external from '../externalModules.js';\n\nexport default function (points) {\n const page = external.cornerstoneMath.point.copy(points.page);\n const image = external.cornerstoneMath.point.copy(points.image);\n const client = external.cornerstoneMath.point.copy(points.client);\n const canvas = external.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page,\n image,\n client,\n canvas\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/copyPoints.js","let coordsData;\n\nfunction setCoords (eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords () {\n return coordsData;\n}\n\nconst toolCoordinates = {\n setCoords,\n getCoords\n};\n\nexport default toolCoordinates;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolCoordinates.js","import getHandleNearImagePoint from './getHandleNearImagePoint.js';\n\nfunction getActiveHandle (handles) {\n let activeHandle;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\nexport default function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n const activeHandle = getActiveHandle(handles);\n const nearbyHandle = getHandleNearImagePoint(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/handleActivator.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (e, data, toolData, toolType, options, doneMovingCallback) {\n const cornerstone = external.cornerstone;\n const mouseEventData = e.detail;\n const element = mouseEventData.element;\n\n function mouseDragCallback (e) {\n const eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback (e) {\n const eventData = e.detail;\n\n data.invalidated = true;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveAllHandles.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\nexport default function (element, timePoints, wrap) {\n const toolData = getToolState(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const timeSeriesData = toolData.data[0];\n const currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n const currentImageIdIndex = currentStack.currentImageIdIndex;\n let newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n const viewport = cornerstone.getViewport(element);\n const newStack = timeSeriesData.stacks[newStackIndex];\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n let loader;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n const imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/incrementTimePoint.js","import { planePlaneIntersection, projectPatientPointToImagePlane } from '../util/pointProjector.js';\n\n// Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner\n// Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but\n// That requires a bit more math and this works fine for most cases\nexport default function (targetImagePlane, referenceImagePlane) {\n const points = planePlaneIntersection(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: projectPatientPointToImagePlane(points.start, targetImagePlane),\n end: projectPatientPointToImagePlane(points.end, targetImagePlane)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/calculateReferenceLine.js","import external from '../externalModules.js';\nimport calculateReferenceLine from './calculateReferenceLine.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Renders the active reference line\nexport default function (context, eventData, targetElement, referenceElement) {\n const cornerstone = external.cornerstone;\n const targetImage = cornerstone.getEnabledElement(targetElement).image;\n const referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n const referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane ||\n !referenceImagePlane ||\n !targetImagePlane.rowCosines ||\n !targetImagePlane.columnCosines ||\n !targetImagePlane.imagePositionPatient ||\n !referenceImagePlane.rowCosines ||\n !referenceImagePlane.columnCosines ||\n !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = convertToVector3(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = convertToVector3(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = convertToVector3(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = convertToVector3(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n const targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n const referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n let angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) { // 0.5 radians = ~30 degrees\n return;\n }\n\n const referenceLine = calculateReferenceLine(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n const refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n const refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n const color = toolColors.getActiveColor();\n const lineWidth = toolStyle.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/renderActiveReferenceLine.js","import getOrientationString from './getOrientationString.js';\nimport invertOrientationString from './invertOrientationString.js';\n\nconst orientation = {\n getOrientationString,\n invertOrientationString\n};\n\nexport default orientation;\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/index.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { stackScroll } from '../stackTools/stackScroll.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (element, newImageIdIndex) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (toolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function doneCallback (image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch(error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n const eventData = {\n newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n const newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n const config = stackScroll.getConfiguration();\n\n if (config && config.retryLoadOnScroll === true) {\n // Const newImageLoadObject = cornerstone.imageCache.getImageLoadObject(newImageId);\n\n // TODO: No way to check state of Promise. No way to know if it is rejected.\n /* If (newImageLoadObject && newImagePromise.state() === 'rejected') {\n cornerstone.imageCache.removeImagePromise(newImageId);\n }*/\n }\n\n // Convert the preventCache value in stack data to a boolean\n const preventCache = Boolean(stackData.preventCache);\n\n let imagePromise;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n requestPoolManager.startGrabbing();\n\n triggerEvent(element, EVENTS.STACK_SCROLL, eventData);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scrollToIndex.js","import EVENTS from '../events.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport multiTouchDragTool from '../imageTools/multiTouchDragTool.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport scroll from '../util/scroll.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'stackScroll';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n const mouseDragEventData = {\n deltaY: 0\n };\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragEventData, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n const images = -eventData.direction;\n\n const config = stackScroll.getConfiguration();\n\n let loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n scroll(eventData.element, images, loop);\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n const config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n let pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n e.data.deltaY = e.data.deltaY || 0;\n e.data.deltaY += eventData.deltaPoints.page.y;\n if (Math.abs(e.data.deltaY) >= pixelsPerImage) {\n const imageDelta = e.data.deltaY / pixelsPerImage;\n const imageIdIndexOffset = Math.round(imageDelta);\n const imageDeltaMod = e.data.deltaY % pixelsPerImage;\n\n e.data.deltaY = imageDeltaMod;\n scroll(element, imageIdIndexOffset);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Module/private exports\nconst stackScroll = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst stackScrollWheel = mouseWheelTool(mouseWheelCallback);\n\nconst options = {\n eventData: {\n deltaY: 0\n }\n};\nconst stackScrollTouchDrag = touchDragTool(dragCallback, options);\n\nfunction multiTouchDragCallback (e) {\n const eventData = e.detail;\n const config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e);\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 3);\n }\n};\n\nconst stackScrollMultiTouch = multiTouchDragTool(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexport {\n stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScroll.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n const luminance = [];\n let index = 0;\n const pixelData = image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns) + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getLuminance.js","// http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\nexport default function (context, x, y, w, h) {\n const kappa = 0.5522848,\n ox = (w / 2) * kappa, // Control point offset horizontal\n oy = (h / 2) * kappa, // Control point offset vertical\n xe = x + w, // X-end\n ye = y + h, // Y-end\n xm = x + w / 2, // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawEllipse.js","export default function (context, start, color, lineWidth) {\n const handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawCircle.js","export default function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n const headLength = 10;\n\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawArrow.js","import pointInEllipse from './pointInEllipse.js';\n\nexport default function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n const point = {\n x,\n y\n };\n\n if (pointInEllipse(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateEllipseStatistics.js","import EVENTS from '../events.js';\n\nexport default function (keyDownCallback) {\n let configuration = {};\n\n return {\n activate (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n element.addEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/keyboardTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n const touchEventData = event.detail;\n const element = touchEventData.element;\n const cornerstone = external.cornerstone;\n\n function touchDragCallback (e) {\n const eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback);\n element.removeEventListener(EVENTS.TAP, touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n const handlesOutsideImage = anyHandlesOutsideImage(eventData, data.handles);\n\n if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n element.addEventListener(EVENTS.TOUCH_PINCH, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback);\n element.addEventListener(EVENTS.TAP, touchEndCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveAllHandles.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nconst runAnimation = {\n value: false\n};\n\nconst touchEndEvents = [\n EVENTS.TOUCH_END,\n EVENTS.TOUCH_DRAG_END,\n EVENTS.TOUCH_PINCH,\n EVENTS.TOUCH_PRESS,\n EVENTS.TAP\n];\n\nfunction animate (lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Update\n const time = (new Date()).getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n const distanceRemaining = Math.abs(handle.y - targetLocation.y);\n const linearDistEachFrame = distanceRemaining / 10;\n\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\nexport default function (event, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n const touchEventData = event.detail;\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n\n const time = (new Date()).getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const fingerDistance = -57;\n\n const aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n let targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n const currentPoints = eventData.currentPoints;\n const aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback (e) {\n const eventData = e.detail;\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n\n runAnimation.value = false;\n\n handle.active = false;\n element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n touchEndEvents.forEach((eventType) => {\n element.removeEventListener(eventType, touchEndCallback);\n });\n\n cornerstone.updateImage(element);\n\n if (e.type === EVENTS.TOUCH_PRESS) {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n touchEndEvents.forEach((eventType) => {\n element.addEventListener(eventType, touchEndCallback);\n });\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveHandle.js","// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nconst antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n };\n\nlet lastInteractionType,\n lastInteractionTime;\n\nfunction handleTap (type, e) {\n const now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nconst handleTapMouse = handleTap.bind(null, pointerType.mouse);\nconst handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.addEventListener(eventName, tapHandler);\n });\n}\n\nfunction removeEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.removeEventListener(eventName, tapHandler);\n });\n}\n\nconst mouseEvents = ['mousedown', 'mouseup'];\nconst touchEvents = ['touchstart', 'touchend'];\n\nfunction disable (element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable (element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nconst preventGhostClick = {\n enable,\n disable\n};\n\nexport default preventGhostClick;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/preventGhostClick.js","import EVENTS from '../events.js';\n\nexport default function (doubleTapCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n element.addEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nexport default function (mouseToolInterface, preventHandleOutsideImage) {\n const toolType = mouseToolInterface.toolType;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const element = mouseEventData.element;\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e) {\n const eventData = e.detail;\n\n toolCoordinates.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n const coords = eventData.currentPoints.canvas;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove () {\n data.active = false;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, toolType);\n\n let i;\n\n // Now check to see if there is a handle we can move\n const distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n const opt = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonRectangleTool.js","import EVENTS from '../events.js';\n\nexport default function (touchPinchCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n element.addEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchPinchTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nlet brushLayerId;\n\nexport default function brushTool (brushToolInterface) {\n const toolType = brushToolInterface.toolType;\n\n function mouseMoveCallback (e) {\n brushToolInterface.onMouseMove(e);\n }\n\n function mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n brushToolInterface.onMouseUp(e);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n }\n\n function dragCallback (e) {\n brushToolInterface.onDrag(e);\n\n return false;\n }\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n brushToolInterface.onMouseDown(e);\n\n return false;\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n }\n\n function onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n let pixelData;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n }\n\n const layer = external.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n\n brushToolInterface.onImageRendered(e);\n }\n\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n // TODO: Fix jQuery event\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const { width, height } = enabledElement.image;\n let pixelData = new Uint8ClampedArray(width * height);\n\n const configuration = brushTool.getConfiguration();\n let colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n const colormap = external.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n const labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: () => pixelData,\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height,\n width,\n pixelData,\n setPixelData: (data) => {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n let layer;\n const options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = external.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = external.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n external.cornerstone.updateImage(element);\n }\n\n function deactivate (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }\n\n const brushTool = mouseButtonTool({\n mouseMoveCallback,\n mouseDownActivateCallback,\n onImageRendered,\n deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brushTool.js","export default function getCircle (radius, rows, columns, xCoord = 0, yCoord = 0) {\n const x0 = Math.round(xCoord);\n const y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n const circleArray = [];\n let index = 0;\n\n for(let y = -radius; y <= radius; y++) {\n const yCoord = y0 + y;\n\n if (yCoord > rows || yCoord < 0) {\n continue;\n }\n\n for(let x = -radius; x <= radius; x++) {\n const xCoord = x0 + x;\n\n if (xCoord > columns || xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/getCircle.js","import external from '../externalModules.js';\n\nfunction drawBrushPixels (pointerArray, storedPixels, brushPixelValue, columns) {\n const getPixelIndex = (x, y) => (y * columns) + x;\n\n pointerArray.forEach((point) => {\n const spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas (pointerArray, canvasContext, color, element) {\n const canvasPtTL = external.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n const canvasPtBR = external.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n const sizeX = canvasPtBR.x - canvasPtTL.x;\n const sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach((point) => {\n const canvasPt = external.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexport { drawBrushPixels, drawBrushOnCanvas };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/drawBrush.js","export { default as external } from './externalModules.js';\n\nexport { default as referenceLines } from './referenceLines/index.js';\nexport { default as orientation } from './orientation/index.js';\n\nexport { default as requestPoolManager } from './requestPool/requestPoolManager.js';\n\nexport { default as setContextToDisplayFontSize } from './util/setContextToDisplayFontSize.js';\nexport { default as scrollToIndex } from './util/scrollToIndex.js';\nexport { default as scroll } from './util/scroll.js';\nexport { default as roundToDecimal } from './util/roundToDecimal.js';\nexport { projectPatientPointToImagePlane,\n imagePointToPatientPoint,\n planePlaneIntersection } from './util/pointProjector.js';\n\nexport { default as pointInsideBoundingBox } from './util/pointInsideBoundingBox.js';\nexport { default as pointInEllipse } from './util/pointInEllipse.js';\nexport { default as pauseEvent } from './util/pauseEvent.js';\nexport { default as isMouseButtonEnabled } from './util/isMouseButtonEnabled.js';\nexport { default as getRGBPixels } from './util/getRGBPixels.js';\nexport { getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice } from './util/getMaxSimultaneousRequests.js';\n\nexport { default as getLuminance } from './util/getLuminance.js';\nexport { default as drawTextBox } from './util/drawTextBox.js';\nexport { default as drawEllipse } from './util/drawEllipse.js';\nexport { default as drawCircle } from './util/drawCircle.js';\nexport { default as drawArrow } from './util/drawArrow.js';\nexport { default as copyPoints } from './util/copyPoints.js';\nexport { default as calculateSUV } from './util/calculateSUV.js';\nexport { default as calculateEllipseStatistics } from './util/calculateEllipseStatistics.js';\n\nexport { default as probeTool4D } from './timeSeriesTools/probeTool4D.js';\nexport { default as incrementTimePoint } from './timeSeriesTools/incrementTimePoint.js';\nexport { default as timeSeriesPlayer } from './timeSeriesTools/timeSeriesPlayer.js';\nexport { timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag } from './timeSeriesTools/timeSeriesScroll.js';\n\nexport { default as wwwcSynchronizer } from './synchronization/wwwcSynchronizer.js';\nexport { default as updateImageSynchronizer } from './synchronization/updateImageSynchronizer.js';\nexport { default as Synchronizer } from './synchronization/Synchronizer.js';\nexport { default as stackScrollSynchronizer } from './synchronization/stackScrollSynchronizer.js';\nexport { default as stackImagePositionSynchronizer } from './synchronization/stackImagePositionSynchronizer.js';\nexport { default as stackImagePositionOffsetSynchronizer } from './synchronization/stackImagePositionOffsetSynchronizer.js';\nexport { default as stackImageIndexSynchronizer } from './synchronization/stackImageIndexSynchronizer.js';\nexport { default as panZoomSynchronizer } from './synchronization/panZoomSynchronizer.js';\n\nexport { default as toolStyle } from './stateManagement/toolStyle.js';\nexport { addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager } from './stateManagement/toolState.js';\nexport { default as toolCoordinates } from './stateManagement/toolCoordinates.js';\nexport { default as toolColors } from './stateManagement/toolColors.js';\nexport { addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager } from './stateManagement/timeSeriesSpecificStateManager.js';\nexport { default as textStyle } from './stateManagement/textStyle.js';\n\nexport { stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager } from './stateManagement/stackSpecificStateManager.js';\n\nexport { default as loadHandlerManager } from './stateManagement/loadHandlerManager.js';\n\nexport { newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager } from './stateManagement/imageIdSpecificStateManager.js';\n\nexport { newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager } from './stateManagement/frameOfReferenceStateManager.js';\n\nexport { default as appState } from './stateManagement/appState.js';\n\nexport { default as stackScrollKeyboard } from './stackTools/stackScrollKeyboard.js';\n\nexport { stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch } from './stackTools/stackScroll.js';\n\nexport { default as stackPrefetch } from './stackTools/stackPrefetch.js';\nexport { default as scrollIndicator } from './stackTools/scrollIndicator.js';\nexport { default as stackRenderers } from './stackTools/stackRenderers.js';\nexport { playClip, stopClip } from './stackTools/playClip.js';\n\nexport { default as anyHandlesOutsideImage } from './manipulators/anyHandlesOutsideImage.js';\nexport { default as drawHandles } from './manipulators/drawHandles.js';\nexport { default as getHandleNearImagePoint } from './manipulators/getHandleNearImagePoint.js';\nexport { default as handleActivator } from './manipulators/handleActivator.js';\nexport { default as moveAllHandles } from './manipulators/moveAllHandles.js';\nexport { default as moveHandle } from './manipulators/moveHandle.js';\nexport { default as moveNewHandle } from './manipulators/moveNewHandle.js';\nexport { default as moveNewHandleTouch } from './manipulators/moveNewHandleTouch.js';\nexport { default as touchMoveAllHandles } from './manipulators/touchMoveAllHandles.js';\nexport { default as touchMoveHandle } from './manipulators/touchMoveHandle.js';\n\nexport { default as keyboardInput } from './inputSources/keyboardInput.js';\nexport { default as mouseInput } from './inputSources/mouseInput.js';\nexport { default as mouseWheelInput } from './inputSources/mouseWheelInput.js';\nexport { default as preventGhostClick } from './inputSources/preventGhostClick.js';\nexport { default as touchInput } from './inputSources/touchInput.js';\n\n\nexport { angle, angleTouch } from './imageTools/angleTool.js';\nexport { arrowAnnotate, arrowAnnotateTouch } from './imageTools/arrowAnnotate.js';\nexport { crosshairs, crosshairsTouch } from './imageTools/crosshairs.js';\nexport { default as displayTool } from './imageTools/displayTool.js';\nexport { default as doubleTapTool } from './imageTools/doubleTapTool.js';\nexport { default as doubleTapZoom } from './imageTools/doubleTapZoom.js';\nexport { dragProbe, dragProbeTouch } from './imageTools/dragProbe.js';\n\nexport { ellipticalRoi, ellipticalRoiTouch } from './imageTools/ellipticalRoi.js';\nexport { freehand } from './imageTools/freehand.js';\n\nexport { highlight, highlightTouch } from './imageTools/highlight.js';\nexport { default as imageStats } from './imageTools/imageStats.js';\nexport { default as keyboardTool } from './imageTools/keyboardTool.js';\nexport { length, lengthTouch } from './imageTools/length.js';\nexport { magnify, magnifyTouchDrag } from './imageTools/magnify.js';\nexport { default as mouseButtonRectangleTool } from './imageTools/mouseButtonRectangleTool.js';\nexport { default as mouseButtonTool } from './imageTools/mouseButtonTool.js';\nexport { default as mouseWheelTool } from './imageTools/mouseWheelTool.js';\nexport { default as multiTouchDragTool } from './imageTools/multiTouchDragTool.js';\nexport { default as orientationMarkers } from './imageTools/orientationMarkers.js';\n\nexport { pan, panTouchDrag } from './imageTools/pan.js';\nexport { default as panMultiTouch } from './imageTools/panMultiTouch.js';\nexport { probe, probeTouch } from './imageTools/probe.js';\nexport { rectangleRoi, rectangleRoiTouch } from './imageTools/rectangleRoi.js';\nexport { rotate, rotateTouchDrag } from './imageTools/rotate.js';\nexport { default as rotateTouch } from './imageTools/rotateTouch.js';\nexport { default as saveAs } from './imageTools/saveAs.js';\nexport { seedAnnotate, seedAnnotateTouch } from './imageTools/seedAnnotate.js';\nexport { simpleAngle, simpleAngleTouch } from './imageTools/simpleAngle.js';\nexport { default as simpleMouseButtonTool } from './imageTools/simpleMouseButtonTool.js';\nexport { textMarker, textMarkerTouch } from './imageTools/textMarker.js';\n\nexport { default as touchDragTool } from './imageTools/touchDragTool.js';\nexport { default as touchPinchTool } from './imageTools/touchPinchTool.js';\nexport { default as touchTool } from './imageTools/touchTool.js';\nexport { wwwc, wwwcTouchDrag } from './imageTools/wwwc.js';\nexport { wwwcRegion, wwwcRegionTouch } from './imageTools/wwwcRegion.js';\nexport { zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag } from './imageTools/zoom.js';\nexport { brush } from './paintingTools/brush.js';\nexport { adaptiveBrush } from './paintingTools/adaptiveBrush.js';\nexport { default as version } from './version.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import calculateReferenceLine from './calculateReferenceLine.js';\nimport tool from './referenceLinesTool.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst referenceLines = {\n calculateReferenceLine,\n tool,\n renderActiveReferenceLine\n};\n\nexport default referenceLines;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/index.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst toolType = 'referenceLines';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n const renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach((referenceEnabledElement) => {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable (element, synchronizationContext, renderer) {\n renderer = renderer || renderActiveReferenceLine;\n\n addToolState(element, toolType, {\n synchronizationContext,\n renderer\n });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nconst tool = {\n enable,\n disable\n};\n\nexport default tool;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/referenceLinesTool.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nexport default function (vector) {\n const vec3 = convertToVector3(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n let orientation = '';\n const orientationX = vec3.x < 0 ? 'R' : 'L';\n const orientationY = vec3.y < 0 ? 'A' : 'P';\n const orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n const abs = new external.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (let i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/getOrientationString.js","export default function (string) {\n let inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/invertOrientationString.js","import external from '../externalModules.js';\n\n/**\n * Sets the canvas context transformation matrix so it is scaled to show text\n * more cleanly even if the image is scaled up. See\n * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText\n * for more information\n *\n * @param enabledElement\n * @param context\n * @param fontSize\n * @returns {{fontSize: number, lineHeight: number, fontScale: number}}\n */\nexport default function (enabledElement, context, fontSize) {\n const fontScale = 0.1;\n\n external.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n const scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n const lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n\n return {\n fontSize: scaledFontSize,\n lineHeight,\n fontScale\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/setContextToDisplayFontSize.js","import external from '../externalModules.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport MeasurementManager from '../measurementManager/measurementManager.js';\nimport LineSampleMeasurement from '../measurementManager/lineSampleMeasurement.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nconst toolType = 'probe4D';\n\nfunction updateLineSample (measurementData) {\n const cornerstone = external.cornerstone;\n const samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n let loader;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n const offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n const sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const timeSeriestoolData = getToolState(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n const timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n timeSeries,\n lineSample: new LineSampleMeasurement(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n MeasurementManager.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e) {\n const cornerstone = external.cornerstone;\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = 'white';\n const font = textStyle.getFont();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n const data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n drawHandles(context, eventData, data.handles, color);\n context.stroke();\n\n context.font = font;\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.fillStyle = color;\n\n drawTextBox(context, `${data.handles.end.x}, ${data.handles.end.y}`, textCoords.x, textCoords.y, color);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probeTool4D = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n toolType\n});\n\nexport default probeTool4D;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/probeTool4D.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nfunction MeasurementManager () {\n const cornerstone = external.cornerstone;\n const that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n const index = that.measurements.push(measurement);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_ADDED, eventDetail);\n };\n\n this.remove = function (index) {\n const measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_REMOVED, eventDetail);\n };\n\n}\n\n// Module/private exports\nconst manager = new MeasurementManager();\n\nexport default manager;\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/measurementManager.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nexport default function () {\n const cornerstone = external.cornerstone;\n const that = this;\n\n that.samples = [];\n\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n triggerEvent(cornerstone.events, EVENTS.LINE_SAMPLE_UPDATED);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/lineSampleMeasurement.js","import { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport incrementTimePoint from './incrementTimePoint.js';\n\nconst toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n const timeSeriesToolData = getToolState(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n const playClipToolData = getToolState(element, toolType);\n let playClipData;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n incrementTimePoint(element, 1, true);\n } else {\n incrementTimePoint(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n const playClipData = playClipToolData.data[0];\n\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nconst timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexport default timeSeriesPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesPlayer.js","import EVENTS from '../events.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport incrementTimePoint from './incrementTimePoint.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'timeSeriesScroll';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n setToolOptions(toolType, element, options);\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n const toolData = getToolState(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n const timeSeriesData = toolData.data[0];\n\n let pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n const timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n const timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n const images = -eventData.direction;\n\n incrementTimePoint(eventData.element, images);\n}\n\nfunction onDrag (e) {\n const mouseMoveData = e.originalEvent.detail;\n const eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n const toolData = getToolState(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n const timeSeriesDelta = eventData.deltaY / 3;\n const timeSeriesDeltaMod = eventData.deltaY % 3;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\n// Module/private exports\nconst timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst timeSeriesScrollWheel = mouseWheelTool(mouseWheelCallback);\nconst timeSeriesScrollTouchDrag = touchDragTool(onDrag);\n\nexport {\n timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesScroll.js","import external from '../externalModules.js';\n\n// This function synchronizes the target element ww/wc to match the source element\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/wwwcSynchronizer.js","import external from '../externalModules.js';\n\n// This function causes the target image to be drawn immediately\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n external.cornerstone.updateImage(targetElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/updateImageSynchronizer.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nfunction unique (array) {\n return array.filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n}\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer (event, handler) {\n const cornerstone = external.cornerstone;\n const that = this;\n const sourceElements = []; // Source elements fire the events we want to synchronize to\n const targetElements = []; // Target elements we want to synchronize to source elements\n\n let ignoreFiredEvents = false;\n const initialData = {};\n let eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n const targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n const targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n const targetImagePosition = convertToVector3(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent (sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n const targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n const targetImageId = initialData.imageIds.targetElements[targetIndex];\n const sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n const sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n let positionDifference;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent (e) {\n const eventData = e.detail;\n\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n const index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n element.addEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n const index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n const index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n element.removeEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n const index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler (e) {\n const element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n const elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener(EVENTS.ELEMENT_DISABLED, disableHandler);\n element.addEventListener(EVENTS.ELEMENT_DISABLED, disableHandler);\n });\n };\n\n this.destroy = function () {\n const elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexport default Synchronizer;\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/Synchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes any scrolling actions within the stack to propagate to\n// All of the other viewports that are synced\nexport default function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the stack of the target viewport\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n let newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackScrollSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n stackData.imageIds.forEach((imageId, index) => {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\n\n// In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable.\n\nexport default function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n const finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionOffsetSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceStackToolDataSource = getToolState(sourceElement, 'stack');\n const sourceStackData = sourceStackToolDataSource.data[0];\n const targetStackToolDataSource = getToolState(targetElement, 'stack');\n const targetStackData = targetStackToolDataSource.data[0];\n\n let newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImageIndexSynchronizer.js","import external from '../externalModules.js';\n\n// This function synchronizes the target zoom and pan to match the source\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/panZoomSynchronizer.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager (toolTypes, oldStateManager) {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n const imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n\n return imageIdToolStateManager;\n}\n\nconst timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager (element, tools) {\n tools = tools || ['timeSeries'];\n let oldStateManager = getElementToolStateManager(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n const timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n setElementToolStateManager(element, timeSeriesSpecificStateManager);\n}\n\nexport {\n addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/timeSeriesSpecificStateManager.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager (toolTypes, oldStateManager) {\n let toolState = {};\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n\n }\n\n const stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n\n\n return stackSpecificToolStateManager;\n}\n\nconst stackStateManagers = [];\n\nfunction addStackStateManager (element, otherTools) {\n let oldStateManager = getElementToolStateManager(element);\n\n if (!oldStateManager) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n let stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n const stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n setElementToolStateManager(element, stackSpecificStateManager);\n}\n\nconst stackSpecificStateManager = {\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\nexport {\n stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/stackSpecificStateManager.js","// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager () {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState (frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nconst globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexport {\n newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/frameOfReferenceStateManager.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager } from './toolState.js';\n\nfunction saveApplicationState (elements) {\n // Save imageId-specific tool state data\n const appState = {\n imageIdToolState: globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = external.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState (appState) {\n if (!appState.hasOwnProperty('imageIdToolState') ||\n !appState.hasOwnProperty('elementToolState') ||\n !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n\n // Restore all the imageId specific tool data\n globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n const element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n const savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nconst appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexport default appState;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/appState.js","import scroll from '../util/scroll.js';\nimport keyboardTool from '../imageTools/keyboardTool.js';\n\nconst keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback (e) {\n const eventData = e.detail;\n const keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n let images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n scroll(eventData.element, images);\n}\n\n// Module/private exports\nconst stackScrollKeyboard = keyboardTool(keyDownCallback);\n\nexport default stackScrollKeyboard;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScrollKeyboard.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst toolType = 'stackPrefetch';\nconst requestType = 'prefetch';\n\nlet configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nlet resetPrefetchTimeout;\nconst resetPrefetchDelay = 10;\n\nfunction range (lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n const arr = [];\n let c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nconst max = function (arr) {\n return Math.max.apply(null, arr);\n};\n\nconst min = function (arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex (arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n const l = [];\n const h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch (element) {\n // Check to make sure stack data exists\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n const stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList (imageIdIndex) {\n const index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) { // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort((a, b) => (a - b));\n const indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n const imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n requestPoolManager.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n const nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n let imageId;\n let nextImageIdIndex;\n const preventCache = false;\n\n function doneCallback (image) {\n // Console.log('prefetch done: ' + image.imageId);\n const imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function failCallback (error) {\n console.log(`prefetch errored: ${error}`);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n let lowerIndex = nearest.low;\n let higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n const currentIndex = stack.currentImageIdIndex;\n const shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n const shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n const shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n const shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n requestPoolManager.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler (element) {\n return function (e) {\n const eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n let stackData;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = getToolState(element, 'stack');\n } catch(error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated (e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n const element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch(error) {\n return;\n }\n\n }, resetPrefetchDelay);\n}\n\nfunction enable (element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n const stackPrefetchDataArray = getToolState(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n const stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n const indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n addToolState(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n element.addEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n external.cornerstone.events.addEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n}\n\nfunction disable (element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n\n const stackPrefetchData = getToolState(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n requestPoolManager.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n setMaxSimultaneousRequests(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nconst stackPrefetch = {\n enable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nexport default stackPrefetch;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackPrefetch.js","import displayTool from '../imageTools/displayTool.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nconst scrollBarHeight = 6;\n\nconst configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const width = eventData.enabledElement.canvas.width;\n const height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n const context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n const config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const imageIds = stackData.data[0].imageIds;\n const currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n const cursorWidth = width / imageIds.length;\n const cursorHeight = height / imageIds.length;\n const xPosition = cursorWidth * currentImageIdIndex;\n const yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nconst scrollIndicator = displayTool(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexport default scrollIndicator;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/scrollIndicator.js","import FusionRenderer from './fusionRenderer.js';\n\nconst stackRenderers = {};\n\nstackRenderers.FusionRenderer = FusionRenderer;\n\nexport default stackRenderers;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackRenderers.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default class FusionRenderer {\n constructor () {\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n render (element, imageStacks) {\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n const toolData = getToolState(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n const cornerstone = external.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n const baseImageObject = imageStacks[0];\n const currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n const overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then((baseImage) => {\n let baseLayerId = this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach((imgObj, overlayLayerIndex) => {\n const imageId = this.findImageFn(imgObj.imageIds, currentImageId);\n const layerIndex = overlayLayerIndex + 1;\n let currentLayerId = this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then((image) => {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/fusionRenderer.js","/* eslint no-bitwise:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nconst toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\nfunction getPlayClipTimeouts (vector, speed) {\n\n let i;\n let sample;\n let delay;\n let sum = 0;\n const limit = vector.length;\n const timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = (Number(vector[i]) / speed) | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) { // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = (sum / timeouts.length) | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData (playClipData) {\n const id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent (element) {\n const eventDetail = {\n element\n };\n\n triggerEvent(element, EVENTS.CLIP_STOPPED, eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n let playClipData;\n let playClipTimeouts;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n const stackToolData = getToolState(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (stackToolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = stackToolData.data[0];\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (\n playClipData.ignoreFrameTimeVector !== true &&\n playClipData.frameTimeVector &&\n playClipData.frameTimeVector.length === stackData.imageIds.length\n ) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n const playClipAction = () => {\n\n // Hoisting of context variables\n let loader,\n startLoadingHandler,\n endLoadingHandler,\n errorLoadingHandler,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n const imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n\n }\n\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler () {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n\n}\n\nexport {\n playClip,\n stopClip\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/playClip.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet mouseX;\nlet mouseY;\n\nfunction keyPress (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n const keyPressData = {\n event: window.event || e, // Old IE support\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n const keyPressEvents = {\n keydown: EVENTS.KEY_DOWN,\n keypress: EVENTS.KEY_PRESS,\n keyup: EVENTS.KEY_UP\n };\n\n triggerEvent(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove (e) {\n mouseX = e.pageX;\n mouseY = e.pageY;\n}\n\nconst keyboardEvents = ['keydown', 'keypress', 'keyup'];\n\nfunction enable (element) {\n keyboardEvents.forEach((eventType) => {\n element.removeEventListener(eventType, keyPress);\n element.addEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n element.addEventListener('mousemove', mouseMove);\n}\n\nfunction disable (element) {\n keyboardEvents.forEach((eventType) => {\n element.removeEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n}\n\n// Module exports\nconst keyboardInput = {\n enable,\n disable\n};\n\nexport default keyboardInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/keyboardInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet isClickEvent = true;\nlet preventClickTimeout;\nconst clickDelay = 200;\n\nfunction getEventWhich (event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler () {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_DOUBLE_CLICK;\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n const lastPoints = copyPoints(startPoints);\n\n\n /* Note: It seems we can't trust MouseEvent.buttons for dblclick events?\n\n For some reason they are always firing with e.buttons = 0\n so we have to use e.which for now instead.\n\n Might be related to using preventDefault on the original mousedown or click events?\n */\n const eventData = {\n event: e,\n which: e.which,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\nfunction mouseDown (e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_DOWN;\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n element.removeEventListener('mousemove', mouseMove);\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n const eventPropagated = triggerEvent(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = EVENTS.MOUSE_DOWN_ACTIVATE;\n triggerEvent(eventData.element, EVENTS.MOUSE_DOWN_ACTIVATE, eventData);\n }\n\n const whichMouseButton = getEventWhich(e);\n\n function onMouseMove (e) {\n // Calculate our current points in page and image coordinates\n const eventType = EVENTS.MOUSE_DRAG;\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n\n // Prevent left click selection of DOM elements\n return pauseEvent(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp (e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n let eventType = EVENTS.MOUSE_UP;\n\n if (isClickEvent) {\n eventType = EVENTS.MOUSE_CLICK;\n }\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.addEventListener('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n\n return pauseEvent(e);\n}\n\nfunction mouseMove (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_MOVE;\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n}\n\nfunction disable (element) {\n element.removeEventListener('mousedown', mouseDown);\n element.removeEventListener('mousemove', mouseMove);\n element.removeEventListener('dblclick', mouseDoubleClick);\n}\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n element.addEventListener('mousedown', mouseDown);\n element.addEventListener('mousemove', mouseMove);\n element.addEventListener('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nconst mouseInput = {\n enable,\n disable\n};\n\nexport default mouseInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction mouseWheel (e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.type === 'mousewheel' && e.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.type === 'DOMMouseScroll' && e.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n let x;\n let y;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n const startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = (window.event && window.event.wheelDelta) ? window.event : e; // Old IE support\n\n let wheelDelta;\n\n if (e.wheelDelta) {\n wheelDelta = -e.wheelDelta;\n } else if (e.deltaY) {\n wheelDelta = -e.deltaY;\n } else if (e.detail) {\n wheelDelta = -e.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n const direction = wheelDelta < 0 ? -1 : 1;\n\n const mouseWheelData = {\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n triggerEvent(element, EVENTS.MOUSE_WHEEL, mouseWheelData);\n}\n\nconst mouseWheelEvents = ['mousewheel', 'DOMMouseScroll'];\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n mouseWheelEvents.forEach((eventType) => {\n element.addEventListener(eventType, mouseWheel);\n });\n}\n\nfunction disable (element) {\n mouseWheelEvents.forEach((eventType) => {\n element.removeEventListener(eventType, mouseWheel);\n });\n}\n\n// Module exports\nconst mouseWheelInput = {\n enable,\n disable\n};\n\nexport default mouseWheelInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseWheelInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport preventGhostClick from '../inputSources/preventGhostClick.js';\nimport triggerEvent from '../util/triggerEvent.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nlet startPoints,\n currentPoints,\n lastPoints,\n deltaPoints,\n eventData,\n touchStartDelay,\n pressTimeout,\n pageDistanceMoved;\n\nlet lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta;\n\nconst pressDelay = 700,\n pressMaxDistance = 5;\n\nconst toolType = 'touchInput';\n\nfunction onTouch (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget || e.srcEvent.currentTarget;\n let eventType,\n scaleChange,\n delta,\n remainingPointers,\n rotation;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if ((e.pointers && e.pointers.length > 1) || (e.touches && e.touches.length > 1)) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = EVENTS.TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = EVENTS.DOUBLE_TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_PINCH;\n eventData = {\n event: e,\n startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_START;\n if (e.touches.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_START;\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n const eventPropagated = triggerEvent(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = EVENTS.TOUCH_START_ACTIVE;\n if (e.touches.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_START_ACTIVE;\n }\n\n eventData.type = eventType;\n triggerEvent(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = copyPoints(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_PRESS;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),\n client: {\n x: e.changedTouches[0].clientX,\n y: e.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_END;\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = EVENTS.TOUCH_DRAG;\n if (e.pointers.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_DRAG;\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = EVENTS.TOUCH_DRAG_END;\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return pauseEvent(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = EVENTS.TOUCH_ROTATE;\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n rotation,\n type: eventType\n };\n triggerEvent(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable (element) {\n disable(element);\n const Hammer = external.Hammer;\n\n const hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n const mc = new Hammer.Manager(element, hammerOptions);\n\n const panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n const pan = new Hammer.Pan(panOptions);\n const pinch = new Hammer.Pinch({\n threshold: 0\n });\n const rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n const doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n preventGhostClick.enable(element);\n\n const touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach((eventType) => {\n element.addEventListener(eventType, onTouch);\n });\n\n const options = getToolOptions(toolType, element);\n\n options.hammer = mc;\n\n setToolOptions(toolType, element, options);\n}\n\nfunction disable (element) {\n preventGhostClick.disable(element);\n\n const touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach((eventType) => {\n element.removeEventListener(eventType, onTouch);\n });\n\n const options = getToolOptions(toolType, element);\n const mc = options.hammer;\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nconst touchInput = {\n enable,\n disable\n};\n\nexport default touchInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/touchInput.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = angle.getConfiguration();\n const cornerstone = external.cornerstone;\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n let handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n let handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n drawHandles(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n const dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n const dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n const dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n const dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n let angle = Math.acos(Math.abs(((dx1 * dx2) + (dy1 * dy2)) / (Math.sqrt((dx1 * dx1) + (dy1 * dy1)) * Math.sqrt((dx2 * dx2) + (dy2 * dy2)))));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n const textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n const textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n drawTextBox(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst angle = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst angleTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n angle,\n angleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/angleTool.js","/* eslint no-alert:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawArrow from '../util/drawArrow.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const element = mouseEventData.element;\n const measurementData = createNewMeasurement(mouseEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(element);\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (eventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const enabledElement = eventData.enabledElement;\n const cornerstone = external.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = arrowAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the arrow\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n drawArrow(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n drawArrow(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(data.text).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const element = touchEventData.element;\n const measurementData = createNewMeasurement(touchEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n addToolState(element, toolType, measurementData);\n element.removeEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n const options = getToolOptions(toolType, element);\n let data;\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst arrowAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nconst arrowAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport { arrowAnnotate, arrowAnnotateTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/arrowAnnotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState, clearToolState } from '../stateManagement/toolState.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { imagePointToPatientPoint } from '../util/pointProjector.js';\nimport convertToVector3 from '../util/convertToVector3.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'crosshairs';\n\nfunction chooseLocation (e) {\n const eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n const cornerstone = external.cornerstone;\n const sourceElement = e.currentTarget;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n const sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n const patientPoint = imagePointToPatientPoint(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n const stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const row = convertToVector3(imagePlane.rowCosines);\n const column = convertToVector3(imagePlane.columnCosines);\n const normal = column.clone().cross(row.clone());\n const distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction mouseDragCallback (e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enable (element, mouseButtonMask, synchronizationContext) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Module/private exports\nconst crosshairs = {\n activate: enable,\n deactivate: disable,\n enable,\n disable\n};\n\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n}\n\nfunction dragStartCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n chooseLocation(e);\n\n return false;\n}\n\nfunction dragCallback (e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enableTouch (element, synchronizationContext) {\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback);\n\n element.addEventListener(EVENTS.TOUCH_START, dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch (element) {\n element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback);\n}\n\nconst crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexport {\n crosshairs,\n crosshairsTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/crosshairs.js","import external from '../externalModules.js';\nimport doubleTapTool from './doubleTapTool.js';\n\nfunction fitToWindowStrategy (eventData) {\n external.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback (e) {\n const eventData = e.detail;\n\n doubleTapZoom.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst doubleTapZoom = doubleTapTool(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexport default doubleTapZoom;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapZoom.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'dragProbe';\n\nlet dragEventData;\n\nfunction defaultStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const x = Math.round(eventData.currentPoints.image.x);\n const y = Math.round(eventData.currentPoints.image.y);\n\n let storedPixels;\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n text = `${x}, ${y}`;\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]} A: ${storedPixels[3]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n // Draw text\n const coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n let toolCoords;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() / 2);\n }\n\n let storedPixels;\n let text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 ||\n toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = getRGBPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n text = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n\n const modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += `HU: ${modalityPixelValueText}`;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n const suv = calculateSUV(eventData.image, sp);\n\n if (suv) {\n text += ` SUV: ${parseFloat(suv.toFixed(2))}`;\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n const textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n let translation;\n const handleRadius = 6;\n const width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -textStyle.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(textStyle.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n drawTextBox(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n dragProbe.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction imageRenderedCallback () {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n dragEventData = eventData;\n external.cornerstone.updateImage(element);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst dragProbe = simpleMouseButtonTool(mouseDownCallback, toolType);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nconst options = {\n fireOnTouchStart: true\n};\n\nconst dragProbeTouch = touchDragTool(dragCallback, options);\n\nexport {\n dragProbe,\n dragProbeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/dragProbe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport drawEllipse from '../util/drawEllipse.js';\nimport pointInEllipse from '../util/pointInEllipse.js';\nimport calculateEllipseStatistics from '../util/calculateEllipseStatistics.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse (element, data, coords, distance) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n const majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n const pointInMinorEllipse = pointInEllipse(minorEllipse, coords);\n const pointInMajorEllipse = pointInEllipse(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool (element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch (element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = ellipticalRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n drawEllipse(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateEllipseStatistics(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst ellipticalRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst ellipticalRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType\n});\n\nexport { ellipticalRoi, ellipticalRoiTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/ellipticalRoi.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'freehand';\nlet configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n const data = toolData.data[config.currentTool];\n\n const handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle (eventData, toolIndex) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n const mousePoint = eventData.currentPoints.canvas;\n\n for (let i = 0; i < data.handles.length; i++) {\n const handleCanvas = external.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (external.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n let handleNearby;\n\n for (let toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby,\n toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n\n // Check if drawing is finished\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback (e) {\n const eventData = e.detail;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n let x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n let y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n const currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n const lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n const lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n const handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < (data.handles.length - 1)) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing (eventData) {\n const element = eventData.element;\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n\n const measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n const config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n addToolState(eventData.element, toolType, measurementData);\n\n const toolData = getToolState(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing (eventData, handleNearby) {\n const element = eventData.element;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n const toolData = getToolState(eventData.element, toolType);\n\n let handleNearby, toolIndex;\n\n const config = freehand.getConfiguration();\n const currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n const nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n let fillColor = toolColors.getFillColor();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n fillColor = toolColors.getFillColor();\n } else {\n color = toolColors.getToolColor();\n fillColor = toolColors.getToolColor();\n }\n\n let handleStart;\n\n if (data.handles.length) {\n for (let j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (let k = 0; k < data.handles[j].lines.length; k++) {\n const lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n const mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === (data.handles.length - 1)) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n const options = {\n fill: fillColor\n };\n\n if (data.active) {\n drawHandles(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n drawHandles(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n\n// /////// END IMAGE RENDERING ///////\nfunction enable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module/private exports\nconst freehand = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration\n};\n\nexport { freehand };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/freehand.js","import external from '../externalModules.js';\nimport mouseButtonRectangleTool from './mouseButtonRectangleTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n const existingToolData = getToolState(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n let insideBox = false;\n\n if ((coords.x >= rect.left && coords.x <= (rect.left + rect.width)) && coords.y >= rect.top && coords.y <= (rect.top + rect.height)) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this elemen\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n\n context.save();\n\n const data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n drawHandles(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst preventHandleOutsideImage = true;\n\nconst highlight = mouseButtonRectangleTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nconst highlightTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nexport {\n highlight,\n highlightTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/highlight.js","import displayTool from './displayTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const image = eventData.image;\n const stats = image.stats;\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n const text = `${key} : ${stats[key]}`;\n\n textLines.push(text);\n });\n\n drawTextBox(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nconst imageStats = displayTool(onImageRendered);\n\nexport default imageStats;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/imageStats.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n const { image, element } = eventData;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = length.getConfiguration();\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n let rowPixelSpacing;\n let colPixelSpacing;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n const color = toolColors.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n const dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n const dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n const length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n let suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n const text = `${length.toFixed(2)}${suffix}`;\n\n if (!data.handles.textBox.hasMoved) {\n const coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst length = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst lengthTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n length,\n lengthTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/length.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getBrowserInfo } from '../util/getMaxSimultaneousRequests.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'magnify';\n\nlet configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nlet browserName;\n\nlet currentPoints;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool (eventData) {\n const element = eventData.element;\n\n element.querySelector('.magnifyTool').style.display = 'none';\n\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n drawMagnificationTool(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction newImageCallback (e) {\n const eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, dragEndCallback);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, dragEndCallback);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool (eventData) {\n const element = eventData.element;\n const magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n const config = magnify.getConfiguration();\n\n const magnifySize = config.magnifySize;\n const magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n const canvas = element.querySelector('canvas:not(.magnifyTool)');\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n const getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n const canvasLocation = external.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n const copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n const scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = `${canvasLocation.y - 0.5 * magnifySize}px`;\n magnifyCanvas.style.left = `${canvasLocation.x - 0.5 * magnifySize}px`;\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas (element) {\n // If the magnifying glass canvas doesn't already exist\n if (element.querySelector('.magnifyTool') === null) {\n // Create a canvas and append it as a child to the element\n const magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n const config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas (element) {\n const magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (magnifyCanvas) {\n element.removeChild(magnifyCanvas);\n }\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable (element) {\n if (!browserName) {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst magnify = {\n enable,\n activate,\n deactivate: disable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nconst options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nconst magnifyTouchDrag = touchDragTool(dragCallback, options);\n\nexport {\n magnify,\n magnifyTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/magnify.js","import external from '../externalModules.js';\nimport orientation from '../orientation/index.js';\nimport displayTool from './displayTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction getOrientationMarkers (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n const imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n const rowString = orientation.getOrientationString(imagePlaneMetaData.rowCosines);\n const columnString = orientation.getOrientationString(imagePlaneMetaData.columnCosines);\n\n const oppositeRowString = orientation.invertOrientationString(rowString);\n const oppositeColumnString = orientation.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n let coords;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n const top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n const bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n const left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n const right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top,\n bottom,\n left,\n right\n };\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n const markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n const coords = getOrientationMarkerPositions(element, markers);\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getToolColor();\n\n const textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n drawTextBox(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n drawTextBox(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n const config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n drawTextBox(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n drawTextBox(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst orientationMarkers = displayTool(onImageRendered);\n\nexport default orientationMarkers;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/orientationMarkers.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'pan';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n let widthScale = eventData.viewport.scale;\n let heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= (eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing);\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= (eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing);\n }\n\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / widthScale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / heightScale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst pan = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst panTouchDrag = touchDragTool(dragCallback);\n\nexport {\n pan,\n panTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/pan.js","import external from '../externalModules.js';\nimport multiTouchDragTool from './multiTouchDragTool.js';\n\nfunction touchPanCallback (e) {\n const eventData = e.detail;\n const config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 2);\n }\n};\n\nconst panMultiTouch = multiTouchDragTool(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexport default panMultiTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/panMultiTouch.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n const endCanvas = external.cornerstone.pixelToCanvas(element, data.handles.end);\n\n\n return external.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n\n for (let i = 0; i < toolData.data.length; i++) {\n\n context.save();\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the handles\n drawHandles(context, eventData, data.handles, color);\n\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n let storedPixels;\n\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = `${x}, ${y}`;\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probe = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst probeTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n probe,\n probeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/probe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = rectangleRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = (ellipse.width * columnPixelSpacing) * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst rectangleRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst rectangleRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n rectangleRoi,\n rectangleRoiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rectangleRoi.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'rotate';\n\n// --- Strategies --- //\nfunction defaultStrategy (eventData) {\n // Calculate distance from the center of the image\n const rect = eventData.element.getBoundingClientRect(eventData.element);\n\n const points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n const width = eventData.element.clientWidth;\n const height = eventData.element.clientHeight;\n\n const pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n const rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n const rotationDegrees = rotationRadians * (180 / Math.PI);\n const rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n rotate.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst rotate = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nconst rotateTouchDrag = touchDragTool(dragCallback);\n\nexport {\n rotate,\n rotateTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\n\nfunction touchRotateCallback (e) {\n const eventData = e.detail;\n\n eventData.viewport.rotation += eventData.rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable (element) {\n element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n}\n\nfunction activate (element) {\n element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n element.addEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n}\n\nconst rotateTouch = {\n activate,\n disable\n};\n\nexport default rotateTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotateTouch.js","export default function saveAs (element, filename, mimetype = 'image/png') {\n // Setting the default value for mimetype to image/png\n const canvas = element.querySelector('canvas');\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n const lnk = document.createElement('a');\n\n // The key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // Convert canvas content to data-uri for link. When download\n // Attribute is set the content pointed to by link will be\n // Pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n const e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n } else if (lnk.fireEvent) {\n lnk.fireEvent('onclick');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/saveAs.js","/* eslint no-alert:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawCircle from '../util/drawCircle.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n const realCoords = external.cornerstone.pixelToCanvas(element, data.handles.end);\n const distanceToPoint = external.cornerstoneMath.point.distance(realCoords, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n const canvasWidth = eventData.canvasContext.canvas.width;\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = seedAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw\n const handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n drawCircle(context, handleCanvas, color, lineWidth);\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n let textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = `${data.text} x: ${Math.round(data.handles.end.x)\n } y: ${Math.round(data.handles.end.y)}`;\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(textPlusCoords).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > (canvasWidth / 2)) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n const boundingBoxPoints = [\n {\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction pressCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst seedAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nconst seedAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport {\n seedAnnotate,\n seedAnnotateTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/seedAnnotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport touchTool from './touchTool.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\n\nconst toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 25);\n}\n\nfunction length (vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = simpleAngle.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n const columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n const rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n let suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n const sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n const sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideALength = length(sideA);\n const sideBLength = length(sideB);\n const sideCLength = length(sideC);\n\n // Cosine law\n let angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n\n if (rAngle) {\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n const distance = 15;\n\n let textCoords;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n const textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(mouseEventData);\n const element = mouseEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(touchEventData);\n const element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n });\n });\n}\n\nconst simpleAngle = mouseButtonTool({\n createNewMeasurement,\n addNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst simpleAngleTouch = touchTool({\n createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n simpleAngle,\n simpleAngleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleAngle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport { removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n const imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!external.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n let currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n const insideBoundingBox = pointInsideBoundingBox(data.handles.end, coords);\n\n\n return (distanceToPoint < 10) || insideBoundingBox;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const config = textMarker.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n let color = toolColors.getToolColor();\n\n if (data.active) {\n color = toolColors.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n const measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n const textCoords = external.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n data.handles.end.boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n }\n\n const config = textMarker.getConfiguration();\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction touchPressCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.addEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst textMarker = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nconst textMarkerTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback: touchPressCallback\n});\n\nexport {\n textMarker,\n textMarkerTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/textMarker.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'wwwc';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction defaultStrategy (eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n const maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n const minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n\n const deltaX = eventData.deltaPoints.page.x * multiplier;\n const deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += (deltaX);\n eventData.viewport.voi.windowCenter += (deltaY);\n}\n\nfunction mouseDragCallback (e) {\n const eventData = e.detail;\n\n wwwc.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false; // False = cases jquery to preventDefault() and stopPropagation() this event\n}\n\nfunction touchDragCallback (e) {\n const eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n const dragData = eventData;\n\n const maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n const minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n const deltaX = dragData.deltaPoints.page.x * multiplier;\n const deltaY = dragData.deltaPoints.page.y * multiplier;\n\n const config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n } else {\n dragData.viewport.voi.windowWidth += (deltaY);\n dragData.viewport.voi.windowCenter += (deltaX);\n }\n } else {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n }\n\n external.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nconst wwwc = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nconst wwwcTouchDrag = touchDragTool(touchDragCallback);\n\nexport {\n wwwc,\n wwwcTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwc.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport getLuminance from '../util/getLuminance.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'wwwcRegion';\n\nlet configuration = {\n minWindowWidth: 10\n};\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) {\n const numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n let min = globalMax;\n let max = globalMin;\n let sum = 0;\n\n for (let index = 0; index < numPixels; index++) {\n const spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min,\n max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion (eventData) {\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n let width = Math.abs(startPoint.x - endPoint.x);\n let height = Math.abs(startPoint.y - endPoint.y);\n\n let left = Math.min(startPoint.x, endPoint.x);\n let top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n const pixelLuminanceData = getLuminance(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n const minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n const config = wwwcRegion.getConfiguration();\n const viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.addEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n if (e.type === EVENTS.MOUSE_DRAG) {\n element.addEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n const measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n addToolState(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const context = eventData.canvasContext;\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n const color = toolColors.getActiveColor();\n\n // Calculate the rectangle parameters\n const startPointCanvas = cornerstone.pixelToCanvas(element, startPoint);\n const endPointCanvas = cornerstone.pixelToCanvas(element, endPoint);\n\n const left = Math.min(startPointCanvas.x, endPointCanvas.x);\n const top = Math.min(startPointCanvas.y, endPointCanvas.y);\n const width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n const height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag (element) {\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction activateTouchDrag (element) {\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.addEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst wwwcRegion = {\n activate,\n deactivate: disable,\n disable,\n setConfiguration,\n getConfiguration\n};\n\nconst wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexport {\n wwwcRegion,\n wwwcRegionTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwcRegion.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport mouseWheelTool from './mouseWheelTool.js';\nimport touchPinchTool from './touchPinchTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getToolOptions } from '../enabledElementTools.js';\n\nconst toolType = 'zoom';\nlet startPoints;\n\nfunction changeViewportScale (viewport, ticks) {\n const config = zoom.getConfiguration();\n const pow = 1.7;\n\n const oldFactor = Math.log(viewport.scale) / Math.log(pow);\n const factor = oldFactor + ticks;\n\n const scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition (position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift (shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n const angle = viewport.rotation * Math.PI / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy (eventData, ticks) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy (eventData, ticks) {\n const element = eventData.element;\n const image = eventData.image;\n const config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n const shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n const translateSpeed = 8;\n const outwardsMinScaleToTranslate = 3;\n const minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n let desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n const distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy (eventData, ticks) {\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n const ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n let ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n const config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const config = zoom.getConfiguration();\n const viewport = eventData.viewport;\n const element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nconst zoom = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nconst zoomWheel = mouseWheelTool(mouseWheelCallback);\nconst zoomTouchPinch = touchPinchTool(touchPinchCallback);\nconst zoomTouchDrag = touchDragTool(dragCallback);\n\nexport {\n zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/zoom.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'brush';\nconst configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet dragging = false;\n\nfunction paint (eventData) {\n const configuration = brush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown (e) {\n const eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e) {\n const eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = brush.getConfiguration();\n const radius = configuration.radius;\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst brush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexport { brush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brush.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'adaptiveBrush';\nconst configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet thrMax;\nlet thrMin;\nlet currentRadius;\nlet dragging;\n\nfunction getGreyValues (pointerArray, pixelData, imageColumns) {\n const configuration = adaptiveBrush.getConfiguration();\n const tolerance = configuration.tolerance;\n let minValue = Number.MAX_VALUE;\n let maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach((point) => {\n const pixelIndex = point[1] * imageColumns + point[0];\n const greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush (imagePixelData, brushPixelData, rows, columns) {\n const configuration = adaptiveBrush.getConfiguration();\n const brushPixelValue = configuration.draw;\n const mouseX = Math.round(lastImageCoords.x);\n const mouseY = Math.round(lastImageCoords.y);\n let numPixelsOutsideThresholdWindow = null;\n let pointerArray = [];\n let radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = getCircle(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (let j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n const xCoord = pointerArray[j][0];\n const yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n const pixelIndex = yCoord * columns + xCoord;\n const pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n drawBrushPixels(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { rows, columns } = layer.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction erase (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n const configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown (e) {\n const eventData = e.detail;\n\n const element = eventData.element;\n const configuration = adaptiveBrush.getConfiguration();\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { x, y } = eventData.currentPoints.image;\n const { rows, columns } = layer.image;\n const pointerArray = getCircle(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e) {\n const eventData = e.detail;\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = adaptiveBrush.getConfiguration();\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const pointerArray = getCircle(currentRadius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst adaptiveBrush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexport { adaptiveBrush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/adaptiveBrush.js","export default '2.0.0';\n\n\n\n// WEBPACK FOOTER //\n// ./version.js"],"sourceRoot":""} \ No newline at end of file diff --git a/examples/cornerstone.js b/examples/cornerstone.js index 8c8f239f5..5fc3044f6 100644 --- a/examples/cornerstone.js +++ b/examples/cornerstone.js @@ -1,4 +1,4 @@ -/*! cornerstone-core - 1.1.3 - 2017-11-17 | (c) 2016 Chris Hafey | https://github.com/chafey/cornerstone */ +/*! cornerstone-core - 2.0.0 - 2017-12-08 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstone */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -8,7 +8,7 @@ exports["cornerstone-core"] = factory(); else root["cornerstone"] = factory(); -})(this, function() { +})(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; @@ -212,6 +212,15 @@ var enabledElements = []; * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid */ +/** + * An Image Load Object + * + * @typedef {Object} ImageLoadObject + * + * @property {Promise} promise - The Promise tracking the loading of this image + * @property {Function|undefined} cancelFn - A function to cancel the image load request + */ + /** * Retrieves a Cornerstone Enabled Element object * @@ -303,16 +312,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = triggerEvent; - -var _externalModules = __webpack_require__(33); - /** * Trigger a CustomEvent * * @param {EventTarget} el The element or EventTarget to trigger the event upon * @param {String} type The event type name * @param {Object|null} detail=null The event data to be sent - * @returns {void} + * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. */ function triggerEvent(el, type) { var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; @@ -321,15 +327,16 @@ function triggerEvent(el, type) { // This check is needed to polyfill CustomEvent on IE11- if (typeof window.CustomEvent === 'function') { - event = new CustomEvent(type.toLocaleLowerCase(), { detail: detail }); + event = new CustomEvent(type, { + detail: detail, + cancelable: true + }); } else { event = document.createEvent('CustomEvent'); - event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail); + event.initCustomEvent(type, true, true, detail); } - // TODO: remove jQuery event triggers - _externalModules.external.$(el).trigger(type, detail); - el.dispatchEvent(event); + return el.dispatchEvent(event); } /***/ }), @@ -490,9 +497,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _colormap = __webpack_require__(27); +var _colormap = __webpack_require__(28); -var _lookupTable = __webpack_require__(28); +var _lookupTable = __webpack_require__(29); var _lookupTable2 = _interopRequireDefault(_lookupTable); @@ -521,9 +528,9 @@ var _now = __webpack_require__(1); var _now2 = _interopRequireDefault(_now); -var _generateLut = __webpack_require__(9); +var _generateColorLut = __webpack_require__(44); -var _generateLut2 = _interopRequireDefault(_generateLut); +var _generateColorLut2 = _interopRequireDefault(_generateColorLut); var _storedColorPixelDataToCanvasImageData = __webpack_require__(19); @@ -537,19 +544,19 @@ var _setToPixelCoordinateSystem = __webpack_require__(3); var _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem); -var _index = __webpack_require__(14); +var _index = __webpack_require__(13); var _index2 = _interopRequireDefault(_index); -var _doesImageNeedToBeRendered = __webpack_require__(13); +var _doesImageNeedToBeRendered = __webpack_require__(12); var _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered); -var _initializeRenderCanvas = __webpack_require__(11); +var _initializeRenderCanvas = __webpack_require__(10); var _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas); -var _saveLastRendered = __webpack_require__(12); +var _saveLastRendered = __webpack_require__(11); var _saveLastRendered2 = _interopRequireDefault(_saveLastRendered); @@ -562,7 +569,7 @@ function getLut(image, viewport) { } // Lut is invalid or not present, regenerate it and cache it - (0, _generateLut2.default)(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert); + (0, _generateColorLut2.default)(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert); image.cachedLut.windowWidth = viewport.voi.windowWidth; image.cachedLut.windowCenter = viewport.voi.windowCenter; image.cachedLut.invert = viewport.invert; @@ -705,56 +712,6 @@ function addColorLayer(layer, invalidated) { "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) { - var maxPixelValue = image.maxPixelValue; - var minPixelValue = image.minPixelValue; - var offset = Math.min(minPixelValue, 0); - - if (image.cachedLut === undefined) { - var length = maxPixelValue - offset + 1; - - image.cachedLut = {}; - image.cachedLut.lutArray = new Uint8ClampedArray(length); - } - - var lut = image.cachedLut.lutArray; - var mlutfn = (0, _getModalityLUT2.default)(image.slope, image.intercept, modalityLUT); - var vlutfn = (0, _getVOILut2.default)(windowWidth, windowCenter, voiLUT); - - if (invert === true) { - for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) { - lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue)); - } - } else { - for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) { - lut[_storedValue + -offset] = vlutfn(mlutfn(_storedValue)); - } - } - - return lut; -}; - -var _getModalityLUT = __webpack_require__(26); - -var _getModalityLUT2 = _interopRequireDefault(_getModalityLUT); - -var _getVOILut = __webpack_require__(42); - -var _getVOILut2 = _interopRequireDefault(_getVOILut); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - Object.defineProperty(exports, "__esModule", { value: true }); @@ -772,7 +729,7 @@ var _calculateTransform2 = _interopRequireDefault(_calculateTransform); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 11 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -803,7 +760,7 @@ exports.default = function (enabledElement, image) { }; /***/ }), -/* 12 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -834,7 +791,7 @@ exports.default = function (enabledElement) { }; /***/ }), -/* 13 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -852,7 +809,7 @@ exports.default = function (enabledElement, image) { }; /***/ }), -/* 14 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -868,7 +825,7 @@ var _createProgramFromString = __webpack_require__(34); var _createProgramFromString2 = _interopRequireDefault(_createProgramFromString); -var _textureCache = __webpack_require__(32); +var _textureCache = __webpack_require__(33); var _textureCache2 = _interopRequireDefault(_textureCache); @@ -896,7 +853,7 @@ Object.defineProperty(mod, 'isWebGLInitialized', { exports.default = mod; /***/ }), -/* 15 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -968,7 +925,7 @@ var events = new EventTarget(); exports.default = events; /***/ }), -/* 16 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -984,7 +941,7 @@ var _storedPixelDataToCanvasImageData = __webpack_require__(18); var _storedPixelDataToCanvasImageData2 = _interopRequireDefault(_storedPixelDataToCanvasImageData); -var _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(29); +var _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(30); var _storedPixelDataToCanvasImageDataRGBA2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataRGBA); @@ -996,23 +953,23 @@ var _now = __webpack_require__(1); var _now2 = _interopRequireDefault(_now); -var _index = __webpack_require__(14); +var _index = __webpack_require__(13); var _index2 = _interopRequireDefault(_index); -var _getLut = __webpack_require__(31); +var _getLut = __webpack_require__(32); var _getLut2 = _interopRequireDefault(_getLut); -var _doesImageNeedToBeRendered = __webpack_require__(13); +var _doesImageNeedToBeRendered = __webpack_require__(12); var _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered); -var _initializeRenderCanvas = __webpack_require__(11); +var _initializeRenderCanvas = __webpack_require__(10); var _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas); -var _saveLastRendered = __webpack_require__(12); +var _saveLastRendered = __webpack_require__(11); var _saveLastRendered2 = _interopRequireDefault(_saveLastRendered); @@ -1146,6 +1103,56 @@ function addGrayscaleLayer(layer, invalidated) { layer.renderingTools = (0, _saveLastRendered2.default)(layer); } +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) { + var maxPixelValue = image.maxPixelValue; + var minPixelValue = image.minPixelValue; + var offset = Math.min(minPixelValue, 0); + + if (image.cachedLut === undefined) { + var length = maxPixelValue - offset + 1; + + image.cachedLut = {}; + image.cachedLut.lutArray = new Uint8ClampedArray(length); + } + + var lut = image.cachedLut.lutArray; + var mlutfn = (0, _getModalityLUT2.default)(image.slope, image.intercept, modalityLUT); + var vlutfn = (0, _getVOILut2.default)(windowWidth, windowCenter, voiLUT); + + if (invert === true) { + for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) { + lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue)); + } + } else { + for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) { + lut[_storedValue + -offset] = vlutfn(mlutfn(_storedValue)); + } + } + + return lut; +}; + +var _getModalityLUT = __webpack_require__(26); + +var _getModalityLUT2 = _interopRequireDefault(_getModalityLUT); + +var _getVOILut = __webpack_require__(27); + +var _getVOILut2 = _interopRequireDefault(_getVOILut); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { @@ -1508,7 +1515,7 @@ exports.default = function (enabledElement, scale) { return transform; }; -var _transform = __webpack_require__(30); +var _transform = __webpack_require__(31); /***/ }), /* 23 */ @@ -1531,15 +1538,15 @@ var _now = __webpack_require__(1); var _now2 = _interopRequireDefault(_now); -var _initializeRenderCanvas = __webpack_require__(11); +var _initializeRenderCanvas = __webpack_require__(10); var _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas); -var _saveLastRendered = __webpack_require__(12); +var _saveLastRendered = __webpack_require__(11); var _saveLastRendered2 = _interopRequireDefault(_saveLastRendered); -var _doesImageNeedToBeRendered = __webpack_require__(13); +var _doesImageNeedToBeRendered = __webpack_require__(12); var _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered); @@ -1705,19 +1712,19 @@ var _now = __webpack_require__(1); var _now2 = _interopRequireDefault(_now); -var _initializeRenderCanvas = __webpack_require__(11); +var _initializeRenderCanvas = __webpack_require__(10); var _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas); -var _getLut = __webpack_require__(31); +var _getLut = __webpack_require__(32); var _getLut2 = _interopRequireDefault(_getLut); -var _saveLastRendered = __webpack_require__(12); +var _saveLastRendered = __webpack_require__(11); var _saveLastRendered2 = _interopRequireDefault(_saveLastRendered); -var _doesImageNeedToBeRendered = __webpack_require__(13); +var _doesImageNeedToBeRendered = __webpack_require__(12); var _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered); @@ -2005,7 +2012,7 @@ function addLayer(element, image, options) { layers.push(newLayer); - triggerEvent('CornerstoneLayerAdded', enabledElement, layerId); + triggerEvent('cornerstonelayeradded', enabledElement, layerId); // Set the layer as active if it's the first layer added if (layers.length === 1 && image) { @@ -2038,7 +2045,7 @@ function removeLayer(element, layerId) { setActiveLayer(element, layers[0].layerId); } - triggerEvent('CornerstoneLayerRemoved', enabledElement, layerId); + triggerEvent('cornerstonelayerremoved', enabledElement, layerId); } } @@ -2119,7 +2126,7 @@ function setActiveLayer(element, layerId) { enabledElement.viewport = layer.viewport; (0, _updateImage2.default)(element); - triggerEvent('CornerstoneActiveLayerChanged', enabledElement, layerId); + triggerEvent('cornerstoneactivelayerchanged', enabledElement, layerId); } /** @@ -2254,13 +2261,94 @@ function generateNonLinearModalityLUT(modalityLUT) { "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (windowWidth, windowCenter, voiLUT) { + if (voiLUT) { + return generateNonLinearVOILUT(voiLUT); + } + + return generateLinearVOILUT(windowWidth, windowCenter); +}; + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +/* eslint no-bitwise: 0 */ + +/** + * Volume of Interest Lookup Table Function + * + * @typedef {Function} VOILUTFunction + * + * @param {Number} modalityLutValue + * @returns {Number} transformed value + */ + +/** + * + * @param {Number} windowWidth Window Width + * @param {Number} windowCenter Window Center + * @returns {VOILUTFunction} VOI LUT mapping function + */ +function generateLinearVOILUT(windowWidth, windowCenter) { + return function (modalityLutValue) { + return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0; + }; +} + +/** + * Generate a non-linear volume of interest lookup table + * + * @param {LUT} voiLUT Volume of Interest Lookup Table Object + * + * @returns {VOILUTFunction} VOI LUT mapping function + */ +function generateNonLinearVOILUT(voiLUT) { + // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa! + var bitsPerEntry = Math.max.apply(Math, _toConsumableArray(voiLUT.lut)).toString(2).length; + var shift = bitsPerEntry - 8; + var minValue = voiLUT.lut[0] >> shift; + var maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift; + var maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1; + + return function (modalityLutValue) { + if (modalityLutValue < voiLUT.firstValueMapped) { + return minValue; + } else if (modalityLutValue >= maxValueMapped) { + return maxValue; + } + + return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift; + }; +} + +/** + * Retrieve a VOI LUT mapping function given the current windowing settings + * and the VOI LUT for the image + * + * @param {Number} windowWidth Window Width + * @param {Number} windowCenter Window Center + * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object + * + * @return {VOILUTFunction} VOI LUT mapping function + */ + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); exports.getColormapsList = getColormapsList; exports.getColormap = getColormap; -var _lookupTable = __webpack_require__(28); +var _lookupTable = __webpack_require__(29); var _lookupTable2 = _interopRequireDefault(_lookupTable); @@ -2718,7 +2806,7 @@ function getColormap(id, colormapData) { } /***/ }), -/* 28 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3091,7 +3179,7 @@ var LookupTable = function () { exports.default = LookupTable; /***/ }), -/* 29 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3172,7 +3260,7 @@ var _now2 = _interopRequireDefault(_now); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 30 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3320,7 +3408,7 @@ var Transform = exports.Transform = function () { }(); /***/ }), -/* 31 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3348,18 +3436,18 @@ exports.default = function (image, viewport, invalidated) { return image.cachedLut.lutArray; }; -var _lutMatches = __webpack_require__(44); +var _lutMatches = __webpack_require__(43); var _lutMatches2 = _interopRequireDefault(_lutMatches); -var _generateLut = __webpack_require__(9); +var _generateLut = __webpack_require__(16); var _generateLut2 = _interopRequireDefault(_generateLut); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 32 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3369,7 +3457,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _events = __webpack_require__(15); +var _events = __webpack_require__(14); var _events2 = _interopRequireDefault(_events); @@ -3426,12 +3514,12 @@ function purgeCacheIfNecessary() { delete imageCache[lastCachedImage.imageId]; cachedImages.pop(); - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneWebGLTextureRemoved', { imageId: lastCachedImage.imageId }); + (0, _triggerEvent2.default)(_events2.default, 'cornerstonewebgltextureremoved', { imageId: lastCachedImage.imageId }); } var cacheInfo = getCacheInfo(); - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneWebGLTextureCacheFull', cacheInfo); + (0, _triggerEvent2.default)(_events2.default, 'cornerstonewebgltexturecachefull', cacheInfo); } function setMaximumSizeBytes(numBytes) { @@ -3534,29 +3622,6 @@ exports.default = { setMaximumSizeBytes: setMaximumSizeBytes }; -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var $ = window.$; - -var external = { - set $(module) { - $ = module; - }, - get $() { - return $; - } -}; - -exports.external = external; - /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { @@ -3737,7 +3802,7 @@ exports.default = function (element, fitViewportToWindow) { element: element }; - (0, _triggerEvent2.default)(element, 'CornerstoneElementResized', eventData); + (0, _triggerEvent2.default)(element, 'cornerstoneelementresized', eventData); if (enabledElement.image === undefined) { return; @@ -3923,14 +3988,14 @@ Object.defineProperty(exports, "__esModule", { }); exports.cachedImages = undefined; exports.setMaximumSizeBytes = setMaximumSizeBytes; -exports.putImagePromise = putImagePromise; -exports.getImagePromise = getImagePromise; -exports.removeImagePromise = removeImagePromise; +exports.putImageLoadObject = putImageLoadObject; +exports.getImageLoadObject = getImageLoadObject; +exports.removeImageLoadObject = removeImageLoadObject; exports.getCacheInfo = getCacheInfo; exports.purgeCache = purgeCache; exports.changeImageIdCacheSize = changeImageIdCacheSize; -var _events = __webpack_require__(15); +var _events = __webpack_require__(14); var _events2 = _interopRequireDefault(_events); @@ -3962,7 +4027,7 @@ function setMaximumSizeBytes(numBytes) { maximumSizeInBytes = numBytes; - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheMaximumSizeChanged'); + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachemaximumsizechanged'); purgeCacheIfNecessary(); } @@ -3992,32 +4057,35 @@ function purgeCacheIfNecessary() { var lastCachedImage = cachedImages[cachedImages.length - 1]; var imageId = lastCachedImage.imageId; - removeImagePromise(imageId); + removeImageLoadObject(imageId); - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCachePromiseRemoved', { imageId: imageId }); + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachepromiseremoved', { imageId: imageId }); } var cacheInfo = getCacheInfo(); - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheFull', cacheInfo); + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachefull', cacheInfo); } -function putImagePromise(imageId, imagePromise) { +function putImageLoadObject(imageId, imageLoadObject) { if (imageId === undefined) { - throw new Error('putImagePromise: imageId must not be undefined'); + throw new Error('putImageLoadObject: imageId must not be undefined'); } - if (imagePromise === undefined) { - throw new Error('putImagePromise: imagePromise must not be undefined'); + if (imageLoadObject.promise === undefined) { + throw new Error('putImageLoadObject: imageLoadObject.promise must not be undefined'); } if (imageCacheDict.hasOwnProperty(imageId) === true) { - throw new Error('putImagePromise: imageId already in cache'); + throw new Error('putImageLoadObject: imageId already in cache'); + } + if (imageLoadObject.cancelFn && typeof imageLoadObject.cancelFn !== 'function') { + throw new Error('putImageLoadObject: imageLoadObject.cancelFn must be a function'); } var cachedImage = { loaded: false, imageId: imageId, sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default - imagePromise: imagePromise, + imageLoadObject: imageLoadObject, timeStamp: Date.now(), sizeInBytes: 0 }; @@ -4025,7 +4093,7 @@ function putImagePromise(imageId, imagePromise) { imageCacheDict[imageId] = cachedImage; cachedImages.push(cachedImage); - imagePromise.then(function (image) { + imageLoadObject.promise.then(function (image) { if (cachedImages.indexOf(cachedImage) === -1) { // If the image has been purged before being loaded, we stop here. return; @@ -4035,10 +4103,10 @@ function putImagePromise(imageId, imagePromise) { cachedImage.image = image; if (image.sizeInBytes === undefined) { - throw new Error('putImagePromise: sizeInBytes must not be undefined'); + throw new Error('putImageLoadObject: image.sizeInBytes must not be undefined'); } if (image.sizeInBytes.toFixed === undefined) { - throw new Error('putImagePromise: image.sizeInBytes is not a number'); + throw new Error('putImageLoadObject: image.sizeInBytes is not a number'); } cachedImage.sizeInBytes = image.sizeInBytes; @@ -4049,17 +4117,22 @@ function putImagePromise(imageId, imagePromise) { image: cachedImage }; - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheChanged', eventDetails); + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachechanged', eventDetails); cachedImage.sharedCacheKey = image.sharedCacheKey; purgeCacheIfNecessary(); + }, function () { + var cachedImage = imageCacheDict[imageId]; + + cachedImages.splice(cachedImages.indexOf(cachedImage), 1); + delete imageCacheDict[imageId]; }); } -function getImagePromise(imageId) { +function getImageLoadObject(imageId) { if (imageId === undefined) { - throw new Error('getImagePromise: imageId must not be undefined'); + throw new Error('getImageLoadObject: imageId must not be undefined'); } var cachedImage = imageCacheDict[imageId]; @@ -4070,20 +4143,19 @@ function getImagePromise(imageId) { // Bump time stamp for cached image cachedImage.timeStamp = Date.now(); - return cachedImage.imagePromise; + return cachedImage.imageLoadObject; } -function removeImagePromise(imageId) { +function removeImageLoadObject(imageId) { if (imageId === undefined) { - throw new Error('removeImagePromise: imageId must not be undefined'); + throw new Error('removeImageLoadObject: imageId must not be undefined'); } var cachedImage = imageCacheDict[imageId]; if (cachedImage === undefined) { - throw new Error('removeImagePromise: imageId was not present in imageCache'); + throw new Error('removeImageLoadObject: imageId was not present in imageCache'); } - cachedImage.imagePromise.reject(); cachedImages.splice(cachedImages.indexOf(cachedImage), 1); cacheSizeInBytes -= cachedImage.sizeInBytes; @@ -4092,8 +4164,8 @@ function removeImagePromise(imageId) { image: cachedImage }; - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheChanged', eventDetails); - decache(cachedImage.imagePromise); + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachechanged', eventDetails); + decache(cachedImage.imageLoadObject.promise); delete imageCacheDict[imageId]; } @@ -4106,7 +4178,7 @@ function getCacheInfo() { }; } -// This method should only be called by `removeImagePromise` because it's +// This method should only be called by `removeImageLoadObject` because it's // The one that knows how to deal with shared cache keys and cache size. function decache(imagePromise) { imagePromise.then(function (image) { @@ -4120,7 +4192,7 @@ function purgeCache() { while (cachedImages.length > 0) { var removedCachedImage = cachedImages[0]; - removeImagePromise(removedCachedImage.imageId); + removeImageLoadObject(removedCachedImage.imageId); } } @@ -4128,7 +4200,7 @@ function changeImageIdCacheSize(imageId, newCacheSize) { var cacheEntry = imageCacheDict[imageId]; if (cacheEntry) { - cacheEntry.imagePromise.then(function (image) { + cacheEntry.imageLoadObject.promise.then(function (image) { var cacheSizeDifference = newCacheSize - image.sizeInBytes; image.sizeInBytes = newCacheSize; @@ -4140,7 +4212,7 @@ function changeImageIdCacheSize(imageId, newCacheSize) { image: image }; - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheChanged', eventDetails); + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachechanged', eventDetails); }); } } @@ -4149,9 +4221,9 @@ exports.default = { imageCache: imageCacheDict, cachedImages: cachedImages, setMaximumSizeBytes: setMaximumSizeBytes, - putImagePromise: putImagePromise, - getImagePromise: getImagePromise, - removeImagePromise: removeImagePromise, + putImageLoadObject: putImageLoadObject, + getImageLoadObject: getImageLoadObject, + removeImageLoadObject: removeImageLoadObject, getCacheInfo: getCacheInfo, purgeCache: purgeCache, changeImageIdCacheSize: changeImageIdCacheSize @@ -4255,7 +4327,7 @@ Object.defineProperty(exports, 'drawImage', { } }); -var _generateLut = __webpack_require__(9); +var _generateLut = __webpack_require__(16); Object.defineProperty(exports, 'generateLut', { enumerable: true, @@ -4318,7 +4390,7 @@ Object.defineProperty(exports, 'storedPixelDataToCanvasImageDataPseudocolorLUT', } }); -var _index = __webpack_require__(43); +var _index = __webpack_require__(42); Object.defineProperty(exports, 'internal', { enumerable: true, @@ -4354,7 +4426,7 @@ Object.defineProperty(exports, 'renderColorImage', { } }); -var _renderGrayscaleImage = __webpack_require__(16); +var _renderGrayscaleImage = __webpack_require__(15); Object.defineProperty(exports, 'renderGrayscaleImage', { enumerable: true, @@ -4717,7 +4789,7 @@ Object.defineProperty(exports, 'metaData', { } }); -var _index3 = __webpack_require__(14); +var _index3 = __webpack_require__(13); Object.defineProperty(exports, 'webGL', { enumerable: true, @@ -4756,7 +4828,7 @@ Object.defineProperty(exports, 'restoreImage', { } }); -var _events = __webpack_require__(15); +var _events = __webpack_require__(14); Object.defineProperty(exports, 'events', { enumerable: true, @@ -4774,15 +4846,6 @@ Object.defineProperty(exports, 'triggerEvent', { } }); -var _externalModules = __webpack_require__(33); - -Object.defineProperty(exports, 'external', { - enumerable: true, - get: function get() { - return _externalModules.external; - } -}); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), @@ -4792,87 +4855,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (windowWidth, windowCenter, voiLUT) { - if (voiLUT) { - return generateNonLinearVOILUT(voiLUT); - } - - return generateLinearVOILUT(windowWidth, windowCenter); -}; - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -/* eslint no-bitwise: 0 */ - -/** - * Volume of Interest Lookup Table Function - * - * @typedef {Function} VOILUTFunction - * - * @param {Number} modalityLutValue - * @returns {Number} transformed value - */ - -/** - * - * @param {Number} windowWidth Window Width - * @param {Number} windowCenter Window Center - * @returns {VOILUTFunction} VOI LUT mapping function - */ -function generateLinearVOILUT(windowWidth, windowCenter) { - return function (modalityLutValue) { - return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0; - }; -} - -/** - * Generate a non-linear volume of interest lookup table - * - * @param {LUT} voiLUT Volume of Interest Lookup Table Object - * - * @returns {VOILUTFunction} VOI LUT mapping function - */ -function generateNonLinearVOILUT(voiLUT) { - // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa! - var bitsPerEntry = Math.max.apply(Math, _toConsumableArray(voiLUT.lut)).toString(2).length; - var shift = bitsPerEntry - 8; - var minValue = voiLUT.lut[0] >> shift; - var maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift; - var maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1; - - return function (modalityLutValue) { - if (modalityLutValue < voiLUT.firstValueMapped) { - return minValue; - } else if (modalityLutValue >= maxValueMapped) { - return maxValue; - } - - return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift; - }; -} - -/** - * Retrieve a VOI LUT mapping function given the current windowing settings - * and the VOI LUT for the image - * - * @param {Number} windowWidth Window Width - * @param {Number} windowCenter Window Center - * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object - * - * @return {VOILUTFunction} VOI LUT mapping function - */ - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - Object.defineProperty(exports, "__esModule", { value: true }); @@ -4881,7 +4863,7 @@ var _drawImage = __webpack_require__(5); var _drawImage2 = _interopRequireDefault(_drawImage); -var _generateLut = __webpack_require__(9); +var _generateLut = __webpack_require__(16); var _generateLut2 = _interopRequireDefault(_generateLut); @@ -4897,7 +4879,7 @@ var _storedPixelDataToCanvasImageData = __webpack_require__(18); var _storedPixelDataToCanvasImageData2 = _interopRequireDefault(_storedPixelDataToCanvasImageData); -var _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(29); +var _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(30); var _storedPixelDataToCanvasImageDataRGBA2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataRGBA); @@ -4913,7 +4895,7 @@ var _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21); var _storedPixelDataToCanvasImageDataPseudocolorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT); -var _getTransform = __webpack_require__(10); +var _getTransform = __webpack_require__(9); var _getTransform2 = _interopRequireDefault(_getTransform); @@ -4921,7 +4903,7 @@ var _calculateTransform = __webpack_require__(22); var _calculateTransform2 = _interopRequireDefault(_calculateTransform); -var _transform = __webpack_require__(30); +var _transform = __webpack_require__(31); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -4941,7 +4923,7 @@ exports.default = { }; /***/ }), -/* 44 */ +/* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4965,6 +4947,51 @@ exports.default = function (a, b) { return a.id === b.id; }; +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (image, windowWidth, windowCenter, invert, voiLUT) { + var maxPixelValue = image.maxPixelValue; + var minPixelValue = image.minPixelValue; + var offset = Math.min(minPixelValue, 0); + + if (image.cachedLut === undefined) { + var length = maxPixelValue - offset + 1; + + image.cachedLut = {}; + image.cachedLut.lutArray = new Uint8ClampedArray(length); + } + + var lut = image.cachedLut.lutArray; + var vlutfn = (0, _getVOILut2.default)(windowWidth, windowCenter, voiLUT); + + if (invert === true) { + for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) { + lut[storedValue + -offset] = 255 - vlutfn(storedValue); + } + } else { + for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) { + lut[_storedValue + -offset] = vlutfn(_storedValue); + } + } + + return lut; +}; + +var _getVOILut = __webpack_require__(27); + +var _getVOILut2 = _interopRequireDefault(_getVOILut); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { @@ -5035,7 +5062,7 @@ var _index = __webpack_require__(47); var _vertexShader = __webpack_require__(53); -var _textureCache = __webpack_require__(32); +var _textureCache = __webpack_require__(33); var _textureCache2 = _interopRequireDefault(_textureCache); @@ -5737,7 +5764,7 @@ exports.default = function (element, pt) { var _enabledElements = __webpack_require__(0); -var _getTransform = __webpack_require__(10); +var _getTransform = __webpack_require__(9); var _getTransform2 = _interopRequireDefault(_getTransform); @@ -5771,7 +5798,7 @@ exports.default = function (element) { element: element }; - (0, _triggerEvent2.default)(element, 'CornerstoneElementDisabled', eventData); + (0, _triggerEvent2.default)(element, 'cornerstoneelementdisabled', eventData); // Remove the child DOM elements that we created (e.g.canvas) enabledElements[i].element.removeChild(enabledElements[i].canvas); @@ -5853,7 +5880,7 @@ exports.default = function (element, image, viewport) { frameRate: frameRate }; - (0, _triggerEvent2.default)(enabledElement.element, 'CornerstoneNewImage', newImageEventData); + (0, _triggerEvent2.default)(enabledElement.element, 'cornerstonenewimage', newImageEventData); (0, _updateImage2.default)(element); }; @@ -6033,7 +6060,7 @@ exports.default = function (element, options) { timestamp: timestamp }; - (0, _triggerEvent2.default)(enabledElement.element, 'CornerstonePreRender', eventDetails); + (0, _triggerEvent2.default)(enabledElement.element, 'cornerstoneprerender', eventDetails); if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) { (0, _drawImageSync2.default)(enabledElement, enabledElement.invalid); @@ -6059,7 +6086,7 @@ var _requestAnimationFrame = __webpack_require__(17); var _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame); -var _index = __webpack_require__(14); +var _index = __webpack_require__(13); var _index2 = _interopRequireDefault(_index); @@ -6155,7 +6182,7 @@ exports.default = function (enabledElement, invalidated) { enabledElement.invalid = false; enabledElement.needsRedraw = false; - (0, _triggerEvent2.default)(element, 'CornerstoneImageRendered', eventData); + (0, _triggerEvent2.default)(element, 'cornerstoneimagerendered', eventData); }; var _now = __webpack_require__(1); @@ -6168,7 +6195,7 @@ var _drawCompositeImage2 = _interopRequireDefault(_drawCompositeImage); var _renderColorImage = __webpack_require__(8); -var _renderGrayscaleImage = __webpack_require__(16); +var _renderGrayscaleImage = __webpack_require__(15); var _renderPseudoColorImage = __webpack_require__(24); @@ -6232,7 +6259,7 @@ exports.default = function (enabledElement, invalidated) { var _layers = __webpack_require__(25); -var _renderGrayscaleImage = __webpack_require__(16); +var _renderGrayscaleImage = __webpack_require__(15); var _renderColorImage = __webpack_require__(8); @@ -6524,7 +6551,7 @@ exports.registerUnknownImageLoader = registerUnknownImageLoader; var _imageCache = __webpack_require__(39); -var _events = __webpack_require__(15); +var _events = __webpack_require__(14); var _events2 = _interopRequireDefault(_events); @@ -6551,32 +6578,36 @@ var unknownImageLoader = void 0; * @param {String} imageId A Cornerstone Image Object's imageId * @param {Object} [options] Options to be passed to the Image Loader * - * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails + * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails */ function loadImageFromImageLoader(imageId, options) { var colonIndex = imageId.indexOf(':'); var scheme = imageId.substring(0, colonIndex); var loader = imageLoaders[scheme]; - var imagePromise = void 0; if (loader === undefined || loader === null) { if (unknownImageLoader !== undefined) { - imagePromise = unknownImageLoader(imageId); - - return imagePromise; + return unknownImageLoader(imageId); } throw new Error('loadImageFromImageLoader: no image loader for imageId'); } - imagePromise = loader(imageId, options); + var imageLoadObject = loader(imageId, options); // Broadcast an image loaded event once the image is loaded - imagePromise.then(function (image) { - (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageLoaded', { image: image }); + imageLoadObject.promise.then(function (image) { + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimageloaded', { image: image }); + }, function (error) { + var errorObject = { + imageId: imageId, + error: error + }; + + (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimageloadfailed', errorObject); }); - return imagePromise; + return imageLoadObject; } /** @@ -6586,22 +6617,20 @@ function loadImageFromImageLoader(imageId, options) { * @param {String} imageId A Cornerstone Image Object's imageId * @param {Object} [options] Options to be passed to the Image Loader * - * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails + * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails */ function loadImage(imageId, options) { if (imageId === undefined) { throw new Error('loadImage: parameter imageId must not be undefined'); } - var imagePromise = (0, _imageCache.getImagePromise)(imageId); + var imageLoadObject = (0, _imageCache.getImageLoadObject)(imageId); - if (imagePromise !== undefined) { - return imagePromise; + if (imageLoadObject !== undefined) { + return imageLoadObject.promise; } - imagePromise = loadImageFromImageLoader(imageId, options); - - return imagePromise; + return loadImageFromImageLoader(imageId, options).promise; } // @@ -6613,24 +6642,24 @@ function loadImage(imageId, options) { * @param {String} imageId A Cornerstone Image Object's imageId * @param {Object} [options] Options to be passed to the Image Loader * - * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails + * @returns {Object} Image Loader Object (TODO: define a JSDoc type for this) */ function loadAndCacheImage(imageId, options) { if (imageId === undefined) { throw new Error('loadAndCacheImage: parameter imageId must not be undefined'); } - var imagePromise = (0, _imageCache.getImagePromise)(imageId); + var imageLoadObject = (0, _imageCache.getImageLoadObject)(imageId); - if (imagePromise !== undefined) { - return imagePromise; + if (imageLoadObject !== undefined) { + return imageLoadObject.promise; } - imagePromise = loadImageFromImageLoader(imageId, options); + imageLoadObject = loadImageFromImageLoader(imageId, options); - (0, _imageCache.putImagePromise)(imageId, imagePromise); + (0, _imageCache.putImageLoadObject)(imageId, imageLoadObject); - return imagePromise; + return imageLoadObject.promise; } /** @@ -6679,7 +6708,7 @@ exports.default = function (element) { element: element }; - (0, _triggerEvent2.default)(element, 'CornerstoneInvalidated', eventData); + (0, _triggerEvent2.default)(element, 'cornerstoneinvalidated', eventData); }; var _enabledElements = __webpack_require__(0); @@ -6752,7 +6781,7 @@ exports.default = function (element, pageX, pageY) { var _enabledElements = __webpack_require__(0); -var _getTransform = __webpack_require__(10); +var _getTransform = __webpack_require__(9); var _getTransform2 = _interopRequireDefault(_getTransform); @@ -6778,7 +6807,7 @@ exports.default = function (element, pt) { var _enabledElements = __webpack_require__(0); -var _getTransform = __webpack_require__(10); +var _getTransform = __webpack_require__(9); var _getTransform2 = _interopRequireDefault(_getTransform); @@ -6890,7 +6919,7 @@ Object.defineProperty(exports, "__esModule", { var _renderColorImage = __webpack_require__(8); -var _renderGrayscaleImage = __webpack_require__(16); +var _renderGrayscaleImage = __webpack_require__(15); var _renderWebImage = __webpack_require__(35); @@ -7004,7 +7033,7 @@ var _pixelDataToFalseColorData = __webpack_require__(40); var _pixelDataToFalseColorData2 = _interopRequireDefault(_pixelDataToFalseColorData); -var _colormap = __webpack_require__(27); +var _colormap = __webpack_require__(28); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } diff --git a/examples/cornerstone.js.map b/examples/cornerstone.js.map index bf9be9546..77ea967bf 100644 --- a/examples/cornerstone.js.map +++ b/examples/cornerstone.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 5c9a59949cb46f217c1a","webpack:///./enabledElements.js","webpack:///./internal/now.js","webpack:///./triggerEvent.js","webpack:///./setToPixelCoordinateSystem.js","webpack:///./updateImage.js","webpack:///./internal/drawImage.js","webpack:///./internal/getDefaultViewport.js","webpack:///./colors/index.js","webpack:///./rendering/renderColorImage.js","webpack:///./internal/generateLut.js","webpack:///./internal/getTransform.js","webpack:///./rendering/initializeRenderCanvas.js","webpack:///./rendering/saveLastRendered.js","webpack:///./rendering/doesImageNeedToBeRendered.js","webpack:///./webgl/index.js","webpack:///./events.js","webpack:///./rendering/renderGrayscaleImage.js","webpack:///./internal/requestAnimationFrame.js","webpack:///./internal/storedPixelDataToCanvasImageData.js","webpack:///./internal/storedColorPixelDataToCanvasImageData.js","webpack:///./internal/storedPixelDataToCanvasImageDataColorLUT.js","webpack:///./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","webpack:///./internal/calculateTransform.js","webpack:///./rendering/renderLabelMapImage.js","webpack:///./rendering/renderPseudoColorImage.js","webpack:///./layers.js","webpack:///./internal/getModalityLUT.js","webpack:///./colors/colormap.js","webpack:///./colors/lookupTable.js","webpack:///./internal/storedPixelDataToCanvasImageDataRGBA.js","webpack:///./internal/transform.js","webpack:///./rendering/getLut.js","webpack:///./webgl/textureCache.js","webpack:///./externalModules.js","webpack:///./webgl/createProgramFromString.js","webpack:///./rendering/renderWebImage.js","webpack:///./resize.js","webpack:///./fitToWindow.js","webpack:///./getStoredPixels.js","webpack:///./imageCache.js","webpack:///./pixelDataToFalseColorData.js","webpack:///./index.js","webpack:///./internal/getVOILut.js","webpack:///./internal/index.js","webpack:///./rendering/lutMatches.js","webpack:///./internal/storedRGBAPixelDataToCanvasImageData.js","webpack:///./webgl/renderer.js","webpack:///./webgl/shaders/index.js","webpack:///./webgl/shaders/int16.js","webpack:///./webgl/shaders/int8.js","webpack:///./webgl/shaders/rgb.js","webpack:///./webgl/shaders/uint16.js","webpack:///./webgl/shaders/uint8.js","webpack:///./webgl/vertexShader.js","webpack:///./canvasToPixel.js","webpack:///./disable.js","webpack:///./displayImage.js","webpack:///./internal/guid.js","webpack:///./draw.js","webpack:///./drawInvalidated.js","webpack:///./enable.js","webpack:///./internal/drawImageSync.js","webpack:///./internal/drawCompositeImage.js","webpack:///./enabledElementData.js","webpack:///./getDefaultViewportForImage.js","webpack:///./getImage.js","webpack:///./getPixels.js","webpack:///./getViewport.js","webpack:///./imageLoader.js","webpack:///./invalidate.js","webpack:///./invalidateImageId.js","webpack:///./pageToPixel.js","webpack:///./pixelToCanvas.js","webpack:///./reset.js","webpack:///./setViewport.js","webpack:///./rendering/index.js","webpack:///./metaData.js","webpack:///./falseColorMapping.js"],"names":["getEnabledElement","addEnabledElement","getEnabledElementsByImageId","getEnabledElements","enabledElements","element","undefined","Error","i","length","enabledElement","push","imageId","ees","forEach","image","window","performance","now","Date","triggerEvent","el","type","detail","event","CustomEvent","toLocaleLowerCase","document","createEvent","initCustomEvent","$","trigger","dispatchEvent","context","scale","transform","setTransform","m","invalidated","layers","needsRedraw","invalid","canvas","translation","x","y","voi","windowWidth","windowCenter","invert","pixelReplication","rotation","hflip","vflip","modalityLUT","voiLUT","colormap","labelmap","verticalScale","height","rows","horizontalScale","width","columns","Math","min","Boolean","getColormap","getColormapsList","LookupTable","renderColorImage","addColorLayer","getLut","viewport","cachedLut","lutArray","getRenderCanvas","renderingTools","renderCanvas","createElement","getCanvas","start","colorLut","stats","lastLutGenerateTime","renderCanvasData","renderCanvasContext","rgba","data","putImageData","lastPutImageDataTime","getContext","fillStyle","fillRect","imageSmoothingEnabled","mozImageSmoothingEnabled","options","renderer","toLowerCase","render","drawImage","layer","maxPixelValue","minPixelValue","offset","Uint8ClampedArray","lut","mlutfn","slope","intercept","vlutfn","storedValue","canvasContext","getImageData","lastRenderedImageId","lastRenderedViewport","mod","createProgramFromString","initRenderer","isWebGLAvailable","textureCache","Object","defineProperty","enumerable","configurable","get","EventTarget","listeners","callback","stack","l","splice","call","defaultPrevented","events","renderGrayscaleImage","addGrayscaleLayer","useAlphaChannel","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","requestFrame","setTimeout","canvasImageDataData","pixelData","getPixelData","lastGetPixelDataTime","numPixels","canvasImageDataIndex","storedPixelDataIndex","Int16Array","Uint16Array","lastStoredPixelDataToCanvasImageDataTime","storedPixelDataToCanvasImageDataColorLUT","clut","Table","storedPixelDataToCanvasImageDataPseudocolorLUT","grayscaleLut","grayscale","translate","angle","rotate","PI","widthScale","heightScale","rowPixelSpacing","columnPixelSpacing","renderLabelMapImage","addLabelMapLayer","colormapId","getId","createLookupTable","renderPseudoColorImage","addPseudoColorLayer","setNumberOfColors","rescaleImage","addLayer","removeLayer","getLayer","getLayers","getVisibleLayers","setActiveLayer","setLayerImage","getActiveLayer","eventName","layerId","eventData","baseLayer","targetLayer","baseImage","targetImage","colRelative","viewportRatio","assign","syncViewports","newLayer","index","findIndex","activeLayerId","find","filter","visible","opacity","defaultViewport","generateNonLinearModalityLUT","generateLinearModalityLUT","storedPixelValue","minValue","maxValue","maxValueMapped","firstValueMapped","COLOR_TRANSPARENT","colormapsData","hotIron","name","numOfColors","colors","pet","numColors","hotMetalBlue","pet20Step","gray","gamma","segmentedData","red","green","blue","jet","hsv","hot","cool","spring","summer","autumn","winter","bone","copper","spectral","coolwarm","blues","linspace","a","b","n","increment","vector","getRank","array","elem","left","right","mid","floor","midElem","searchSorted","inputArray","values","indexes","len","sort","makeMappingArray","N","y0","y1","xLinSpace","pow","xLinSpaceIndexes","colorPercent","colorDelta","createLinearSegmentedColormap","redLut","greenLut","blueLut","round","colormaps","keys","key","hasOwnProperty","id","aName","bName","colormapData","getColorSchemeName","setColorSchemeName","getNumberOfColors","getColor","isValidIndex","getColorRepeating","setColor","addColor","insertColor","removeColor","clearColors","buildLookupTable","setNumberOfTableValues","setTableValue","BELOW_RANGE_COLOR_INDEX","ABOVE_RANGE_COLOR_INDEX","NAN_COLOR_INDEX","HSVToRGB","hue","sat","val","rgb","hueCase","frac","lx","ly","lz","linearIndexLookupMain","v","p","dIndex","Range","MaxIndex","Shift","Scale","NumberOfColors","Ramp","TableRange","HueRange","SaturationRange","ValueRange","AlphaRange","NaNColor","BelowRangeColor","UseBelowRangeColor","AboveRangeColor","UseAboveRangeColor","InputRange","number","ramp","end","scalar","mapValue","force","maxIndex","hinc","sinc","vinc","ainc","alpha","c_rgba","cos","sqrt","buildSpecialColors","numberOfColors","belowRangeColorIndex","aboveRangeColorIndex","nanColorIndex","getIndex","Number","MAX_VALUE","isNaN","arguments","Array","prototype","slice","pixelValue","Transform","reset","matrix","m11","m12","m21","m22","dx","dy","d","m0","m1","m2","m3","m4","m5","rad","c","s","sin","sx","sy","px","py","imageCache","cachedImages","maximumSizeInBytes","cacheSizeInBytes","getCacheInfo","numberOfImagesCached","purgeCacheIfNecessary","compare","timeStamp","lastCachedImage","sizeInBytes","pop","cacheInfo","setMaximumSizeBytes","numBytes","toFixed","putImageTexture","imageTexture","cachedImage","getImageTexture","removeImageTexture","indexOf","purgeCache","removedCachedImage","external","module","gl","vertexShaderSrc","fragShaderSrc","vertexShader","compileShader","VERTEX_SHADER","fragShader","FRAGMENT_SHADER","createProgram","shaderSource","shaderType","shader","createShader","success","getShaderParameter","COMPILE_STATUS","isContextLost","infoLog","getShaderInfoLog","console","error","fragmentShader","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","renderWebImage","getImage","fitViewportToWindow","setCanvasSize","clientWidth","style","clientHeight","imageSize","getImageSize","storedPixels","row","column","spIndex","putImagePromise","getImagePromise","removeImagePromise","changeImageIdCacheSize","imageCacheDict","imagePromise","loaded","sharedCacheKey","then","eventDetails","action","reject","decache","newCacheSize","cacheEntry","cacheSizeDifference","lookupTable","color","falseColor","origPixelData","storedColorPixelData","Uint8Array","sp","mapped","build","default","getElementData","removeElementData","loadImage","loadAndCacheImage","registerImageLoader","registerUnknownImageLoader","convertImageToFalseColorImage","convertToFalseColorImage","restoreImage","generateNonLinearVOILUT","generateLinearVOILUT","modalityLutValue","bitsPerEntry","max","toString","shift","generateLut","getDefaultViewport","storedPixelDataToCanvasImageData","storedPixelDataToCanvasImageDataRGBA","storedColorPixelDataToCanvasImageData","getTransform","calculateTransform","texCoordBuffer","positionBuffer","isWebGLInitialized","initShaders","attributes","uniforms","vert","frag","texCoordLocation","getAttribLocation","enableVertexAttribArray","positionLocation","resolutionLocation","getUniformLocation","initWebGL","initBuffers","updateRectangle","bufferData","ARRAY_BUFFER","Float32Array","STATIC_DRAW","handleLostContext","preventDefault","warn","handleRestoredContext","preserveDrawingBuffer","removeEventListener","addEventListener","getImageDataType","datatype","getShaderProgram","generateTexture","TEXTURE_FORMAT","uint8","LUMINANCE","int8","LUMINANCE_ALPHA","uint16","int16","RGB","TEXTURE_BYTES","imageDataType","format","texture","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","pixelStorei","UNPACK_ALIGNMENT","imageData","storedPixelDataToImageData","texImage2D","UNSIGNED_BYTE","createBuffer","bindBuffer","renderQuad","parameters","clearColor","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","useProgram","vertexAttribPointer","FLOAT","uniformLocation","uniform","value","uniform1i","uniform1f","uniform2f","activeTexture","TEXTURE0","drawArrays","TRIANGLE_STRIP","u_resolution","wc","ww","failIfMajorPerformanceCaveat","WebGLRenderingContext","e","shaders","dataUtilities","int16Shader","numberOfChannels","abs","int16DataUtilities","int8Shader","int8DataUtilities","rgbShader","numStoredPixels","numOutputPixels","storedPixelData","rgbDataUtilities","uint16Shader","uint16DataUtilities","uint8Shader","uint8DataUtilities","pt","transformPoint","removeChild","oldImage","attrname","frameRate","lastImageTimeStamp","timeSinceLastImage","newImageEventData","s4","random","substring","ee","appendChild","draw","timestamp","hasImageOrLayers","lastRenderTime","renderTimeInMs","allLayers","activeLayer","visibleLayers","resynced","lastSyncViewportsState","originalViewportScale","renderLayers","getViewportRatio","baseLayerId","targetLayerId","save","isInvalid","globalAlpha","restore","dataType","map","imageLoaders","unknownImageLoader","loadImageFromImageLoader","colonIndex","scheme","loader","imageLoader","oldImageLoader","pageX","pageY","rect","getBoundingClientRect","clientX","pageXOffset","clientY","top","pageYOffset","MIN_WINDOW_WIDTH","MIN_VIEWPORT_SCALE","colorImage","grayscaleImage","webImage","addProvider","removeProvider","providers","provider","priority","getMetaData","result","getPixelValues","MIN_VALUE","pixel","getRestoreImageMethod","ensuresColormap","setTableRange","pixelValues"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;QCuEgBA,iB,GAAAA,iB;QAmBAC,iB,GAAAA,iB;QAcAC,2B,GAAAA,2B;QAiBAC,kB,GAAAA,kB;AAtLhB,IAAMC,kBAAkB,EAAxB;;AAEA;;;;;;;;AAQA;;;;;;;;AAQA;;;;;;;;;AASA;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA;;;;;;;;;;;;;;;;;;;AAmBA;;;;;;;;;;;;;;;;;AAiBA;;;;;;;;;;;;;;AAeA;;;;;;;AAOO,SAASJ,iBAAT,CAA4BK,OAA5B,EAAqC;AAC1C,MAAIA,YAAYC,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,4DAAV,CAAN;AACD;AACD,OAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIJ,gBAAgBK,MAApC,EAA4CD,GAA5C,EAAiD;AAC/C,QAAIJ,gBAAgBI,CAAhB,EAAmBH,OAAnB,KAA+BA,OAAnC,EAA4C;AAC1C,aAAOD,gBAAgBI,CAAhB,CAAP;AACD;AACF;;AAED,QAAM,IAAID,KAAJ,CAAU,qBAAV,CAAN;AACD;;AAED;;;;;;AAMO,SAASN,iBAAT,CAA4BS,cAA5B,EAA4C;AACjD,MAAIA,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,iEAAV,CAAN;AACD;;AAEDH,kBAAgBO,IAAhB,CAAqBD,cAArB;AACD;;AAED;;;;;;AAMO,SAASR,2BAAT,CAAsCU,OAAtC,EAA+C;AACpD,MAAMC,MAAM,EAAZ;;AAEAT,kBAAgBU,OAAhB,CAAwB,UAAUJ,cAAV,EAA0B;AAChD,QAAIA,eAAeK,KAAf,IAAwBL,eAAeK,KAAf,CAAqBH,OAArB,KAAiCA,OAA7D,EAAsE;AACpEC,UAAIF,IAAJ,CAASD,cAAT;AACD;AACF,GAJD;;AAMA,SAAOG,GAAP;AACD;;AAED;;;;;AAKO,SAASV,kBAAT,GAA+B;AACpC,SAAOC,eAAP;AACD,C;;;;;;;;;;;;;kBCnLc,YAAY;AACzB,MAAIY,OAAOC,WAAX,EAAwB;AACtB,WAAOA,YAAYC,GAAZ,EAAP;AACD;;AAED,SAAOC,KAAKD,GAAL,EAAP;AACD,C;;;;;;;;;;;;kBCDuBE,Y;;AAVxB;;AAEA;;;;;;;;AAQe,SAASA,YAAT,CAAuBC,EAAvB,EAA2BC,IAA3B,EAAgD;AAAA,MAAfC,MAAe,uEAAN,IAAM;;AAC7D,MAAIC,cAAJ;;AAEA;AACA,MAAI,OAAOR,OAAOS,WAAd,KAA8B,UAAlC,EAA8C;AAC5CD,YAAQ,IAAIC,WAAJ,CAAgBH,KAAKI,iBAAL,EAAhB,EAA0C,EAAEH,cAAF,EAA1C,CAAR;AACD,GAFD,MAEO;AACLC,YAAQG,SAASC,WAAT,CAAqB,aAArB,CAAR;AACAJ,UAAMK,eAAN,CAAsBP,KAAKI,iBAAL,EAAtB,EAAgD,IAAhD,EAAsD,IAAtD,EAA4DH,MAA5D;AACD;;AAED;AACA,4BAASO,CAAT,CAAWT,EAAX,EAAeU,OAAf,CAAuBT,IAAvB,EAA6BC,MAA7B;AACAF,KAAGW,aAAH,CAAiBR,KAAjB;AACD,C;;;;;;;;;;;;;kBCTc,UAAUd,cAAV,EAA0BuB,OAA1B,EAAmCC,KAAnC,EAA0C;AACvD,MAAIxB,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,4EAAV,CAAN;AACD;AACD,MAAI0B,YAAY3B,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,qEAAV,CAAN;AACD;;AAED,MAAM4B,YAAY,kCAAmBzB,cAAnB,EAAmCwB,KAAnC,CAAlB;;AAEAD,UAAQG,YAAR,CAAqBD,UAAUE,CAAV,CAAY,CAAZ,CAArB,EAAqCF,UAAUE,CAAV,CAAY,CAAZ,CAArC,EAAqDF,UAAUE,CAAV,CAAY,CAAZ,CAArD,EAAqEF,UAAUE,CAAV,CAAY,CAAZ,CAArE,EAAqFF,UAAUE,CAAV,CAAY,CAAZ,CAArF,EAAqGF,UAAUE,CAAV,CAAY,CAAZ,CAArG;AACD,C;;AArBD;;;;;;;;;;;;;;;;;kBCKe,UAAUhC,OAAV,EAAwC;AAAA,MAArBiC,WAAqB,uEAAP,KAAO;;AACrD,MAAM5B,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA,MAAIK,eAAeK,KAAf,KAAyBT,SAAzB,IAAsC,CAACI,eAAe6B,MAAf,CAAsB9B,MAAjE,EAAyE;AACvE,UAAM,IAAIF,KAAJ,CAAU,4CAAV,CAAN;AACD;;AAED,2BAAUG,cAAV,EAA0B4B,WAA1B;AACD,C;;AAlBD;;AACA;;;;;;;;;;;;;;;;;kBCMe,UAAU5B,cAAV,EAA+C;AAAA,MAArB4B,WAAqB,uEAAP,KAAO;;AAC5D5B,iBAAe8B,WAAf,GAA6B,IAA7B;AACA,MAAIF,WAAJ,EAAiB;AACf5B,mBAAe+B,OAAf,GAAyB,IAAzB;AACD;AACF,C;;;;;;;;;;;;;kBCLc,UAAUC,MAAV,EAAkB3B,KAAlB,EAAyB;AACtC,MAAI2B,WAAWpC,SAAf,EAA0B;AACxB,UAAM,IAAIC,KAAJ,CAAU,4DAAV,CAAN;AACD;;AAED,MAAIQ,UAAUT,SAAd,EAAyB;AACvB,WAAO;AACL4B,aAAO,CADF;AAELS,mBAAa;AACXC,WAAG,CADQ;AAEXC,WAAG;AAFQ,OAFR;AAMLC,WAAK;AACHC,qBAAazC,SADV;AAEH0C,sBAAc1C;AAFX,OANA;AAUL2C,cAAQ,KAVH;AAWLC,wBAAkB,KAXb;AAYLC,gBAAU,CAZL;AAaLC,aAAO,KAbF;AAcLC,aAAO,KAdF;AAeLC,mBAAahD,SAfR;AAgBLiD,cAAQjD,SAhBH;AAiBLkD,gBAAUlD,SAjBL;AAkBLmD,gBAAU;AAlBL,KAAP;AAoBD;;AAED;AACA,MAAMC,gBAAgBhB,OAAOiB,MAAP,GAAgB5C,MAAM6C,IAA5C;AACA,MAAMC,kBAAkBnB,OAAOoB,KAAP,GAAe/C,MAAMgD,OAA7C;AACA,MAAM7B,QAAQ8B,KAAKC,GAAL,CAASJ,eAAT,EAA0BH,aAA1B,CAAd;;AAEA,SAAO;AACLxB,gBADK;AAELS,iBAAa;AACXC,SAAG,CADQ;AAEXC,SAAG;AAFQ,KAFR;AAMLC,SAAK;AACHC,mBAAahC,MAAMgC,WADhB;AAEHC,oBAAcjC,MAAMiC;AAFjB,KANA;AAULC,YAAQlC,MAAMkC,MAVT;AAWLC,sBAAkB,KAXb;AAYLC,cAAU,CAZL;AAaLC,WAAO,KAbF;AAcLC,WAAO,KAdF;AAeLC,iBAAavC,MAAMuC,WAfd;AAgBLC,YAAQxC,MAAMwC,MAhBT;AAiBLC,cAAUzC,MAAMyC,QAjBX;AAkBLC,cAAUS,QAAQnD,MAAM0C,QAAd;AAlBL,GAAP;AAoBD,C;;;;;;;;;;;;;AC5DD;;AACA;;;;;;kBAEe;AACbU,oCADa;AAEbC,8CAFa;AAGbC;AAHa,C;;;;;;;;;;;;QC0FCC,gB,GAAAA,gB;QA6CAC,a,GAAAA,a;;AAvIhB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAASC,MAAT,CAAiBzD,KAAjB,EAAwB0D,QAAxB,EAAkC;AAChC;AACA,MAAI1D,MAAM2D,SAAN,KAAoBpE,SAApB,IACES,MAAM2D,SAAN,CAAgB1B,YAAhB,KAAiCyB,SAAS3B,GAAT,CAAaE,YADhD,IAEEjC,MAAM2D,SAAN,CAAgB3B,WAAhB,KAAgC0B,SAAS3B,GAAT,CAAaC,WAF/C,IAGEhC,MAAM2D,SAAN,CAAgBzB,MAAhB,KAA2BwB,SAASxB,MAH1C,EAGkD;AAChD,WAAOlC,MAAM2D,SAAN,CAAgBC,QAAvB;AACD;;AAED;AACA,6BAAY5D,KAAZ,EAAmB0D,SAAS3B,GAAT,CAAaC,WAAhC,EAA6C0B,SAAS3B,GAAT,CAAaE,YAA1D,EAAwEyB,SAASxB,MAAjF;AACAlC,QAAM2D,SAAN,CAAgB3B,WAAhB,GAA8B0B,SAAS3B,GAAT,CAAaC,WAA3C;AACAhC,QAAM2D,SAAN,CAAgB1B,YAAhB,GAA+ByB,SAAS3B,GAAT,CAAaE,YAA5C;AACAjC,QAAM2D,SAAN,CAAgBzB,MAAhB,GAAyBwB,SAASxB,MAAlC;;AAEA,SAAOlC,MAAM2D,SAAN,CAAgBC,QAAvB;AACD,C,CA7BD;;;;;AA+BA,SAASC,eAAT,CAA0BlE,cAA1B,EAA0CK,KAA1C,EAAiDuB,WAAjD,EAA8D;AAC5D,MAAI,CAAC5B,eAAemE,cAAf,CAA8BC,YAAnC,EAAiD;AAC/CpE,mBAAemE,cAAf,CAA8BC,YAA9B,GAA6CnD,SAASoD,aAAT,CAAuB,QAAvB,CAA7C;AACD;;AAED,MAAMD,eAAepE,eAAemE,cAAf,CAA8BC,YAAnD;;AAEA;AACA;AACA,MAAIpE,eAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BC,WAA5B,KAA4C,GAA5C,IACErC,eAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BE,YAA5B,KAA6C,GAD/C,IAEEtC,eAAe+D,QAAf,CAAwBxB,MAAxB,KAAmC,KAFrC,IAGElC,MAAMiE,SAHR,IAIEjE,MAAMiE,SAAN,EAJN,EAKE;AACA,WAAOjE,MAAMiE,SAAN,EAAP;AACD;;AAED;AACA,MAAI,yCAA0BtE,cAA1B,EAA0CK,KAA1C,MAAqD,KAArD,IAA8DuB,gBAAgB,IAAlF,EAAwF;AACtF,WAAOwC,YAAP;AACD;;AAED;AACA;AACA;AACA,MAAIA,aAAahB,KAAb,KAAuB/C,MAAM+C,KAA7B,IAAsCgB,aAAanB,MAAb,KAAwB5C,MAAM4C,MAAxE,EAAgF;AAC9E,0CAAuBjD,cAAvB,EAAuCK,KAAvC;AACD;;AAED;AACA,MAAIkE,QAAQ,oBAAZ;AACA,MAAMC,WAAWV,OAAOzD,KAAP,EAAcL,eAAe+D,QAA7B,CAAjB;;AAEA1D,QAAMoE,KAAN,GAAcpE,MAAMoE,KAAN,IAAe,EAA7B;AACApE,QAAMoE,KAAN,CAAYC,mBAAZ,GAAkC,uBAAQH,KAA1C;;AAEA,MAAMI,mBAAmB3E,eAAemE,cAAf,CAA8BQ,gBAAvD;AACA,MAAMC,sBAAsB5E,eAAemE,cAAf,CAA8BS,mBAA1D;;AAEA;AACA;AACA,MAAIvE,MAAMwE,IAAV,EAAgB;AACd,wDAAqCxE,KAArC,EAA4CmE,QAA5C,EAAsDG,iBAAiBG,IAAvE;AACD,GAFD,MAEO;AACL,yDAAsCzE,KAAtC,EAA6CmE,QAA7C,EAAuDG,iBAAiBG,IAAxE;AACD;;AAEDP,UAAQ,oBAAR;AACAK,sBAAoBG,YAApB,CAAiCJ,gBAAjC,EAAmD,CAAnD,EAAsD,CAAtD;AACAtE,QAAMoE,KAAN,CAAYO,oBAAZ,GAAmC,uBAAQT,KAA3C;;AAEA,SAAOH,YAAP;AACD;;AAED;;;;;;;AAOO,SAASR,gBAAT,CAA2B5D,cAA3B,EAA2C4B,WAA3C,EAAwD;AAC7D,MAAI5B,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,kEAAV,CAAN;AACD;;AAED,MAAMQ,QAAQL,eAAeK,KAA7B;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,+DAAV,CAAN;AACD;;AAED;AACA,MAAM0B,UAAUvB,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CAAhB;;AAEA1D,UAAQG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACAH,UAAQ2D,SAAR,GAAoB,OAApB;AACA3D,UAAQ4D,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBnF,eAAegC,MAAf,CAAsBoB,KAA7C,EAAoDpD,eAAegC,MAAf,CAAsBiB,MAA1E;;AAEA;AACA1B,UAAQ6D,qBAAR,GAAgC,CAACpF,eAAe+D,QAAf,CAAwBvB,gBAAzD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEA;AACA,4CAA2BpF,cAA3B,EAA2CuB,OAA3C;;AAEA,MAAI6C,qBAAJ;;AAEA,MAAIpE,eAAesF,OAAf,IAA0BtF,eAAesF,OAAf,CAAuBC,QAAjD,IACFvF,eAAesF,OAAf,CAAuBC,QAAvB,CAAgCC,WAAhC,OAAkD,OADpD,EAC6D;AAC3D;AACA;AACApB,mBAAe,gBAAMmB,QAAN,CAAeE,MAAf,CAAsBzF,cAAtB,CAAf;AACD,GALD,MAKO;AACL;AACA;AACAoE,mBAAeF,gBAAgBlE,cAAhB,EAAgCK,KAAhC,EAAuCuB,WAAvC,CAAf;AACD;;AAEDL,UAAQmE,SAAR,CAAkBtB,YAAlB,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC/D,MAAM+C,KAA5C,EAAmD/C,MAAM4C,MAAzD,EAAiE,CAAjE,EAAoE,CAApE,EAAuE5C,MAAM+C,KAA7E,EAAoF/C,MAAM4C,MAA1F;;AAEAjD,iBAAemE,cAAf,GAAgC,gCAAiBnE,cAAjB,CAAhC;AACD;;AAEM,SAAS6D,aAAT,CAAwB8B,KAAxB,EAA+B/D,WAA/B,EAA4C;AACjD,MAAI+D,UAAU/F,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,sDAAV,CAAN;AACD;;AAED,MAAMQ,QAAQsF,MAAMtF,KAApB;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,4DAAV,CAAN;AACD;;AAED;AACAQ,QAAMwE,IAAN,GAAa,IAAb;AACAc,QAAM3D,MAAN,GAAekC,gBAAgByB,KAAhB,EAAuBtF,KAAvB,EAA8BuB,WAA9B,CAAf;;AAEA,MAAML,UAAUoE,MAAM3D,MAAN,CAAaiD,UAAb,CAAwB,IAAxB,CAAhB;;AAEA;AACA1D,UAAQ6D,qBAAR,GAAgC,CAACO,MAAM5B,QAAN,CAAevB,gBAAhD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEAO,QAAMxB,cAAN,GAAuB,gCAAiBwB,KAAjB,CAAvB;AACD,C;;;;;;;;;;;;;kBChJc,UAAUtF,KAAV,EAAiBgC,WAAjB,EAA8BC,YAA9B,EAA4CC,MAA5C,EAAoDK,WAApD,EAAiEC,MAAjE,EAAyE;AACtF,MAAM+C,gBAAgBvF,MAAMuF,aAA5B;AACA,MAAMC,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAMC,SAASxC,KAAKC,GAAL,CAASsC,aAAT,EAAwB,CAAxB,CAAf;;AAEA,MAAIxF,MAAM2D,SAAN,KAAoBpE,SAAxB,EAAmC;AACjC,QAAMG,SAAS6F,gBAAgBE,MAAhB,GAAyB,CAAxC;;AAEAzF,UAAM2D,SAAN,GAAkB,EAAlB;AACA3D,UAAM2D,SAAN,CAAgBC,QAAhB,GAA2B,IAAI8B,iBAAJ,CAAsBhG,MAAtB,CAA3B;AACD;;AAED,MAAMiG,MAAM3F,MAAM2D,SAAN,CAAgBC,QAA5B;AACA,MAAMgC,SAAS,8BAAe5F,MAAM6F,KAArB,EAA4B7F,MAAM8F,SAAlC,EAA6CvD,WAA7C,CAAf;AACA,MAAMwD,SAAS,yBAAU/D,WAAV,EAAuBC,YAAvB,EAAqCO,MAArC,CAAf;;AAEA,MAAIN,WAAW,IAAf,EAAqB;AACnB,SAAK,IAAI8D,cAAcR,aAAvB,EAAsCQ,eAAeT,aAArD,EAAoES,aAApE,EAAmF;AACjFL,UAAIK,cAAe,CAACP,MAApB,IAA+B,MAAMM,OAAOH,OAAOI,WAAP,CAAP,CAArC;AACD;AACF,GAJD,MAIO;AACL,SAAK,IAAIA,eAAcR,aAAvB,EAAsCQ,gBAAeT,aAArD,EAAoES,cAApE,EAAmF;AACjFL,UAAIK,eAAe,CAACP,MAApB,IAA+BM,OAAOH,OAAOI,YAAP,CAAP,CAA/B;AACD;AACF;;AAED,SAAOL,GAAP;AACD,C;;AA3CD;;;;AACA;;;;;;;;;;;;;;;;;kBCCe,UAAUhG,cAAV,EAA0B;AACvC;AACA;AACA,SAAO,kCAAmBA,cAAnB,CAAP;AACD,C;;AAND;;;;;;;;;;;;;;;;;kBCAe,UAAUA,cAAV,EAA0BK,KAA1B,EAAiC;AAC9C,MAAM+D,eAAepE,eAAemE,cAAf,CAA8BC,YAAnD;;AAEA;AACAA,eAAahB,KAAb,GAAqB/C,MAAM+C,KAA3B;AACAgB,eAAanB,MAAb,GAAsB5C,MAAM4C,MAA5B;;AAEA,MAAMqD,gBAAgBlC,aAAaa,UAAb,CAAwB,IAAxB,CAAtB;;AAEA;AACA;AACAqB,gBAAcpB,SAAd,GAA0B,OAA1B;AACAoB,gBAAcnB,QAAd,CAAuB,CAAvB,EAA0B,CAA1B,EAA6Bf,aAAahB,KAA1C,EAAiDgB,aAAanB,MAA9D;;AAEA,MAAM0B,mBAAmB2B,cAAcC,YAAd,CAA2B,CAA3B,EAA8B,CAA9B,EAAiClG,MAAM+C,KAAvC,EAA8C/C,MAAM4C,MAApD,CAAzB;;AAEAjD,iBAAemE,cAAf,CAA8BS,mBAA9B,GAAoD0B,aAApD;AACAtG,iBAAemE,cAAf,CAA8BQ,gBAA9B,GAAiDA,gBAAjD;AACD,C;;;;;;;;;;;;;kBClBc,UAAU3E,cAAV,EAA0B;AACvC,MAAME,UAAUF,eAAeK,KAAf,CAAqBH,OAArC;AACA,MAAM6D,WAAW/D,eAAe+D,QAAhC;;AAEA/D,iBAAemE,cAAf,CAA8BqC,mBAA9B,GAAoDtG,OAApD;AACAF,iBAAemE,cAAf,CAA8BsC,oBAA9B,GAAqD;AACnDnE,kBAAcyB,SAAS3B,GAAT,CAAaE,YADwB;AAEnDD,iBAAa0B,SAAS3B,GAAT,CAAaC,WAFyB;AAGnDE,YAAQwB,SAASxB,MAHkC;AAInDE,cAAUsB,SAAStB,QAJgC;AAKnDC,WAAOqB,SAASrB,KALmC;AAMnDC,WAAOoB,SAASpB,KANmC;AAOnDC,iBAAamB,SAASnB,WAP6B;AAQnDC,YAAQkB,SAASlB,MARkC;AASnDC,cAAUiB,SAASjB;AATgC,GAArD;;AAYA,SAAO9C,eAAemE,cAAtB;AACD,C;;;;;;;;;;;;;kBClBc,UAAUnE,cAAV,EAA0BK,KAA1B,EAAiC;AAC9C,MAAMmG,sBAAsBxG,eAAemE,cAAf,CAA8BqC,mBAA1D;AACA,MAAMC,uBAAuBzG,eAAemE,cAAf,CAA8BsC,oBAA3D;;AAEA,SACEpG,MAAMH,OAAN,KAAkBsG,mBAAlB,IACA,CAACC,oBADD,IAEAA,qBAAqBnE,YAArB,KAAsCtC,eAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BE,YAFlE,IAGAmE,qBAAqBpE,WAArB,KAAqCrC,eAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BC,WAHjE,IAIAoE,qBAAqBlE,MAArB,KAAgCvC,eAAe+D,QAAf,CAAwBxB,MAJxD,IAKAkE,qBAAqBhE,QAArB,KAAkCzC,eAAe+D,QAAf,CAAwBtB,QAL1D,IAMAgE,qBAAqB/D,KAArB,KAA+B1C,eAAe+D,QAAf,CAAwBrB,KANvD,IAOA+D,qBAAqB9D,KAArB,KAA+B3C,eAAe+D,QAAf,CAAwBpB,KAPvD,IAQA8D,qBAAqB7D,WAArB,KAAqC5C,eAAe+D,QAAf,CAAwBnB,WAR7D,IASA6D,qBAAqB5D,MAArB,KAAgC7C,eAAe+D,QAAf,CAAwBlB,MATxD,IAUA4D,qBAAqB3D,QAArB,KAAkC9C,eAAe+D,QAAf,CAAwBjB,QAX5D;AAaD,C;;;;;;;;;;;;;ACjBD;;AACA;;;;AACA;;;;;;AAEA,IAAM4D,MAAM;AACVC,4DADU;AAEVpB,YAAU;AACRE,4BADQ;AAERmB,wCAFQ;AAGR1C,8CAHQ;AAIR2C;AAJQ,GAFA;AAQVC;AARU,CAAZ;;AAWAC,OAAOC,cAAP,CAAsBN,GAAtB,EAA2B,oBAA3B,EAAiD;AAC/CO,cAAY,IADmC;AAE/CC,gBAAc,KAFiC;AAG/CC,OAAK;AAAA;AAAA;AAH0C,CAAjD;;kBAMeT,G;;;;;;;;;;;;;;;;;ICrBTU,W;AACJ,yBAAe;AAAA;;AACb,SAAKC,SAAL,GAAiB,EAAjB;AACD;;;;qCAEiBzG,I,EAAM0G,Q,EAAU;AAChC,UAAI,EAAE1G,QAAQ,KAAKyG,SAAf,CAAJ,EAA+B;AAC7B,aAAKA,SAAL,CAAezG,IAAf,IAAuB,EAAvB;AACD;;AAED,WAAKyG,SAAL,CAAezG,IAAf,EAAqBX,IAArB,CAA0BqH,QAA1B;AACD;;;wCAEoB1G,I,EAAM0G,Q,EAAU;AACnC,UAAI,EAAE1G,QAAQ,KAAKyG,SAAf,CAAJ,EAA+B;AAC7B;AACD;;AAED,UAAME,QAAQ,KAAKF,SAAL,CAAezG,IAAf,CAAd;;AAEA,WAAK,IAAId,IAAI,CAAR,EAAW0H,IAAID,MAAMxH,MAA1B,EAAkCD,IAAI0H,CAAtC,EAAyC1H,GAAzC,EAA8C;AAC5C,YAAIyH,MAAMzH,CAAN,MAAawH,QAAjB,EAA2B;AACzBC,gBAAME,MAAN,CAAa3H,CAAb,EAAgB,CAAhB;;AAEA;AACD;AACF;AACF;;;kCAEcgB,K,EAAO;AACpB,UAAI,EAAEA,MAAMF,IAAN,IAAc,KAAKyG,SAArB,CAAJ,EAAqC;AACnC,eAAO,IAAP;AACD;;AAED,UAAME,QAAQ,KAAKF,SAAL,CAAevG,MAAMF,IAArB,CAAd;;AAEA,WAAK,IAAId,IAAI,CAAR,EAAW0H,IAAID,MAAMxH,MAA1B,EAAkCD,IAAI0H,CAAtC,EAAyC1H,GAAzC,EAA8C;AAC5CyH,cAAMzH,CAAN,EAAS4H,IAAT,CAAc,IAAd,EAAoB5G,KAApB;AACD;;AAED,aAAO,CAACA,MAAM6G,gBAAd;AACD;;;;;;AAIH,IAAMC,SAAS,IAAIR,WAAJ,EAAf;;kBAEeQ,M;;;;;;;;;;;;QCYCC,oB,GAAAA,oB;QAsDAC,iB,GAAAA,iB;;AAjHhB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAAS5D,eAAT,CAA0BlE,cAA1B,EAA0CK,KAA1C,EAAiDuB,WAAjD,EAAsF;AAAA,MAAxBmG,eAAwB,uEAAN,IAAM;;AACpF,MAAI,CAAC/H,eAAemE,cAAf,CAA8BC,YAAnC,EAAiD;AAC/CpE,mBAAemE,cAAf,CAA8BC,YAA9B,GAA6CnD,SAASoD,aAAT,CAAuB,QAAvB,CAA7C;AACD;;AAED,MAAMD,eAAepE,eAAemE,cAAf,CAA8BC,YAAnD;;AAEA,MAAI,yCAA0BpE,cAA1B,EAA0CK,KAA1C,MAAqD,KAArD,IAA8DuB,gBAAgB,IAAlF,EAAwF;AACtF,WAAOwC,YAAP;AACD;;AAED;AACA;AACA;AACA,MAAIA,aAAahB,KAAb,KAAuB/C,MAAM+C,KAA7B,IAAsCgB,aAAanB,MAAb,KAAwB5C,MAAM4C,MAAxE,EAAgF;AAC9E,0CAAuBjD,cAAvB,EAAuCK,KAAvC;AACD;;AAED;AACA,MAAIkE,QAAQ,oBAAZ;AACA,MAAMyB,MAAM,sBAAO3F,KAAP,EAAcL,eAAe+D,QAA7B,EAAuCnC,WAAvC,CAAZ;;AAEAvB,QAAMoE,KAAN,GAAcpE,MAAMoE,KAAN,IAAe,EAA7B;AACApE,QAAMoE,KAAN,CAAYC,mBAAZ,GAAkC,uBAAQH,KAA1C;;AAEA,MAAMI,mBAAmB3E,eAAemE,cAAf,CAA8BQ,gBAAvD;AACA,MAAMC,sBAAsB5E,eAAemE,cAAf,CAA8BS,mBAA1D;;AAEA;AACA,MAAImD,eAAJ,EAAqB;AACnB,oDAAiC1H,KAAjC,EAAwC2F,GAAxC,EAA6CrB,iBAAiBG,IAA9D;AACD,GAFD,MAEO;AACL,wDAAqCzE,KAArC,EAA4C2F,GAA5C,EAAiDrB,iBAAiBG,IAAlE;AACD;;AAEDP,UAAQ,oBAAR;AACAK,sBAAoBG,YAApB,CAAiCJ,gBAAjC,EAAmD,CAAnD,EAAsD,CAAtD;AACAtE,QAAMoE,KAAN,CAAYO,oBAAZ,GAAmC,uBAAQT,KAA3C;;AAEA,SAAOH,YAAP;AACD;;AAED;;;;;;;AAOO,SAASyD,oBAAT,CAA+B7H,cAA/B,EAA+C4B,WAA/C,EAA4D;AACjE,MAAI5B,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,2DAAV,CAAN;AACD;;AAED,MAAMQ,QAAQL,eAAeK,KAA7B;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,wDAAV,CAAN;AACD;;AAED;AACA,MAAM0B,UAAUvB,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CAAhB;;AAEA1D,UAAQG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACAH,UAAQ2D,SAAR,GAAoB,OAApB;AACA3D,UAAQ4D,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBnF,eAAegC,MAAf,CAAsBoB,KAA7C,EAAoDpD,eAAegC,MAAf,CAAsBiB,MAA1E;;AAEA;AACA1B,UAAQ6D,qBAAR,GAAgC,CAACpF,eAAe+D,QAAf,CAAwBvB,gBAAzD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEA;AACA,4CAA2BpF,cAA3B,EAA2CuB,OAA3C;;AAEA,MAAI6C,qBAAJ;;AAEA,MAAIpE,eAAesF,OAAf,IAA0BtF,eAAesF,OAAf,CAAuBC,QAAjD,IACFvF,eAAesF,OAAf,CAAuBC,QAAvB,CAAgCC,WAAhC,OAAkD,OADpD,EAC6D;AAC3D;AACA;AACApB,mBAAe,gBAAMmB,QAAN,CAAeE,MAAf,CAAsBzF,cAAtB,CAAf;AACD,GALD,MAKO;AACL;AACA;AACAoE,mBAAeF,gBAAgBlE,cAAhB,EAAgCK,KAAhC,EAAuCuB,WAAvC,CAAf;AACD;;AAEDL,UAAQmE,SAAR,CAAkBtB,YAAlB,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC/D,MAAM+C,KAA5C,EAAmD/C,MAAM4C,MAAzD,EAAiE,CAAjE,EAAoE,CAApE,EAAuE5C,MAAM+C,KAA7E,EAAoF/C,MAAM4C,MAA1F;;AAEAjD,iBAAemE,cAAf,GAAgC,gCAAiBnE,cAAjB,CAAhC;AACD;;AAED;;;;;;;;;AASO,SAAS8H,iBAAT,CAA4BnC,KAA5B,EAAmC/D,WAAnC,EAAyE;AAAA,MAAzBmG,eAAyB,uEAAP,KAAO;;AAC9E,MAAIpC,UAAU/F,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,0DAAV,CAAN;AACD;;AAED,MAAMQ,QAAQsF,MAAMtF,KAApB;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,gEAAV,CAAN;AACD;;AAED8F,QAAM3D,MAAN,GAAekC,gBAAgByB,KAAhB,EAAuBtF,KAAvB,EAA8BuB,WAA9B,EAA2CmG,eAA3C,CAAf;;AAEA,MAAMxG,UAAUoE,MAAM3D,MAAN,CAAaiD,UAAb,CAAwB,IAAxB,CAAhB;;AAEA;AACA1D,UAAQ6D,qBAAR,GAAgC,CAACO,MAAM5B,QAAN,CAAevB,gBAAhD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEAO,QAAMxB,cAAN,GAAuB,gCAAiBwB,KAAjB,CAAvB;AACD,C;;;;;;;;;;;;;kBC1Hc,UAAU2B,QAAV,EAAoB;AACjC,SAAOhH,OAAO0H,qBAAP,CAA6BV,QAA7B,KACLhH,OAAO2H,2BAAP,CAAmCX,QAAnC,CADK,IAELhH,OAAO4H,wBAAP,CAAgCZ,QAAhC,CAFK,IAGLhH,OAAO6H,sBAAP,CAA8Bb,QAA9B,CAHK,IAILhH,OAAO8H,uBAAP,CAA+Bd,QAA/B,CAJK,IAKLe,aAAaf,QAAb,CALF;AAMD,C;;AAlBD,SAASe,YAAT,CAAuBf,QAAvB,EAAiC;AAC/BhH,SAAOgI,UAAP,CAAkBhB,QAAlB,EAA4B,OAAO,EAAnC;AACD;;AAED;;;;;;;;;;;;;;;;;;;kBCce,UAAUjH,KAAV,EAAiB2F,GAAjB,EAAsBuC,mBAAtB,EAA2C;AACxD,MAAIhE,QAAQ,oBAAZ;AACA,MAAMiE,YAAYnI,MAAMoI,YAAN,EAAlB;;AAEApI,QAAMoE,KAAN,CAAYiE,oBAAZ,GAAmC,uBAAQnE,KAA3C;;AAEA,MAAMoE,YAAYH,UAAUzI,MAA5B;AACA,MAAM8F,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;;AAGA;AACA;;AAEA;AACAtE,UAAQ,oBAAR;AACA,MAAIiE,qBAAqBM,UAAzB,EAAqC;AACnC,QAAIjD,gBAAgB,CAApB,EAAuB;AACrB,aAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCJ,4BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA5C,CADuC,CACgE;AACvG+C,gCAAwB,CAAxB;AACD;AACF,KALD,MAKO;AACL,aAAOC,uBAAuBF,SAA9B,EAAyC;AACvCJ,4BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA5C,CADuC,CAC6C;AACpFD,gCAAwB,CAAxB;AACD;AACF;AACF,GAZD,MAYO,IAAIJ,qBAAqBO,WAAzB,EAAsC;AAC3C,WAAOF,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA5C,CADuC,CAC6C;AACpFD,8BAAwB,CAAxB;AACD;AACF,GALM,MAKA,IAAI/C,gBAAgB,CAApB,EAAuB;AAC5B,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA5C,CADuC,CACgE;AACvG+C,8BAAwB,CAAxB;AACD;AACF,GALM,MAKA;AACL,WAAOC,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA5C,CADuC,CAC6C;AACpFD,8BAAwB,CAAxB;AACD;AACF;;AAEDvI,QAAMoE,KAAN,CAAYuE,wCAAZ,GAAuD,uBAAQzE,KAA/D;AACD,C;;AAjED;;;;;;;;;;;;;;;;;kBCae,UAAUlE,KAAV,EAAiB2F,GAAjB,EAAsBuC,mBAAtB,EAA2C;;AAExD,MAAIhE,QAAQ,oBAAZ;AACA,MAAMiE,YAAYnI,MAAMoI,YAAN,EAAlB;;AAEApI,QAAMoE,KAAN,CAAYiE,oBAAZ,GAAmC,uBAAQnE,KAA3C;;AAEA,MAAMsB,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA,MAAMF,YAAYH,UAAUzI,MAA5B;;AAEA;AACA;AACAwE,UAAQ,oBAAR;AACA,MAAIsB,gBAAgB,CAApB,EAAuB;AACrB,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA9C,CADuC,CACkE;AACzG0C,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA9C,CAFuC,CAEkE;AACzG0C,0BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,oBAAV,IAAmC,CAAChD,aAAxC,CAA5C,CAHuC,CAG8D;AACrGgD,8BAAwB,CAAxB;AACAD,8BAAwB,CAAxB;AACD;AACF,GARD,MAQO;AACL,WAAOC,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA9C,CADuC,CAC+C;AACtFN,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA9C,CAFuC,CAE+C;AACtFN,0BAAoBK,oBAApB,IAA4C5C,IAAIwC,UAAUK,oBAAV,CAAJ,CAA5C,CAHuC,CAG2C;AAClFA,8BAAwB,CAAxB;AACAD,8BAAwB,CAAxB;AACD;AACF;AACDvI,QAAMoE,KAAN,CAAYuE,wCAAZ,GAAuD,uBAAQzE,KAA/D;AACD,C;;AA9CD;;;;;;;;;;;;;;;;;ACAA;;;;AACA;;;;;;AAEA;;;;;;;;AAQA,SAAS0E,wCAAT,CAAmD5I,KAAnD,EAA0DmE,QAA1D,EAAoE+D,mBAApE,EAAyF;AACvF,MAAIhE,QAAQ,oBAAZ;AACA,MAAMiE,YAAYnI,MAAMoI,YAAN,EAAlB;;AAEApI,QAAMoE,KAAN,CAAYiE,oBAAZ,GAAmC,uBAAQnE,KAA3C;;AAEA,MAAMoE,YAAYH,UAAUzI,MAA5B;AACA,MAAM8F,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA,MAAIhE,aAAJ;AACA,MAAIqE,aAAJ;;AAEA3E,UAAQ,oBAAR;;AAEA,MAAIC,oBAAoB,gBAAOb,WAA/B,EAA4C;AAC1CuF,WAAO1E,SAAS2E,KAAhB;AACD,GAFD,MAEO;AACLD,WAAO1E,QAAP;AACD;;AAED,MAAIqB,gBAAgB,CAApB,EAAuB;AACrB,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvC9D,aAAOqE,KAAKV,UAAUK,sBAAV,IAAqC,CAAChD,aAA3C,CAAP;AACA0C,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACD;AACF,GARD,MAQO;AACL,WAAOgE,uBAAuBF,SAA9B,EAAyC;AACvC9D,aAAOqE,KAAKV,UAAUK,sBAAV,CAAL,CAAP;AACAN,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACD;AACF;;AAEDxE,QAAMoE,KAAN,CAAYuE,wCAAZ,GAAuD,uBAAQzE,KAA/D;AACD;;kBAEc0E,wC;;;;;;;;;;;;;ACrDf;;;;AACA;;;;;;AAEA;;;;;;;;;AASA,SAASG,8CAAT,CAAyD/I,KAAzD,EAAgEgJ,YAAhE,EAA8E7E,QAA9E,EAAwF+D,mBAAxF,EAA6G;AAC3G,MAAIhE,QAAQ,oBAAZ;AACA,MAAMiE,YAAYnI,MAAMoI,YAAN,EAAlB;;AAEApI,QAAMoE,KAAN,CAAYiE,oBAAZ,GAAmC,uBAAQnE,KAA3C;;AAEA,MAAMoE,YAAYH,UAAUzI,MAA5B;AACA,MAAM8F,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA,MAAIS,kBAAJ;AACA,MAAIzE,aAAJ;AACA,MAAIqE,aAAJ;;AAEA3E,UAAQ,oBAAR;;AAEA,MAAIC,oBAAoB,gBAAOb,WAA/B,EAA4C;AAC1CuF,WAAO1E,SAAS2E,KAAhB;AACD,GAFD,MAEO;AACLD,WAAO1E,QAAP;AACD;;AAED,MAAIqB,gBAAgB,CAApB,EAAuB;AACrB,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCW,kBAAYD,aAAab,UAAUK,sBAAV,IAAqC,CAAChD,aAAnD,CAAZ;AACAhB,aAAOqE,KAAKI,SAAL,CAAP;AACAf,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACD;AACF,GATD,MASO;AACL,WAAOgE,uBAAuBF,SAA9B,EAAyC;AACvCW,kBAAYD,aAAab,UAAUK,sBAAV,CAAb,CAAZ;AACAhE,aAAOqE,KAAKI,SAAL,CAAP;AACAf,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACA0D,0BAAoBK,sBAApB,IAA8C/D,KAAK,CAAL,CAA9C;AACD;AACF;;AAEDxE,QAAMoE,KAAN,CAAYuE,wCAAZ,GAAuD,uBAAQzE,KAA/D;AACD;;kBAEc6E,8C;;;;;;;;;;;;;kBChDA,UAAUpJ,cAAV,EAA0BwB,KAA1B,EAAiC;;AAE9C,MAAMC,YAAY,0BAAlB;;AAEAA,YAAU8H,SAAV,CAAoBvJ,eAAegC,MAAf,CAAsBoB,KAAtB,GAA8B,CAAlD,EAAqDpD,eAAegC,MAAf,CAAsBiB,MAAtB,GAA+B,CAApF;;AAEA;AACA,MAAMuG,QAAQxJ,eAAe+D,QAAf,CAAwBtB,QAAtC;;AAEA,MAAI+G,UAAU,CAAd,EAAiB;AACf/H,cAAUgI,MAAV,CAAiBD,QAAQlG,KAAKoG,EAAb,GAAkB,GAAnC;AACD;;AAED;AACA,MAAIC,aAAa3J,eAAe+D,QAAf,CAAwBvC,KAAzC;AACA,MAAIoI,cAAc5J,eAAe+D,QAAf,CAAwBvC,KAA1C;;AAEA,MAAIxB,eAAeK,KAAf,CAAqBwJ,eAArB,GAAuC7J,eAAeK,KAAf,CAAqByJ,kBAAhE,EAAoF;AAClFH,kBAAe3J,eAAeK,KAAf,CAAqByJ,kBAArB,GAA0C9J,eAAeK,KAAf,CAAqBwJ,eAA9E;AACD,GAFD,MAEO,IAAI7J,eAAeK,KAAf,CAAqByJ,kBAArB,GAA0C9J,eAAeK,KAAf,CAAqBwJ,eAAnE,EAAoF;AACzFD,mBAAgB5J,eAAeK,KAAf,CAAqBwJ,eAArB,GAAuC7J,eAAeK,KAAf,CAAqByJ,kBAA5E;AACD;AACDrI,YAAUD,KAAV,CAAgBmI,UAAhB,EAA4BC,WAA5B;;AAEA;AACA,MAAIJ,UAAU,CAAd,EAAiB;AACf/H,cAAUgI,MAAV,CAAiB,CAACD,KAAD,GAASlG,KAAKoG,EAAd,GAAmB,GAApC;AACD;;AAED;AACAjI,YAAU8H,SAAV,CAAoBvJ,eAAe+D,QAAf,CAAwB9B,WAAxB,CAAoCC,CAAxD,EAA2DlC,eAAe+D,QAAf,CAAwB9B,WAAxB,CAAoCE,CAA/F;;AAEA;AACA,MAAIqH,UAAU,CAAd,EAAiB;AACf/H,cAAUgI,MAAV,CAAiBD,QAAQlG,KAAKoG,EAAb,GAAkB,GAAnC;AACD;;AAED,MAAIlI,UAAU5B,SAAd,EAAyB;AACvB;AACA6B,cAAUD,KAAV,CAAgBA,KAAhB,EAAuBA,KAAvB;AACD;;AAED;AACA,MAAIxB,eAAe+D,QAAf,CAAwBrB,KAA5B,EAAmC;AACjCjB,cAAUD,KAAV,CAAgB,CAAC,CAAjB,EAAoB,CAApB;AACD;;AAED,MAAIxB,eAAe+D,QAAf,CAAwBpB,KAA5B,EAAmC;AACjClB,cAAUD,KAAV,CAAgB,CAAhB,EAAmB,CAAC,CAApB;AACD;;AAED;AACAC,YAAU8H,SAAV,CAAoB,CAACvJ,eAAeK,KAAf,CAAqB+C,KAAtB,GAA8B,CAAlD,EAAqD,CAACpD,eAAeK,KAAf,CAAqB4C,MAAtB,GAA+B,CAApF;;AAEA,SAAOxB,SAAP;AACD,C;;AAhED,yC;;;;;;;;;;;;QCwEgBsI,mB,GAAAA,mB;QA6CAC,gB,GAAAA,gB;;AArHhB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAAS9F,eAAT,CAA0BlE,cAA1B,EAA0CK,KAA1C,EAAiDuB,WAAjD,EAA8D;AAC5D,MAAI,CAAC5B,eAAemE,cAAf,CAA8BC,YAAnC,EAAiD;AAC/CpE,mBAAemE,cAAf,CAA8BC,YAA9B,GAA6CnD,SAASoD,aAAT,CAAuB,QAAvB,CAA7C;AACD;;AAED,MAAMD,eAAepE,eAAemE,cAAf,CAA8BC,YAAnD;;AAEA;AACA,MAAItB,WAAW9C,eAAe+D,QAAf,CAAwBjB,QAAxB,IAAoC9C,eAAesF,OAAf,CAAuBxC,QAA1E;;AAEA,MAAIA,YAAa,OAAOA,QAAP,KAAoB,QAArC,EAAgD;AAC9CA,eAAW,gBAAOW,WAAP,CAAmBX,QAAnB,CAAX;AACD;;AAED,MAAI,CAACA,QAAL,EAAe;AACb,UAAM,IAAIjD,KAAJ,CAAU,0CAAV,CAAN;AACD;;AAED,MAAMoK,aAAanH,SAASoH,KAAT,EAAnB;;AAEA,MAAI,yCAA0BlK,cAA1B,EAA0CK,KAA1C,MAAqD,KAArD,IAA8DuB,gBAAgB,IAA9E,IACF5B,eAAemE,cAAf,CAA8B8F,UAA9B,KAA6CA,UAD/C,EAC2D;AACzD,WAAO7F,YAAP;AACD;;AAED;AACA;AACA;AACA,MAAIA,aAAahB,KAAb,KAAuB/C,MAAM+C,KAA7B,IAAsCgB,aAAanB,MAAb,KAAwB5C,MAAM4C,MAAxE,EAAgF;AAC9E,0CAAuBjD,cAAvB,EAAuCK,KAAvC;AACD;;AAED;AACA,MAAIkE,QAAQ,oBAAZ;;AAEA,MAAI,CAACvE,eAAemE,cAAf,CAA8BK,QAA/B,IAA2C5C,WAA3C,IACF5B,eAAemE,cAAf,CAA8B8F,UAA9B,KAA6CA,UAD/C,EAC2D;AACzDjK,mBAAemE,cAAf,CAA8BK,QAA9B,GAAyC1B,SAASqH,iBAAT,EAAzC;AACAnK,mBAAemE,cAAf,CAA8B8F,UAA9B,GAA2CA,UAA3C;AACD;;AAED5J,QAAMoE,KAAN,GAAcpE,MAAMoE,KAAN,IAAe,EAA7B;AACApE,QAAMoE,KAAN,CAAYC,mBAAZ,GAAkC,uBAAQH,KAA1C;;AAEA,MAAMC,WAAWxE,eAAemE,cAAf,CAA8BK,QAA/C;AACA,MAAMG,mBAAmB3E,eAAemE,cAAf,CAA8BQ,gBAAvD;AACA,MAAMC,sBAAsB5E,eAAemE,cAAf,CAA8BS,mBAA1D;;AAEA,0DAAyCvE,KAAzC,EAAgDmE,QAAhD,EAA0DG,iBAAiBG,IAA3E;;AAEAP,UAAQ,oBAAR;AACAK,sBAAoBG,YAApB,CAAiCJ,gBAAjC,EAAmD,CAAnD,EAAsD,CAAtD;AACAtE,QAAMoE,KAAN,CAAYO,oBAAZ,GAAmC,uBAAQT,KAA3C;;AAEA,SAAOH,YAAP;AACD;;AAED;;;;;;;AAOO,SAAS2F,mBAAT,CAA8B/J,cAA9B,EAA8C4B,WAA9C,EAA2D;AAChE,MAAI5B,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,qEAAV,CAAN;AACD;;AAED,MAAMQ,QAAQL,eAAeK,KAA7B;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,kEAAV,CAAN;AACD;;AAED;AACA,MAAM0B,UAAUvB,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CAAhB;;AAEA1D,UAAQG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACAH,UAAQ2D,SAAR,GAAoB,OAApB;AACA3D,UAAQ4D,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBnF,eAAegC,MAAf,CAAsBoB,KAA7C,EAAoDpD,eAAegC,MAAf,CAAsBiB,MAA1E;;AAEA;AACA1B,UAAQ6D,qBAAR,GAAgC,CAACpF,eAAe+D,QAAf,CAAwBvB,gBAAzD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEA;AACA,4CAA2BpF,cAA3B,EAA2CuB,OAA3C;;AAEA;AACA;AACA;AACA,MAAM6C,eAAeF,gBAAgBlE,cAAhB,EAAgCK,KAAhC,EAAuCuB,WAAvC,CAArB;AA9BgE,MA+BxDwB,KA/BwD,GA+BtC/C,KA/BsC,CA+BxD+C,KA/BwD;AAAA,MA+BjDH,MA/BiD,GA+BtC5C,KA/BsC,CA+BjD4C,MA/BiD;;;AAiChE1B,UAAQmE,SAAR,CAAkBtB,YAAlB,EAAgC,CAAhC,EAAmC,CAAnC,EAAsChB,KAAtC,EAA6CH,MAA7C,EAAqD,CAArD,EAAwD,CAAxD,EAA2DG,KAA3D,EAAkEH,MAAlE;;AAEAjD,iBAAemE,cAAf,GAAgC,gCAAiBnE,cAAjB,CAAhC;AACD;;AAED;;;;;;;AAOO,SAASgK,gBAAT,CAA2BrE,KAA3B,EAAkC/D,WAAlC,EAA+C;AACpD,MAAI+D,UAAU/F,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,yDAAV,CAAN;AACD;;AAED,MAAMQ,QAAQsF,MAAMtF,KAApB;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,+DAAV,CAAN;AACD;;AAED8F,QAAM3D,MAAN,GAAekC,gBAAgByB,KAAhB,EAAuBtF,KAAvB,EAA8BuB,WAA9B,CAAf;;AAEA,MAAML,UAAUoE,MAAM3D,MAAN,CAAaiD,UAAb,CAAwB,IAAxB,CAAhB;;AAEA;AACA1D,UAAQ6D,qBAAR,GAAgC,CAACO,MAAM5B,QAAN,CAAevB,gBAAhD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEAO,QAAMxB,cAAN,GAAuB,gCAAiBwB,KAAjB,CAAvB;AACD,C;;;;;;;;;;;;QC7DeyE,sB,GAAAA,sB;QA8CAC,mB,GAAAA,mB;;AA1HhB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,SAASnG,eAAT,CAA0BlE,cAA1B,EAA0CK,KAA1C,EAAiDuB,WAAjD,EAA8D;AAC5D,MAAI,CAAC5B,eAAemE,cAAf,CAA8BC,YAAnC,EAAiD;AAC/CpE,mBAAemE,cAAf,CAA8BC,YAA9B,GAA6CnD,SAASoD,aAAT,CAAuB,QAAvB,CAA7C;AACD;;AAED,MAAMD,eAAepE,eAAemE,cAAf,CAA8BC,YAAnD;;AAEA;AACA,MAAItB,WAAW9C,eAAe+D,QAAf,CAAwBjB,QAAxB,IAAoC9C,eAAesF,OAAf,CAAuBxC,QAA1E;;AAEA,MAAIA,YAAa,OAAOA,QAAP,KAAoB,QAArC,EAAgD;AAC9CA,eAAW,gBAAOW,WAAP,CAAmBX,QAAnB,CAAX;AACD;;AAED,MAAI,CAACA,QAAL,EAAe;AACb,UAAM,IAAIjD,KAAJ,CAAU,6CAAV,CAAN;AACD;;AAED,MAAMoK,aAAanH,SAASoH,KAAT,EAAnB;;AAEA,MAAI,yCAA0BlK,cAA1B,EAA0CK,KAA1C,MAAqD,KAArD,IAA8DuB,gBAAgB,IAA9E,IACF5B,eAAemE,cAAf,CAA8B8F,UAA9B,KAA6CA,UAD/C,EAC2D;AACzD,WAAO7F,YAAP;AACD;;AAED;AACA;AACA;AACA,MAAIA,aAAahB,KAAb,KAAuB/C,MAAM+C,KAA7B,IAAsCgB,aAAanB,MAAb,KAAwB5C,MAAM4C,MAAxE,EAAgF;AAC9E,0CAAuBjD,cAAvB,EAAuCK,KAAvC;AACD;;AAED;AACA,MAAIkE,QAAQ,oBAAZ;;AAEA,MAAI,CAACvE,eAAemE,cAAf,CAA8BK,QAA/B,IAA2C5C,WAA3C,IACC5B,eAAemE,cAAf,CAA8B8F,UAA9B,KAA6CA,UADlD,EAC8D;AAC5DnH,aAASwH,iBAAT,CAA2B,GAA3B;AACAtK,mBAAemE,cAAf,CAA8BK,QAA9B,GAAyC1B,SAASqH,iBAAT,EAAzC;AACAnK,mBAAemE,cAAf,CAA8B8F,UAA9B,GAA2CA,UAA3C;AACD;;AAED,MAAMjE,MAAM,sBAAO3F,KAAP,EAAcL,eAAe+D,QAA7B,EAAuCnC,WAAvC,CAAZ;;AAEAvB,QAAMoE,KAAN,GAAcpE,MAAMoE,KAAN,IAAe,EAA7B;AACApE,QAAMoE,KAAN,CAAYC,mBAAZ,GAAkC,uBAAQH,KAA1C;;AAEA,MAAMC,WAAWxE,eAAemE,cAAf,CAA8BK,QAA/C;AACA,MAAMG,mBAAmB3E,eAAemE,cAAf,CAA8BQ,gBAAvD;AACA,MAAMC,sBAAsB5E,eAAemE,cAAf,CAA8BS,mBAA1D;;AAEA,gEAA+CvE,KAA/C,EAAsD2F,GAAtD,EAA2DxB,QAA3D,EAAqEG,iBAAiBG,IAAtF;;AAEAP,UAAQ,oBAAR;AACAK,sBAAoBG,YAApB,CAAiCJ,gBAAjC,EAAmD,CAAnD,EAAsD,CAAtD;AACAtE,QAAMoE,KAAN,CAAYO,oBAAZ,GAAmC,uBAAQT,KAA3C;;AAEA,SAAOH,YAAP;AACD;;AAED;;;;;;;AAOO,SAASgG,sBAAT,CAAiCpK,cAAjC,EAAiD4B,WAAjD,EAA8D;AACnE,MAAI5B,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,2DAAV,CAAN;AACD;;AAED,MAAMQ,QAAQL,eAAeK,KAA7B;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,wDAAV,CAAN;AACD;;AAED;AACA,MAAM0B,UAAUvB,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CAAhB;;AAEA1D,UAAQG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACAH,UAAQ2D,SAAR,GAAoB,OAApB;AACA3D,UAAQ4D,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBnF,eAAegC,MAAf,CAAsBoB,KAA7C,EAAoDpD,eAAegC,MAAf,CAAsBiB,MAA1E;;AAEA;AACA1B,UAAQ6D,qBAAR,GAAgC,CAACpF,eAAe+D,QAAf,CAAwBvB,gBAAzD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEA;AACA,4CAA2BpF,cAA3B,EAA2CuB,OAA3C;;AAGA;AACA;AACA;AACA,MAAM6C,eAAeF,gBAAgBlE,cAAhB,EAAgCK,KAAhC,EAAuCuB,WAAvC,CAArB;AA/BmE,MAgC3DwB,KAhC2D,GAgCzC/C,KAhCyC,CAgC3D+C,KAhC2D;AAAA,MAgCpDH,MAhCoD,GAgCzC5C,KAhCyC,CAgCpD4C,MAhCoD;;;AAkCnE1B,UAAQmE,SAAR,CAAkBtB,YAAlB,EAAgC,CAAhC,EAAmC,CAAnC,EAAsChB,KAAtC,EAA6CH,MAA7C,EAAqD,CAArD,EAAwD,CAAxD,EAA2DG,KAA3D,EAAkEH,MAAlE;;AAEAjD,iBAAemE,cAAf,GAAgC,gCAAiBnE,cAAjB,CAAhC;AACD;;AAED;;;;;;;AAOO,SAASqK,mBAAT,CAA8B1E,KAA9B,EAAqC/D,WAArC,EAAkD;AACvD,MAAI+D,UAAU/F,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,4DAAV,CAAN;AACD;;AAED,MAAMQ,QAAQsF,MAAMtF,KAApB;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,kEAAV,CAAN;AACD;;AAED8F,QAAM3D,MAAN,GAAekC,gBAAgByB,KAAhB,EAAuBtF,KAAvB,EAA8BuB,WAA9B,CAAf;;AAEA,MAAML,UAAUoE,MAAM3D,MAAN,CAAaiD,UAAb,CAAwB,IAAxB,CAAhB;;AAEA;AACA1D,UAAQ6D,qBAAR,GAAgC,CAACO,MAAM5B,QAAN,CAAevB,gBAAhD;AACAjB,UAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEAO,QAAMxB,cAAN,GAAuB,gCAAiBwB,KAAjB,CAAvB;AACD,C;;;;;;;;;;;;QCvGe4E,Y,GAAAA,Y;QA+BAC,Q,GAAAA,Q;QAsDAC,W,GAAAA,W;QAyBAC,Q,GAAAA,Q;QAcAC,S,GAAAA,S;QAcAC,gB,GAAAA,gB;QAeAC,c,GAAAA,c;QAoCAC,a,GAAAA,a;QA6CAC,c,GAAAA,c;;AAjRhB;;;;AACA;;AACA;;;;AACA;;;;AACA;;;;;;AAEA;;;;;;;;;AASA,SAASrK,YAAT,CAAuBsK,SAAvB,EAAkChL,cAAlC,EAAkDiL,OAAlD,EAA2D;AACzD,MAAMtL,UAAUK,eAAeL,OAA/B;AACA,MAAMuL,YAAY;AAChBnH,cAAU/D,eAAe+D,QADT;AAEhBpE,aAASK,eAAeL,OAFR;AAGhBU,WAAOL,eAAeK,KAHN;AAIhBL,kCAJgB;AAKhBiL;AALgB,GAAlB;;AAQA,8BAAmBtL,OAAnB,EAA4BqL,SAA5B,EAAuCE,SAAvC;AACD;;AAED;;;;;;;;;;;AAWO,SAASX,YAAT,CAAuBY,SAAvB,EAAkCC,WAAlC,EAA+C;AACpD,MAAID,UAAUF,OAAV,KAAsBG,YAAYH,OAAtC,EAA+C;AAC7C,UAAM,IAAIpL,KAAJ,CAAU,uDAAV,CAAN;AACD;;AAED,MAAMwL,YAAYF,UAAU9K,KAA5B;AACA,MAAMiL,cAAcF,YAAY/K,KAAhC;;AAEA;AACA,MAAI,CAACgL,UAAUnL,OAAX,IAAsB,CAACoL,YAAYpL,OAAvC,EAAgD;AAC9C;AACD;;AAED;AACA;AACA,MAAMqL,cAAeD,YAAYxB,kBAAZ,GAAiCwB,YAAYlI,KAA9C,IACCiI,UAAUvB,kBAAV,GAA+BuB,UAAUjI,KAD1C,CAApB;AAEA,MAAMoI,gBAAgBJ,YAAYrH,QAAZ,CAAqBvC,KAArB,GAA6B2J,UAAUpH,QAAV,CAAmBvC,KAAhD,GAAwD+J,WAA9E;;AAEAH,cAAYrH,QAAZ,CAAqBvC,KAArB,GAA6B2J,UAAUpH,QAAV,CAAmBvC,KAAnB,GAA2BgK,aAAxD;AACD;;AAED;;;;;;;;;AASO,SAAShB,QAAT,CAAmB7K,OAAnB,EAA4BU,KAA5B,EAAmCiF,OAAnC,EAA4C;AACjD,MAAM2F,UAAU,qBAAhB;AACA,MAAMjL,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAMkC,SAAS7B,eAAe6B,MAA9B;AACA,MAAIkC,iBAAJ;;AAEA,MAAI1D,KAAJ,EAAW;AACT0D,eAAW,kCAAmB/D,eAAegC,MAAlC,EAA0C3B,KAA1C,CAAX;;AAEA;AACA;AACA,QAAIiF,WAAWA,QAAQvB,QAAvB,EAAiC;AAC/BA,iBAAWgD,OAAO0E,MAAP,CAAc1H,QAAd,EAAwBuB,QAAQvB,QAAhC,CAAX;AACD;AACF;;AAED;AACA,MAAI/D,eAAe0L,aAAf,KAAiC,KAArC,EAA4C;AAC1C1L,mBAAe0L,aAAf,GAA+B,IAA/B;AACD;;AAED,MAAMC,WAAW;AACftL,gBADe;AAEf4K,oBAFe;AAGflH,sBAHe;AAIfuB,aAASA,WAAW,EAJL;AAKfnB,oBAAgB;AALD,GAAjB;;AAQA;AACA;AACA,MAAItC,OAAO9B,MAAP,IAAiBM,KAArB,EAA4B;AAC1BkK,iBAAa1I,OAAO,CAAP,CAAb,EAAwB8J,QAAxB;AACD;;AAED9J,SAAO5B,IAAP,CAAY0L,QAAZ;;AAEAjL,eAAa,uBAAb,EAAsCV,cAAtC,EAAsDiL,OAAtD;;AAEA;AACA,MAAIpJ,OAAO9B,MAAP,KAAkB,CAAlB,IAAuBM,KAA3B,EAAkC;AAChCwK,mBAAelL,OAAf,EAAwBsL,OAAxB;AACD;;AAED,SAAOA,OAAP;AACD;;AAED;;;;;;;AAOO,SAASR,WAAT,CAAsB9K,OAAtB,EAA+BsL,OAA/B,EAAwC;AAC7C,MAAMjL,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAMkC,SAAS7B,eAAe6B,MAA9B;AACA,MAAM+J,QAAQ5L,eAAe6B,MAAf,CAAsBgK,SAAtB,CAAgC,UAAClG,KAAD;AAAA,WAAWA,MAAMsF,OAAN,KAAkBA,OAA7B;AAAA,GAAhC,CAAd;;AAEA,MAAIW,UAAU,CAAC,CAAf,EAAkB;AAChB/J,WAAO4F,MAAP,CAAcmE,KAAd,EAAqB,CAArB;;AAEA;AACA;AACA,QAAIX,YAAYjL,eAAe8L,aAA3B,IAA4CjK,OAAO9B,MAAvD,EAA+D;AAC7D8K,qBAAelL,OAAf,EAAwBkC,OAAO,CAAP,EAAUoJ,OAAlC;AACD;;AAEDvK,iBAAa,yBAAb,EAAwCV,cAAxC,EAAwDiL,OAAxD;AACD;AACF;;AAED;;;;;;;AAOO,SAASP,QAAT,CAAmB/K,OAAnB,EAA4BsL,OAA5B,EAAqC;AAC1C,MAAMjL,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAGA,SAAOK,eAAe6B,MAAf,CAAsBkK,IAAtB,CAA2B,UAACpG,KAAD;AAAA,WAAWA,MAAMsF,OAAN,KAAkBA,OAA7B;AAAA,GAA3B,CAAP;AACD;;AAED;;;;;;;AAOO,SAASN,SAAT,CAAoBhL,OAApB,EAA6B;AAClC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAGA,SAAOK,eAAe6B,MAAtB;AACD;;AAED;;;;;;;AAOO,SAAS+I,gBAAT,CAA2BjL,OAA3B,EAAoC;AACzC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA,SAAOK,eAAe6B,MAAf,CAAsBmK,MAAtB,CAA6B,UAACrG,KAAD;AAAA,WAAWA,MAAML,OAAN,IAClCK,MAAML,OAAN,CAAc2G,OAAd,KAA0B,KADQ,IAElCtG,MAAML,OAAN,CAAc4G,OAAd,KAA0B,CAFH;AAAA,GAA7B,CAAP;AAGD;;AAED;;;;;;;AAOO,SAASrB,cAAT,CAAyBlL,OAAzB,EAAkCsL,OAAlC,EAA2C;AAChD,MAAMjL,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA;AACA,MAAIK,eAAe8L,aAAf,KAAiCb,OAArC,EAA8C;AAC5C;AACD;;AAED,MAAMW,QAAQ5L,eAAe6B,MAAf,CAAsBgK,SAAtB,CAAgC,UAAClG,KAAD;AAAA,WAAWA,MAAMsF,OAAN,KAAkBA,OAA7B;AAAA,GAAhC,CAAd;;AAEA,MAAIW,UAAU,CAAC,CAAf,EAAkB;AAChB,UAAM,IAAI/L,KAAJ,CAAU,iDAAV,CAAN;AACD;;AAED,MAAM8F,QAAQ3F,eAAe6B,MAAf,CAAsB+J,KAAtB,CAAd;;AAEA,MAAI,CAACjG,MAAMtF,KAAX,EAAkB;AAChB,UAAM,IAAIR,KAAJ,CAAU,qEAAV,CAAN;AACD;;AAEDG,iBAAe8L,aAAf,GAA+Bb,OAA/B;AACAjL,iBAAeK,KAAf,GAAuBsF,MAAMtF,KAA7B;AACAL,iBAAe+D,QAAf,GAA0B4B,MAAM5B,QAAhC;;AAEA,6BAAYpE,OAAZ;AACAe,eAAa,+BAAb,EAA8CV,cAA9C,EAA8DiL,OAA9D;AACD;;AAED;;;;;;;;AAQO,SAASH,aAAT,CAAwBnL,OAAxB,EAAiCU,KAAjC,EAAwC4K,OAAxC,EAAiD;AACtD,MAAMjL,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAMwL,YAAYnL,eAAe6B,MAAf,CAAsB,CAAtB,CAAlB;;AAEA,MAAI8D,cAAJ;;AAEA,MAAIsF,OAAJ,EAAa;AACXtF,YAAQ+E,SAAS/K,OAAT,EAAkBsL,OAAlB,CAAR;AACD,GAFD,MAEO;AACLtF,YAAQoF,eAAepL,OAAf,CAAR;AACD;;AAED,MAAI,CAACgG,KAAL,EAAY;AACV,UAAM,IAAI9F,KAAJ,CAAU,gCAAV,CAAN;AACD;;AAED8F,QAAMtF,KAAN,GAAcA,KAAd;;AAEA,MAAI,CAACA,KAAL,EAAY;AACVsF,UAAM5B,QAAN,GAAiBnE,SAAjB;;AAEA;AACD;;AAED,MAAI,CAAC+F,MAAM5B,QAAX,EAAqB;AACnB,QAAMoI,kBAAkB,kCAAmBnM,eAAegC,MAAlC,EAA0C3B,KAA1C,CAAxB;;AAEA;AACA;AACA,QAAIsF,MAAML,OAAN,IAAiBK,MAAML,OAAN,CAAcvB,QAAnC,EAA6C;AAC3C4B,YAAM5B,QAAN,GAAiBgD,OAAO0E,MAAP,CAAcU,eAAd,EAA+BxG,MAAML,OAAN,CAAcvB,QAA7C,CAAjB;AACD;;AAED,QAAIoH,UAAUF,OAAV,KAAsBA,OAA1B,EAAmC;AACjCV,mBAAaY,SAAb,EAAwBxF,KAAxB;AACD;AACF;AACF;;AAED;;;;;;AAMO,SAASoF,cAAT,CAAyBpL,OAAzB,EAAkC;AACvC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAGA,SAAOK,eAAe6B,MAAf,CAAsBkK,IAAtB,CAA2B,UAACpG,KAAD;AAAA,WAAWA,MAAMsF,OAAN,KAAkBjL,eAAe8L,aAA5C;AAAA,GAA3B,CAAP;AACD,C;;;;;;;;;;;;;kBC5Oc,UAAU5F,KAAV,EAAiBC,SAAjB,EAA4BvD,WAA5B,EAAyC;AACtD,MAAIA,WAAJ,EAAiB;AACf,WAAOwJ,6BAA6BxJ,WAA7B,CAAP;AACD;;AAED,SAAOyJ,0BAA0BnG,KAA1B,EAAiCC,SAAjC,CAAP;AACD,C;;AAhDD;;;;;;;;;;;;;AAaA,SAASkG,yBAAT,CAAoCnG,KAApC,EAA2CC,SAA3C,EAAsD;AACpD,SAAO,UAACmG,gBAAD;AAAA,WAAsBA,mBAAmBpG,KAAnB,GAA2BC,SAAjD;AAAA,GAAP;AACD;;AAED,SAASiG,4BAAT,CAAuCxJ,WAAvC,EAAoD;AAClD,MAAM2J,WAAW3J,YAAYoD,GAAZ,CAAgB,CAAhB,CAAjB;AACA,MAAMwG,WAAW5J,YAAYoD,GAAZ,CAAgBpD,YAAYoD,GAAZ,CAAgBjG,MAAhB,GAAyB,CAAzC,CAAjB;AACA,MAAM0M,iBAAiB7J,YAAY8J,gBAAZ,GAA+B9J,YAAYoD,GAAZ,CAAgBjG,MAAtE;;AAEA,SAAO,UAACuM,gBAAD,EAAsB;AAC3B,QAAIA,mBAAmB1J,YAAY8J,gBAAnC,EAAqD;AACnD,aAAOH,QAAP;AACD,KAFD,MAEO,IAAID,oBAAoBG,cAAxB,EAAwC;AAC7C,aAAOD,QAAP;AACD;;AAED,WAAO5J,YAAYoD,GAAZ,CAAgBsG,gBAAhB,CAAP;AACD,GARD;AASD;;AAED;;;;;;;;;;;;;;;;;;;;QCqkBgB5I,gB,GAAAA,gB;QAqCAD,W,GAAAA,W;;AA3oBhB;;;;;;AAEA,IAAMkJ,oBAAoB,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAMC,gBAAgB;AACpBC,WAAS;AACPC,UAAM,UADC;AAEPC,iBAAa,GAFN;AAGPC,YAAQ,CACN,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADM,EACU,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADV,EAC0B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1B,EAC0C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1C,EAC0D,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1D,EAEN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAFM,EAEW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAFX,EAE4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAF5B,EAE6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAF7C,EAE8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAF9D,EAGN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAHM,EAGW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAHX,EAG4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAH5B,EAG6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAH7C,EAG8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAH9D,EAIN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAJM,EAIW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAJX,EAI4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAJ5B,EAI6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAJ7C,EAI8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAJ9D,EAKN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CALM,EAKW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CALX,EAK4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAL5B,EAK6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAL7C,EAK8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAL9D,EAMN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CANM,EAMW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CANX,EAM4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAN5B,EAM6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAN7C,EAM8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAN9D,EAON,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAPM,EAOW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAPX,EAO4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAP5B,EAO6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAP7C,EAO8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAP9D,EAQN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CARM,EAQW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CARX,EAQ4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAR5B,EAQ6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAR7C,EAQ8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAR9D,EASN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CATM,EASW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CATX,EAS4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAT5B,EAS6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAT7C,EAS8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAT9D,EAUN,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAVM,EAUW,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAVX,EAU4B,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAV5B,EAU6C,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAV7C,EAU8D,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,GAAX,CAV9D,EAWN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAXM,EAWY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAXZ,EAW8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAX9B,EAWgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAXhD,EAWkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAXlE,EAYN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAZM,EAYY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAZZ,EAY8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAZ9B,EAYgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAZhD,EAYkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAZlE,EAaN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAbM,EAaY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAbZ,EAa8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAb9B,EAagD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAbhD,EAakE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAblE,EAcN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAdM,EAcY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAdZ,EAc8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAd9B,EAcgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAdhD,EAckE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAdlE,EAeN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAfM,EAeY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAfZ,EAe8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAf9B,EAegD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAfhD,EAekE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAflE,EAgBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhBM,EAgBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhBZ,EAgB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhB9B,EAgBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhBhD,EAgBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhBlE,EAiBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjBM,EAiBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjBZ,EAiB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjB9B,EAiBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjBhD,EAiBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjBlE,EAkBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAlBM,EAkBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAlBZ,EAkB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAlB9B,EAkBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAlBhD,EAkBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAlBlE,EAmBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAnBM,EAmBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAnBZ,EAmB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAnB9B,EAmBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAnBhD,EAmBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAnBlE,EAoBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CApBM,EAoBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CApBZ,EAoB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CApB9B,EAoBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CApBhD,EAoBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CApBlE,EAqBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CArBM,EAqBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CArBZ,EAqB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CArB9B,EAqBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CArBhD,EAqBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CArBlE,EAsBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAtBM,EAsBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAtBZ,EAsB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAtB9B,EAsBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAtBhD,EAsBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAtBlE,EAuBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAvBM,EAuBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAvBZ,EAuB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAvB9B,EAuBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAvBhD,EAuBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAvBlE,EAwBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAxBM,EAwBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAxBZ,EAwB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAxB9B,EAwBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAxBhD,EAwBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAxBlE,EAyBN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAzBM,EAyBY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAzBZ,EAyB8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAzB9B,EAyBgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAzBhD,EAyBkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAzBlE,EA0BN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA1BM,EA0BY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA1BZ,EA0B8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA1B9B,EA0BgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA1BhD,EA0BkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA1BlE,EA2BN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA3BM,EA2BY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA3BZ,EA2B8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA3B9B,EA2BgD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3BhD,EA2BmE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3BnE,EA4BN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5BM,EA4Ba,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5Bb,EA4BgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5BhC,EA4BmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5BnD,EA4BsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5BtE,EA6BN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7BM,EA6Ba,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7Bb,EA6BgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7BhC,EA6BmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7BnD,EA6BsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7BtE,EA8BN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9BM,EA8Ba,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9Bb,EA8BgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9BhC,EA8BmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9BnD,EA8BsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9BtE,EA+BN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BM,EA+Ba,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/Bb,EA+BgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BhC,EA+BmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BnD,EA+BsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BtE,EAgCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCM,EAgCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCb,EAgCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhChC,EAgCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCnD,EAgCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCtE,EAiCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCM,EAiCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCb,EAiCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjChC,EAiCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCnD,EAiCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCtE,EAkCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCM,EAkCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCb,EAkCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlChC,EAkCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCnD,EAkCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCtE,EAmCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnCM,EAmCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnCb,EAmCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnChC,EAmCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnCnD,EAmCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnCtE,EAoCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CApCM,EAoCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CApCb,EAoCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CApChC,EAoCmD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CApCnD,EAoCuE,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CApCvE,EAqCN,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CArCM,EAqCc,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CArCd,EAqCkC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CArClC,EAqCsD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CArCtD,EAqC0E,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CArC1E,EAsCN,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAtCM,EAsCc,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAtCd,EAsCkC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAtClC,EAsCsD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAtCtD,EAsC0E,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAtC1E,EAuCN,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCM,EAuCc,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCd,EAuCkC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvClC,EAuCsD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCtD,EAuC0E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvC1E,EAwCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCM,EAwCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCf,EAwCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCpC,EAwCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCzD,EAwC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxC9E,EAyCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCM,EAyCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCf,EAyCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCpC,EAyCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCzD,EAyC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzC9E,EA0CN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1CM,EA0Ce,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1Cf,EA0CoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1CpC,EA0CyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1CzD,EA0C8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1C9E,EA2CN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3CM,EA2Ce,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3Cf,EA2CoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3CpC,EA2CyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3CzD,EA2C8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3C9E,EA4CN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA5CM,EA4Ce,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5Cf,EA4CqC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5CrC,EA4C2D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5C3D,EA4CiF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5CjF,EA6CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7CM,EA6CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7ChB,EA6CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7CtC,EA6C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7C5D,EA6CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7ClF,EA8CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9CM,EA8CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9ChB,EA8CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9CtC,EA8C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9C5D,EA8CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9ClF,EA+CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/CM,EA+CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/ChB,EA+CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/CtC,EA+C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/C5D,EA+CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/ClF,EAgDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDM,EAgDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDhB,EAgDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDtC,EAgD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhD5D,EAgDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDlF,EAiDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDM,EAiDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDhB,EAiDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDtC,EAiD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjD5D,EAiDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDlF,EAkDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDM,EAkDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDhB,EAkDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDtC,EAkD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlD5D,EAkDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDlF,EAmDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDM,EAmDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDhB,EAmDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDtC,EAmD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnD5D,EAmDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDlF,EAoDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApDM;AAHD,GADW;AA2DpBC,OAAK;AACHH,UAAM,KADH;AAEHI,eAAW,GAFR;AAGHF,YAAQ,CACN,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADM,EACU,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADV,EAC0B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1B,EAC0C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1C,EAC0D,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1D,EAEN,CAAC,CAAD,EAAI,EAAJ,EAAQ,CAAR,EAAW,GAAX,CAFM,EAEW,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAFX,EAE6B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAF7B,EAE+C,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAF/C,EAEiE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAFjE,EAGN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAHM,EAGY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAHZ,EAG8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAH9B,EAGgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAHhD,EAGkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAHlE,EAIN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAJM,EAIY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAJZ,EAI8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAJ9B,EAIgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAJhD,EAIkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAJlE,EAKN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CALM,EAKY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CALZ,EAK8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAL9B,EAKgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CALhD,EAKkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CALlE,EAMN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CANM,EAMY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CANZ,EAM8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAN9B,EAMgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CANhD,EAMkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CANlE,EAON,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAPM,EAOY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAPZ,EAO8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAP9B,EAOgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAPhD,EAOkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAPlE,EAQN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CARM,EAQY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CARZ,EAQ8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAR9B,EAQgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CARhD,EAQkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CARlE,EASN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CATM,EASY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CATZ,EAS8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAT9B,EASgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAThD,EASkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CATlE,EAUN,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAVM,EAUY,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAVZ,EAU8B,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAV9B,EAUgD,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAVhD,EAUkE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,GAAZ,CAVlE,EAWN,CAAC,CAAD,EAAI,GAAJ,EAAS,EAAT,EAAa,GAAb,CAXM,EAWa,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAXb,EAWiC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAXjC,EAWqD,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAXrD,EAWyE,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAXzE,EAYN,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAZM,EAYc,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAZd,EAYkC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAZlC,EAYsD,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAZtD,EAY0E,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAZ1E,EAaN,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAbM,EAac,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAbd,EAakC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAblC,EAasD,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAbtD,EAa0E,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAb1E,EAcN,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAdM,EAcc,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAdd,EAckC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAdlC,EAcsD,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,EAAc,GAAd,CAdtD,EAc0E,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAd1E,EAeN,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAfM,EAee,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAff,EAeoC,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAfpC,EAeyD,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAfzD,EAe8E,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAf9E,EAgBN,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAhBM,EAgBe,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAhBf,EAgBoC,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,CAhBpC,EAgByD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAhBzD,EAgB6E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAhB7E,EAiBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAjBM,EAiBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAjBd,EAiBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAjBlC,EAiBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAjBtD,EAiB0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAjB1E,EAkBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAlBM,EAkBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAlBd,EAkBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAlBlC,EAkBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAlBtD,EAkB0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAlB1E,EAmBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAnBM,EAmBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAnBd,EAmBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAnBlC,EAmBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAnBtD,EAmB0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAnB1E,EAoBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CApBM,EAoBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CApBd,EAoBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CApBlC,EAoBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CApBtD,EAoB0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CApB1E,EAqBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CArBM,EAqBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CArBd,EAqBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CArBlC,EAqBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CArBtD,EAqB0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CArB1E,EAsBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAtBM,EAsBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAtBd,EAsBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAtBlC,EAsBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAtBtD,EAsB0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAtB1E,EAuBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAvBM,EAuBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAvBd,EAuBkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAvBlC,EAuBsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAvBtD,EAuB0E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAvB1E,EAwBN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAxBM,EAwBe,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAxBf,EAwBoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAxBpC,EAwByD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAxBzD,EAwB8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAxB9E,EAyBN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAzBM,EAyBe,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAzBf,EAyBoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAzBpC,EAyByD,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CAzBzD,EAyB6E,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CAzB7E,EA0BN,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA1BM,EA0Bc,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA1Bd,EA0BkC,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA1BlC,EA0BsD,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA1BtD,EA0B0E,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA1B1E,EA2BN,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA3BM,EA2Bc,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA3Bd,EA2BkC,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CA3BlC,EA2BsD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA3BtD,EA2B2E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA3B3E,EA4BN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA5BM,EA4Be,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA5Bf,EA4BoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA5BpC,EA4ByD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA5BzD,EA4B8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA5B9E,EA6BN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA7BM,EA6Be,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA7Bf,EA6BoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA7BpC,EA6ByD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA7BzD,EA6B8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA7B9E,EA8BN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA9BM,EA8Be,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA9Bf,EA8BoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA9BpC,EA8ByD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA9BzD,EA8B8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA9B9E,EA+BN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA/BM,EA+Be,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA/Bf,EA+BoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA/BpC,EA+ByD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA/BzD,EA+B8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA/B9E,EAgCN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAhCM,EAgCe,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAhCf,EAgCoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAhCpC,EAgCyD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAhCzD,EAgC8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAhC9E,EAiCN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAjCM,EAiCe,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAjCf,EAiCoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAjCpC,EAiCyD,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAjCzD,EAiC8E,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAjC9E,EAkCN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAlCM,EAkCe,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAlCf,EAkCoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CAlCpC,EAkCyD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAlCzD,EAkC6E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAlC7E,EAmCN,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAnCM,EAmCc,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAnCd,EAmCkC,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAnClC,EAmCsD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAnCtD,EAmC0E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CAnC1E,EAoCN,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CApCM,EAoCc,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CApCd,EAoCkC,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CApClC,EAoCsD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCtD,EAoC2E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApC3E,EAqCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCM,EAqCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCf,EAqCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCpC,EAqCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCzD,EAqC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArC9E,EAsCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCM,EAsCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCf,EAsCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCpC,EAsCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCzD,EAsC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtC9E,EAuCN,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCM,EAuCc,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCd,EAuCkC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvClC,EAuCsD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCtD,EAuC0E,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvC1E,EAwCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCM,EAwCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCf,EAwCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCpC,EAwCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCzD,EAwC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxC9E,EAyCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCM,EAyCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCf,EAyCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCpC,EAyCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCzD,EAyC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzC9E,EA0CN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1CM,EA0Ce,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1Cf,EA0CoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1CpC,EA0CyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1CzD,EA0C8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA1C9E,EA2CN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3CM,EA2Ce,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3Cf,EA2CoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3CpC,EA2CyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3CzD,EA2C8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA3C9E,EA4CN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA5CM,EA4Ce,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA5Cf,EA4CoC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5CpC,EA4C0D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5C1D,EA4CgF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5ChF,EA6CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7CM,EA6CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7ChB,EA6CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7CtC,EA6C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7C5D,EA6CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7ClF,EA8CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9CM,EA8CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9ChB,EA8CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9CtC,EA8C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9C5D,EA8CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9ClF,EA+CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/CM,EA+CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/ChB,EA+CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/CtC,EA+C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/C5D,EA+CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/ClF,EAgDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDM,EAgDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDhB,EAgDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDtC,EAgD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhD5D,EAgDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDlF,EAiDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDM,EAiDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDhB,EAiDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDtC,EAiD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjD5D,EAiDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDlF,EAkDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDM,EAkDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDhB,EAkDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDtC,EAkD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlD5D,EAkDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDlF,EAmDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDM,EAmDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDhB,EAmDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDtC,EAmD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnD5D,EAmDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDlF,EAoDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApDM;AAHL,GA3De;AAqHpBG,gBAAc;AACZL,UAAM,gBADM;AAEZI,eAAW,GAFC;AAGZF,YAAQ,CACN,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADM,EACU,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADV,EAC0B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1B,EAC0C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1C,EAC0D,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1D,EAEN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAFM,EAEW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAFX,EAE4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAF5B,EAE6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAF7C,EAE8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAF9D,EAGN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAHM,EAGW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAHX,EAG4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAH5B,EAG6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAH7C,EAG8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAH9D,EAIN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAJM,EAIW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAJX,EAI4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAJ5B,EAI6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAJ7C,EAI8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAJ9D,EAKN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CALM,EAKW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CALX,EAK4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAL5B,EAK6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAL7C,EAK8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAL9D,EAMN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CANM,EAMW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CANX,EAM4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAN5B,EAM6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAN7C,EAM8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAN9D,EAON,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAPM,EAOW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAPX,EAO4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAP5B,EAO6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAP7C,EAO8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAP9D,EAQN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CARM,EAQW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CARX,EAQ4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAR5B,EAQ6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAR7C,EAQ8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAR9D,EASN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CATM,EASW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CATX,EAS4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAT5B,EAS6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAT7C,EAS8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAT9D,EAUN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAVM,EAUW,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAVX,EAU4B,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAV5B,EAU6C,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAV7C,EAU8D,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAV9D,EAWN,CAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAW,GAAX,CAXM,EAWW,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAXX,EAW6B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAX7B,EAW+C,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAX/C,EAWiE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAXjE,EAYN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAZM,EAYY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAZZ,EAY8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAZ9B,EAYgD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAZhD,EAYkE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAZlE,EAaN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAbM,EAaY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAbZ,EAa8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAb9B,EAagD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAbhD,EAakE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAblE,EAcN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAdM,EAcY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAdZ,EAc8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAd9B,EAcgD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAdhD,EAckE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAdlE,EAeN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAfM,EAeY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAfZ,EAe8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAf9B,EAegD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAfhD,EAekE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAflE,EAgBN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAhBM,EAgBY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAhBZ,EAgB8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAhB9B,EAgBgD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAhBhD,EAgBkE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAhBlE,EAiBN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAjBM,EAiBY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAjBZ,EAiB8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAjB9B,EAiBgD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAjBhD,EAiBkE,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAjBlE,EAkBN,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAlBM,EAkBY,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAlBZ,EAkB8B,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAlB9B,EAkBgD,CAAC,CAAD,EAAI,CAAJ,EAAO,GAAP,EAAY,GAAZ,CAlBhD,EAkBkE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAlBlE,EAmBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAnBM,EAmBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAnBb,EAmBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAnBhC,EAmBmD,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAnBnD,EAmBsE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAnBtE,EAoBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CApBM,EAoBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CApBb,EAoBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CApBhC,EAoBmD,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CApBnD,EAoBsE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CApBtE,EAqBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CArBM,EAqBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CArBb,EAqBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CArBhC,EAqBmD,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CArBnD,EAqBsE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CArBtE,EAsBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAtBM,EAsBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAtBb,EAsBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAtBhC,EAsBmD,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAtBnD,EAsBsE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAtBtE,EAuBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAvBM,EAuBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAvBb,EAuBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAvBhC,EAuBmD,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAvBnD,EAuBsE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAvBtE,EAwBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAxBM,EAwBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAxBb,EAwBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAxBhC,EAwBmD,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAxBnD,EAwBsE,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAxBtE,EAyBN,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAzBM,EAyBa,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAzBb,EAyBgC,CAAC,EAAD,EAAK,CAAL,EAAQ,GAAR,EAAa,GAAb,CAzBhC,EAyBmD,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CAzBnD,EAyBuE,CAAC,GAAD,EAAM,CAAN,EAAS,GAAT,EAAc,GAAd,CAzBvE,EA0BN,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA1BM,EA0Be,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA1Bf,EA0BoC,CAAC,GAAD,EAAM,EAAN,EAAU,GAAV,EAAe,GAAf,CA1BpC,EA0ByD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA1BzD,EA0B6E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA1B7E,EA2BN,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA3BM,EA2Bc,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA3Bd,EA2BkC,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA3BlC,EA2BsD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA3BtD,EA2B0E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA3B1E,EA4BN,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA5BM,EA4Bc,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA5Bd,EA4BkC,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA5BlC,EA4BsD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA5BtD,EA4B0E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA5B1E,EA6BN,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA7BM,EA6Bc,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA7Bd,EA6BkC,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA7BlC,EA6BsD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA7BtD,EA6B0E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA7B1E,EA8BN,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA9BM,EA8Bc,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA9Bd,EA8BkC,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA9BlC,EA8BsD,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA9BtD,EA8B0E,CAAC,GAAD,EAAM,EAAN,EAAU,EAAV,EAAc,GAAd,CA9B1E,EA+BN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BM,EA+Ba,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/Bb,EA+BgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BhC,EA+BmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BnD,EA+BsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA/BtE,EAgCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCM,EAgCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCb,EAgCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhChC,EAgCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCnD,EAgCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAhCtE,EAiCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCM,EAiCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCb,EAiCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjChC,EAiCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCnD,EAiCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAjCtE,EAkCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCM,EAkCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCb,EAkCgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlChC,EAkCmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCnD,EAkCsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAlCtE,EAmCN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnCM,EAmCa,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAnCb,EAmCgC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAnChC,EAmCoD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAnCpD,EAmCwE,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAnCxE,EAoCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCM,EAoCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCf,EAoCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCpC,EAoCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCzD,EAoC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApC9E,EAqCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCM,EAqCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCf,EAqCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCpC,EAqCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCzD,EAqC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArC9E,EAsCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCM,EAsCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCf,EAsCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCpC,EAsCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCzD,EAsC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtC9E,EAuCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvCM,EAuCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvCf,EAuCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvCpC,EAuCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvCzD,EAuC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvC9E,EAwCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCM,EAwCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCf,EAwCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCpC,EAwCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxCzD,EAwC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAxC9E,EAyCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCM,EAyCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCf,EAyCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCpC,EAyCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAzCzD,EAyC8E,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAzC9E,EA0CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA1CM,EA0CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA1ChB,EA0CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA1CtC,EA0C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA1C5D,EA0CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA1ClF,EA2CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA3CM,EA2CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA3ChB,EA2CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA3CtC,EA2C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA3C5D,EA2CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA3ClF,EA4CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5CM,EA4CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5ChB,EA4CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5CtC,EA4C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5C5D,EA4CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA5ClF,EA6CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7CM,EA6CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7ChB,EA6CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7CtC,EA6C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7C5D,EA6CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA7ClF,EA8CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9CM,EA8CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9ChB,EA8CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9CtC,EA8C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9C5D,EA8CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA9ClF,EA+CN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/CM,EA+CgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/ChB,EA+CsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/CtC,EA+C4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/C5D,EA+CkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CA/ClF,EAgDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDM,EAgDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDhB,EAgDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDtC,EAgD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhD5D,EAgDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhDlF,EAiDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDM,EAiDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDhB,EAiDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDtC,EAiD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjD5D,EAiDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDlF,EAkDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDM,EAkDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDhB,EAkDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDtC,EAkD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlD5D,EAkDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDlF,EAmDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDM,EAmDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDhB,EAmDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDtC,EAmD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnD5D,EAmDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDlF,EAoDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApDM;AAHI,GArHM;AA+KpBI,aAAW;AACTN,UAAM,aADG;AAETI,eAAW,GAFF;AAGTF,YAAQ,CACN,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADM,EACU,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CADV,EAC0B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1B,EAC0C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1C,EAC0D,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAD1D,EAEN,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAFM,EAEU,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAFV,EAE0B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAF1B,EAE0C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAF1C,EAE0D,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAF1D,EAGN,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAHM,EAGU,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAHV,EAG0B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAH1B,EAG0C,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAH1C,EAG4D,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAH5D,EAIN,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAJM,EAIY,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAJZ,EAI8B,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAJ9B,EAIgD,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAJhD,EAIkE,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAJlE,EAKN,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CALM,EAKY,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CALZ,EAK8B,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CAL9B,EAKgD,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CALhD,EAKkE,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CALlE,EAMN,CAAC,EAAD,EAAK,CAAL,EAAQ,EAAR,EAAY,GAAZ,CANM,EAMY,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CANZ,EAM+B,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAN/B,EAMkD,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CANlD,EAMqE,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CANrE,EAON,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAPM,EAOa,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAPb,EAOgC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAPhC,EAOmD,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAPnD,EAOsE,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAPtE,EAQN,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CARM,EAQa,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CARb,EAQgC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CARhC,EAQmD,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CARnD,EAQsE,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CARtE,EASN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CATM,EASc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CATd,EASkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CATlC,EASsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CATtD,EAS0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAT1E,EAUN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAVM,EAUc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAVd,EAUkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAVlC,EAUsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAVtD,EAU0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAV1E,EAWN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAXM,EAWc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAXd,EAWkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAXlC,EAWsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAXtD,EAW0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAX1E,EAYN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAZM,EAYc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAZd,EAYkC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAZlC,EAYsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAZtD,EAY0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAZ1E,EAaN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAbM,EAac,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAbd,EAakC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAblC,EAasD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAbtD,EAa0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAb1E,EAcN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAdM,EAcc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAdd,EAckC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAdlC,EAcsD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAdtD,EAc0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAd1E,EAeN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAfM,EAec,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAfd,EAekC,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAflC,EAesD,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAftD,EAe0E,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAf1E,EAgBN,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAhBM,EAgBc,CAAC,EAAD,EAAK,EAAL,EAAS,GAAT,EAAc,GAAd,CAhBd,EAgBkC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhBlC,EAgBwD,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhBxD,EAgB8E,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAhB9E,EAiBN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjBM,EAiBgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjBhB,EAiBsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjBtC,EAiB4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjB5D,EAiBkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjBlF,EAkBN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlBM,EAkBgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlBhB,EAkBsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlBtC,EAkB4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlB5D,EAkBkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlBlF,EAmBN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnBM,EAmBgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnBhB,EAmBsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnBtC,EAmB4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnB5D,EAmBkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnBlF,EAoBN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApBM,EAoBgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApBhB,EAoBsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApBtC,EAoB4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApB5D,EAoBkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApBlF,EAqBN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CArBM,EAqBgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CArBhB,EAqBsC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CArBtC,EAqByD,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CArBzD,EAqB4E,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CArB5E,EAsBN,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAtBM,EAsBa,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAtBb,EAsBgC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAtBhC,EAsBmD,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAtBnD,EAsBsE,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAtBtE,EAuBN,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAvBM,EAuBa,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAvBb,EAuBgC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAvBhC,EAuBmD,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAvBnD,EAuBsE,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,GAAb,CAvBtE,EAwBN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAxBM,EAwBc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAxBd,EAwBkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAxBlC,EAwBsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAxBtD,EAwB0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAxB1E,EAyBN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAzBM,EAyBc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAzBd,EAyBkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAzBlC,EAyBsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAzBtD,EAyB0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CAzB1E,EA0BN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA1BM,EA0Bc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA1Bd,EA0BkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA1BlC,EA0BsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA1BtD,EA0B0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA1B1E,EA2BN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA3BM,EA2Bc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA3Bd,EA2BkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA3BlC,EA2BsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA3BtD,EA2B0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA3B1E,EA4BN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA5BM,EA4Bc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA5Bd,EA4BkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA5BlC,EA4BsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA5BtD,EA4B0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA5B1E,EA6BN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA7BM,EA6Bc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA7Bd,EA6BkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA7BlC,EA6BsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA7BtD,EA6B0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA7B1E,EA8BN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA9BM,EA8Bc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA9Bd,EA8BkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA9BlC,EA8BsD,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA9BtD,EA8B0E,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA9B1E,EA+BN,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA/BM,EA+Bc,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA/Bd,EA+BkC,CAAC,EAAD,EAAK,GAAL,EAAU,EAAV,EAAc,GAAd,CA/BlC,EA+BsD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA/BtD,EA+B2E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CA/B3E,EAgCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAhCM,EAgCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAhCf,EAgCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAhCpC,EAgCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAhCzD,EAgC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAhC9E,EAiCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAjCM,EAiCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAjCf,EAiCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAjCpC,EAiCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAjCzD,EAiC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAjC9E,EAkCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAlCM,EAkCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAlCf,EAkCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAlCpC,EAkCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAlCzD,EAkC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAlC9E,EAmCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAnCM,EAmCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAnCf,EAmCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAnCpC,EAmCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAnCzD,EAmC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAnC9E,EAoCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCM,EAoCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCf,EAoCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCpC,EAoCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApCzD,EAoC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CApC9E,EAqCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCM,EAqCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCf,EAqCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCpC,EAqCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArCzD,EAqC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CArC9E,EAsCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCM,EAsCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCf,EAsCoC,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCpC,EAsCyD,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtCzD,EAsC8E,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAtC9E,EAuCN,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvCM,EAuCe,CAAC,GAAD,EAAM,GAAN,EAAW,EAAX,EAAe,GAAf,CAvCf,EAuCoC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCpC,EAuCwD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvCxD,EAuC4E,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAvC5E,EAwCN,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAxCM,EAwCc,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAxCd,EAwCkC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAxClC,EAwCsD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAxCtD,EAwC0E,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAxC1E,EAyCN,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAzCM,EAyCc,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAzCd,EAyCkC,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAzClC,EAyCsD,CAAC,GAAD,EAAM,GAAN,EAAW,CAAX,EAAc,GAAd,CAzCtD,EAyC0E,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CAzC1E,EA0CN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA1CM,EA0Ca,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA1Cb,EA0CgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA1ChC,EA0CmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA1CnD,EA0CsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA1CtE,EA2CN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3CM,EA2Ca,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3Cb,EA2CgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3ChC,EA2CmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3CnD,EA2CsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA3CtE,EA4CN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5CM,EA4Ca,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5Cb,EA4CgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5ChC,EA4CmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5CnD,EA4CsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA5CtE,EA6CN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7CM,EA6Ca,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7Cb,EA6CgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7ChC,EA6CmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7CnD,EA6CsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA7CtE,EA8CN,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9CM,EA8Ca,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9Cb,EA8CgC,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9ChC,EA8CmD,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9CnD,EA8CsE,CAAC,GAAD,EAAM,EAAN,EAAU,CAAV,EAAa,GAAb,CA9CtE,EA+CN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA/CM,EA+CY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA/CZ,EA+C8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA/C9B,EA+CgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA/ChD,EA+CkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CA/ClE,EAgDN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhDM,EAgDY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhDZ,EAgD8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhD9B,EAgDgD,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhDhD,EAgDkE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAhDlE,EAiDN,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjDM,EAiDY,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjDZ,EAiD8B,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAjD9B,EAiDgD,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDhD,EAiDsE,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAjDtE,EAkDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDM,EAkDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDhB,EAkDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDtC,EAkD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlD5D,EAkDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAlDlF,EAmDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDM,EAmDgB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDhB,EAmDsC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDtC,EAmD4D,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnD5D,EAmDkF,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAnDlF,EAoDN,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CApDM;AAHC,GA/KS;AAyOpBK,QAAM;AACJP,UAAM,MADF;AAEJI,eAAW,GAFP;AAGJI,WAAO,CAHH;AAIJC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ;AAHO;AAJX,GAzOc;AAmPpBC,OAAK;AACHb,UAAM,KADH;AAEHI,eAAW,GAFR;AAGHI,WAAO,CAHJ;AAIHC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAAZ,EAA0B,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAA1B,EAAwC,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAAxC,EAAsD,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAtD,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,KAAD,EAAQ,CAAR,EAAW,CAAX,CAAZ,EAA2B,CAAC,KAAD,EAAQ,CAAR,EAAW,CAAX,CAA3B,EAA0C,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAA1C,EAAwD,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAAxD,EAAsE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAtE,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAD,EAAgB,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAAhB,EAA8B,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAA9B,EAA4C,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAA5C,EAA0D,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAA1D;AAHO;AAJZ,GAnPe;AA6PpBE,OAAK;AACHd,UAAM,KADH;AAEHI,eAAW,GAFR;AAGHI,WAAO,CAHJ;AAIHC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAAZ,EAA8B,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAA9B,EACH,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CADG,EAC6B,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAD7B,EAC+C,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAD/C,EAEH,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAFG,EAE6B,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAF7B,EAGH,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAHG,EAGe,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAHf,CADQ;AAKbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAAZ,EAA4C,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAA5C,EACL,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CADK,EACa,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CADb,EAEL,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAFK,EAEa,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAFb,CALM;AAQbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAAZ,EAA8B,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAA9B,EACJ,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CADI,EACc,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CADd,EACgC,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CADhC,EAEJ,CAAC,CAAD,EAAI,OAAJ,EAAa,OAAb,CAFI;AARO;AAJZ,GA7Pe;AA8QpBG,OAAK;AACHf,UAAM,KADH;AAEHI,eAAW,GAFR;AAGHI,WAAO,CAHJ;AAIHC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,MAAJ,EAAY,MAAZ,CAAD,EAAsB,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAAtB,EAAwC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAxC,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAAZ,EAA8B,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAA9B,EAAgD,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAhD,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAAZ,EAA8B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAA9B;AAHO;AAJZ,GA9Qe;AAwRpBI,QAAM;AACJhB,UAAM,MADF;AAEJI,eAAW,GAFP;AAGJI,WAAO,CAHH;AAIJC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ;AAHO;AAJX,GAxRc;AAkSpBK,UAAQ;AACNjB,UAAM,QADA;AAENI,eAAW,GAFL;AAGNI,WAAO,CAHD;AAINC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ;AAHO;AAJT,GAlSY;AA4SpBM,UAAQ;AACNlB,UAAM,QADA;AAENI,eAAW,GAFL;AAGNI,WAAO,CAHD;AAINC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAD,EAAgB,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAhB,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAD,EAAgB,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAhB;AAHO;AAJT,GA5SY;AAsTpBO,UAAQ;AACNnB,UAAM,QADA;AAENI,eAAW,GAFL;AAGNI,WAAO,CAHD;AAINC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ;AAHO;AAJT,GAtTY;AAgUpBQ,UAAQ;AACNpB,UAAM,QADA;AAENI,eAAW,GAFL;AAGNI,WAAO,CAHD;AAINC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAZ,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,GAAJ,EAAS,GAAT,CAAZ;AAHO;AAJT,GAhUY;AA0UpBS,QAAM;AACJrB,UAAM,MADF;AAEJI,eAAW,GAFP;AAGJI,WAAO,CAHH;AAIJC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAAZ,EAA4C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAA5C,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAAZ,EAA4C,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAA5C,EAA4E,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAA5E,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,CAAZ,EAA4C,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAA5C;AAHO;AAJX,GA1Uc;AAoVpBU,UAAQ;AACNtB,UAAM,QADA;AAENI,eAAW,GAFL;AAGNI,WAAO,CAHD;AAINC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,QAAD,EAAW,CAAX,EAAc,CAAd,CAAZ,EAA8B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAA9B,CADQ;AAEbC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,MAAJ,EAAY,MAAZ,CAAZ,CAFM;AAGbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,CAAD,EAAI,MAAJ,EAAY,MAAZ,CAAZ;AAHO;AAJT,GApVY;AA8VpBW,YAAU;AACRvB,UAAM,UADE;AAERI,eAAW,GAFH;AAGRI,WAAO,CAHC;AAIRC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAAZ,EAAoC,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAApC,EAA4D,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAA5D,EACH,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CADG,EACW,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CADX,EACyB,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CADzB,EACuC,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CADvC,EAEH,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAFG,EAEW,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAFX,EAEyB,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAFzB,EAEuC,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAFvC,EAGH,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHG,EAGW,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAHX,EAGmC,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAHnC,EAG2D,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAH3D,EAIH,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAJG,EAIW,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAJX,EAIyB,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAJzB,EAIiD,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CAJjD,EAKH,CAAC,CAAD,EAAI,IAAJ,EAAU,IAAV,CALG,CADQ;AAObC,aAAO,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAAZ,EAA0B,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAA1B,EAAwC,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAAxC,EACL,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CADK,EACS,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CADT,EACiC,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CADjC,EAEL,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAFK,EAEmB,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAFnB,EAE2C,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAF3C,EAGL,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAHK,EAGmB,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAHnB,EAG2C,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAH3C,EAGyD,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHzD,EAIL,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAJK,EAImB,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAJnB,EAKL,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CALK,EAKmB,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CALnB,EAML,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CANK,EAMS,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CANT,EAMuB,CAAC,CAAD,EAAI,IAAJ,EAAU,IAAV,CANvB,CAPM;AAcbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAAZ,EAAoC,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAApC,EAA4D,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAA5D,EACJ,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CADI,EACoB,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CADpB,EAC4C,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAD5C,EAEJ,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAFI,EAEoB,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,CAFpB,EAE4C,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAF5C,EAGJ,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,CAHI,EAGS,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHT,EAGuB,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHvB,EAGqC,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHrC,EAGmD,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHnD,EAGiE,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAHjE,EAIJ,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAJI,EAIU,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAJV,EAIwB,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAJxB,EAIsC,CAAC,IAAD,EAAO,CAAP,EAAU,CAAV,CAJtC,EAIoD,CAAC,CAAD,EAAI,IAAJ,EAAU,IAAV,CAJpD;AAdO;AAJP,GA9VU;AAuXpBY,YAAU;AACRxB,UAAM,UADE;AAERI,eAAW,GAFH;AAGRI,WAAO,CAHC;AAIRC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,SAAJ,EAAe,SAAf,CAAD,EAA4B,CAAC,OAAD,EAAU,UAAV,EAAsB,UAAtB,CAA5B,EACH,CAAC,MAAD,EAAS,UAAT,EAAqB,UAArB,CADG,EAC+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAD/B,EAEH,CAAC,KAAD,EAAQ,UAAR,EAAoB,UAApB,CAFG,EAE8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAF9B,EAGH,CAAC,MAAD,EAAS,UAAT,EAAqB,UAArB,CAHG,EAG+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAH/B,EAIH,CAAC,IAAD,EAAO,WAAP,EAAoB,WAApB,CAJG,EAI+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAJ/B,EAKH,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CALG,EAKiC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CALjC,EAMH,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CANG,EAMgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CANhC,EAOH,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAPG,EAOiC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAPjC,EAQH,CAAC,GAAD,EAAM,WAAN,EAAmB,WAAnB,CARG,EAQ8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAR9B,EASH,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CATG,EASiC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CATjC,EAUH,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAVG,EAUgC,CAAC,OAAD,EAAU,UAAV,EAAsB,UAAtB,CAVhC,EAWH,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAXG,EAWiC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAXjC,EAYH,CAAC,IAAD,EAAO,WAAP,EAAoB,WAApB,CAZG,EAY+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAZ/B,EAaH,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAbG,EAaiC,CAAC,OAAD,EAAU,UAAV,EAAsB,UAAtB,CAbjC,EAcH,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAdG,EAcgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAdhC,EAeH,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAfG,EAeiC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAfjC,EAgBH,CAAC,CAAD,EAAI,WAAJ,EAAiB,WAAjB,CAhBG,CADQ;AAkBbC,aAAO,CAAC,CAAC,CAAD,EAAI,WAAJ,EAAiB,WAAjB,CAAD,EAAgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAAhC,EACL,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CADK,EAC+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAD/B,EAEL,CAAC,KAAD,EAAQ,UAAR,EAAoB,UAApB,CAFK,EAE4B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAF5B,EAGL,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAHK,EAG+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAH/B,EAIL,CAAC,IAAD,EAAO,WAAP,EAAoB,WAApB,CAJK,EAI6B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAJ7B,EAKL,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CALK,EAK+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAL/B,EAML,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CANK,EAM8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAN9B,EAOL,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAPK,EAO+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAP/B,EAQL,CAAC,GAAD,EAAM,UAAN,EAAkB,UAAlB,CARK,EAQ0B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAR1B,EASL,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CATK,EAS+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAT/B,EAUL,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAVK,EAU8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAV9B,EAWL,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAXK,EAW+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAX/B,EAYL,CAAC,IAAD,EAAO,WAAP,EAAoB,WAApB,CAZK,EAY6B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAZ7B,EAaL,CAAC,MAAD,EAAS,UAAT,EAAqB,UAArB,CAbK,EAa6B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAb7B,EAcL,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAdK,EAc8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAd9B,EAeL,CAAC,MAAD,EAAS,UAAT,EAAqB,UAArB,CAfK,EAe6B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAf7B,EAgBL,CAAC,CAAD,EAAI,UAAJ,EAAgB,UAAhB,CAhBK,CAlBM;AAmCbC,YAAM,CAAC,CAAC,CAAD,EAAI,WAAJ,EAAiB,WAAjB,CAAD,EAAgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAAhC,EACJ,CAAC,MAAD,EAAS,UAAT,EAAqB,UAArB,CADI,EAC8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAD9B,EAEJ,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAFI,EAE+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAF/B,EAGJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAHI,EAGgC,CAAC,OAAD,EAAU,UAAV,EAAsB,UAAtB,CAHhC,EAIJ,CAAC,IAAD,EAAO,WAAP,EAAoB,WAApB,CAJI,EAI8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAJ9B,EAKJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CALI,EAKgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CALhC,EAMJ,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CANI,EAM+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAN/B,EAOJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAPI,EAOgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAPhC,EAQJ,CAAC,GAAD,EAAM,WAAN,EAAmB,WAAnB,CARI,EAQ6B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAR7B,EASJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CATI,EASgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAThC,EAUJ,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAVI,EAU+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAV/B,EAWJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAXI,EAWgC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAXhC,EAYJ,CAAC,IAAD,EAAO,WAAP,EAAoB,WAApB,CAZI,EAY8B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAZ9B,EAaJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAbI,EAagC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAbhC,EAcJ,CAAC,KAAD,EAAQ,WAAR,EAAqB,WAArB,CAdI,EAc+B,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAd/B,EAeJ,CAAC,MAAD,EAAS,WAAT,EAAsB,WAAtB,CAfI,EAegC,CAAC,OAAD,EAAU,WAAV,EAAuB,WAAvB,CAfhC,EAgBJ,CAAC,CAAD,EAAI,WAAJ,EAAiB,WAAjB,CAhBI;AAnCO;AAJP,GAvXU;AAibpBa,SAAO;AACLzB,UAAM,OADD;AAELI,eAAW,GAFN;AAGLI,WAAO,CAHF;AAILC,mBAAe;AACbC,WAAK,CAAC,CAAC,CAAD,EAAI,kBAAJ,EAAwB,kBAAxB,CAAD,EAA8C,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAA9C,EACH,CAAC,IAAD,EAAO,kBAAP,EAA2B,kBAA3B,CADG,EAC6C,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAD7C,EAEH,CAAC,GAAD,EAAM,mBAAN,EAA2B,mBAA3B,CAFG,EAE8C,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAF9C,EAGH,CAAC,IAAD,EAAO,mBAAP,EAA4B,mBAA5B,CAHG,EAG+C,CAAC,KAAD,EAAQ,oBAAR,EAA8B,oBAA9B,CAH/C,EAIH,CAAC,CAAD,EAAI,oBAAJ,EAA0B,oBAA1B,CAJG,CADQ;AAMbC,aAAO,CAAC,CAAC,CAAD,EAAI,kBAAJ,EAAwB,kBAAxB,CAAD,EAA8C,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAA9C,EACL,CAAC,IAAD,EAAO,mBAAP,EAA4B,mBAA5B,CADK,EAC6C,CAAC,KAAD,EAAQ,kBAAR,EAA4B,kBAA5B,CAD7C,EAEL,CAAC,GAAD,EAAM,mBAAN,EAA2B,mBAA3B,CAFK,EAE4C,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAF5C,EAGL,CAAC,IAAD,EAAO,mBAAP,EAA4B,mBAA5B,CAHK,EAG6C,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAH7C,EAIL,CAAC,CAAD,EAAI,mBAAJ,EAAyB,mBAAzB,CAJK,CANM;AAWbC,YAAM,CAAC,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAD,EAAY,CAAC,KAAD,EAAQ,kBAAR,EAA4B,kBAA5B,CAAZ,EAA6D,CAAC,IAAD,EAAO,mBAAP,EAA4B,mBAA5B,CAA7D,EACJ,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CADI,EAC+C,CAAC,GAAD,EAAM,mBAAN,EAA2B,mBAA3B,CAD/C,EAEJ,CAAC,KAAD,EAAQ,kBAAR,EAA4B,kBAA5B,CAFI,EAE6C,CAAC,IAAD,EAAO,mBAAP,EAA4B,mBAA5B,CAF7C,EAGJ,CAAC,KAAD,EAAQ,mBAAR,EAA6B,mBAA7B,CAHI,EAG+C,CAAC,CAAD,EAAI,mBAAJ,EAAyB,mBAAzB,CAH/C;AAXO;AAJV;AAjba,CAAtB;;AAwcA;AACA;AACA,SAASc,QAAT,CAAmBC,CAAnB,EAAsBC,CAAtB,EAAyBC,CAAzB,EAA4B;AAC1BA,MAAIA,MAAM,IAAN,GAAa,GAAb,GAAmBA,CAAvB;;AAEA,MAAMC,YAAY,CAACF,IAAID,CAAL,KAAWE,IAAI,CAAf,CAAlB;AACA,MAAME,SAAS,EAAf;;AAEA,SAAOF,MAAM,CAAb,EAAgB;AACdE,WAAO5O,IAAP,CAAYwO,CAAZ;AACAA,SAAKG,SAAL;AACD;;AAED;AACA;AACAC,SAAOA,OAAO9O,MAAP,GAAgB,CAAvB,IAA4B2O,CAA5B;;AAEA,SAAOG,MAAP;AACD;;AAED;AACA,SAASC,OAAT,CAAkBC,KAAlB,EAAyBC,IAAzB,EAA+B;AAC7B,MAAIC,OAAO,CAAX;AACA,MAAIC,QAAQH,MAAMhP,MAAN,GAAe,CAA3B;;AAEA,SAAOkP,QAAQC,KAAf,EAAsB;AACpB,QAAMC,MAAMF,OAAO3L,KAAK8L,KAAL,CAAW,CAACF,QAAQD,IAAT,IAAiB,CAA5B,CAAnB;AACA,QAAMI,UAAUN,MAAMI,GAAN,CAAhB;;AAEA,QAAIE,YAAYL,IAAhB,EAAsB;AACpB,aAAOG,GAAP;AACD,KAFD,MAEO,IAAIH,OAAOK,OAAX,EAAoB;AACzBH,cAAQC,MAAM,CAAd;AACD,KAFM,MAEA;AACLF,aAAOE,MAAM,CAAb;AACD;AACF;;AAED,SAAOF,IAAP;AACD;;AAED;AACA;AACA;AACA,SAASK,YAAT,CAAuBC,UAAvB,EAAmCC,MAAnC,EAA2C;AACzC,MAAI1P,UAAJ;AACA,MAAM2P,UAAU,EAAhB;AACA,MAAMC,MAAMF,OAAOzP,MAAnB;;AAEAwP,aAAWI,IAAX,CAAgB,UAAUlB,CAAV,EAAaC,CAAb,EAAgB;AAC9B,WAAOD,IAAIC,CAAX;AACD,GAFD;;AAIA,OAAK5O,IAAI,CAAT,EAAYA,IAAI4P,GAAhB,EAAqB5P,GAArB,EAA0B;AACxB2P,YAAQ3P,CAAR,IAAagP,QAAQS,UAAR,EAAoBC,OAAO1P,CAAP,CAApB,CAAb;AACD;;AAED,SAAO2P,OAAP;AACD;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASG,gBAAT,CAA2BC,CAA3B,EAA8B/K,IAA9B,EAAoCwI,KAApC,EAA2C;AACzC,MAAIxN,UAAJ;AACA,MAAMoC,IAAI,EAAV;AACA,MAAM4N,KAAK,EAAX;AACA,MAAMC,KAAK,EAAX;AACA,MAAM/J,MAAM,EAAZ;;AAEAsH,UAAQA,UAAU,IAAV,GAAiB,CAAjB,GAAqBA,KAA7B;;AAEA,OAAKxN,IAAI,CAAT,EAAYA,IAAIgF,KAAK/E,MAArB,EAA6BD,GAA7B,EAAkC;AAChC,QAAMH,UAAUmF,KAAKhF,CAAL,CAAhB;;AAEAoC,MAAEjC,IAAF,CAAO,CAAC4P,IAAI,CAAL,IAAUlQ,QAAQ,CAAR,CAAjB;AACAmQ,OAAG7P,IAAH,CAAQN,QAAQ,CAAR,CAAR;AACAoQ,OAAG9P,IAAH,CAAQN,QAAQ,CAAR,CAAR;AACD;;AAED,MAAMqQ,YAAYxB,SAAS,CAAT,EAAY,CAAZ,EAAeqB,CAAf,CAAlB;;AAEA,OAAK/P,IAAI,CAAT,EAAYA,IAAI+P,CAAhB,EAAmB/P,GAAnB,EAAwB;AACtBkQ,cAAUlQ,CAAV,IAAe,CAAC+P,IAAI,CAAL,IAAUvM,KAAK2M,GAAL,CAASD,UAAUlQ,CAAV,CAAT,EAAuBwN,KAAvB,CAAzB;AACD;;AAED,MAAM4C,mBAAmBZ,aAAapN,CAAb,EAAgB8N,SAAhB,CAAzB;;AAEA,OAAKlQ,IAAI,CAAT,EAAYA,IAAI+P,IAAI,CAApB,EAAuB/P,GAAvB,EAA4B;AAC1B,QAAM8L,QAAQsE,iBAAiBpQ,CAAjB,CAAd;AACA,QAAMqQ,eAAgB,CAACH,UAAUlQ,CAAV,IAAeoC,EAAE0J,QAAQ,CAAV,CAAhB,KAAiC1J,EAAE0J,KAAF,IAAW1J,EAAE0J,QAAQ,CAAV,CAA5C,CAAtB;AACA,QAAMwE,aAAcN,GAAGlE,KAAH,IAAYmE,GAAGnE,QAAQ,CAAX,CAAhC;;AAEA5F,QAAIlG,CAAJ,IAASqQ,eAAeC,UAAf,GAA4BL,GAAGnE,QAAQ,CAAX,CAArC;AACD;;AAED5F,MAAI,CAAJ,IAAS+J,GAAG,CAAH,CAAT;AACA/J,MAAI6J,IAAI,CAAR,IAAaC,GAAGhL,KAAK/E,MAAL,GAAc,CAAjB,CAAb;;AAEA,SAAOiG,GAAP;AACD;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASqK,6BAAT,CAAwC9C,aAAxC,EAAuDsC,CAAvD,EAA0DvC,KAA1D,EAAiE;AAC/D,MAAIxN,UAAJ;AACA,MAAMkG,MAAM,EAAZ;;AAEA6J,MAAIA,MAAM,IAAN,GAAa,GAAb,GAAmBA,CAAvB;AACAvC,UAAQA,UAAU,IAAV,GAAiB,CAAjB,GAAqBA,KAA7B;;AAEA,MAAMgD,SAASV,iBAAiBC,CAAjB,EAAoBtC,cAAcC,GAAlC,EAAuCF,KAAvC,CAAf;AACA,MAAMiD,WAAWX,iBAAiBC,CAAjB,EAAoBtC,cAAcE,KAAlC,EAAyCH,KAAzC,CAAjB;AACA,MAAMkD,UAAUZ,iBAAiBC,CAAjB,EAAoBtC,cAAcG,IAAlC,EAAwCJ,KAAxC,CAAhB;;AAEA,OAAKxN,IAAI,CAAT,EAAYA,IAAI+P,CAAhB,EAAmB/P,GAAnB,EAAwB;AACtB,QAAM0N,MAAMlK,KAAKmN,KAAL,CAAWH,OAAOxQ,CAAP,IAAY,GAAvB,CAAZ;AACA,QAAM2N,QAAQnK,KAAKmN,KAAL,CAAWF,SAASzQ,CAAT,IAAc,GAAzB,CAAd;AACA,QAAM4N,OAAOpK,KAAKmN,KAAL,CAAWD,QAAQ1Q,CAAR,IAAa,GAAxB,CAAb;AACA,QAAM+E,OAAO,CAAC2I,GAAD,EAAMC,KAAN,EAAaC,IAAb,EAAmB,GAAnB,CAAb;;AAEA1H,QAAI/F,IAAJ,CAAS4E,IAAT;AACD;;AAED,SAAOmB,GAAP;AACD;;AAED;;;AAGO,SAAStC,gBAAT,GAA6B;AAClC,MAAMgN,YAAY,EAAlB;AACA,MAAMC,OAAO5J,OAAO4J,IAAP,CAAY/D,aAAZ,CAAb;;AAEA+D,OAAKvQ,OAAL,CAAa,UAAUwQ,GAAV,EAAe;AAC1B,QAAIhE,cAAciE,cAAd,CAA6BD,GAA7B,CAAJ,EAAuC;AACrC,UAAM9N,WAAW8J,cAAcgE,GAAd,CAAjB;;AAEAF,gBAAUzQ,IAAV,CAAe;AACb6Q,YAAIF,GADS;AAEb9D,cAAMhK,SAASgK;AAFF,OAAf;AAID;AACF,GATD;;AAWA4D,YAAUf,IAAV,CAAe,UAAUlB,CAAV,EAAaC,CAAb,EAAgB;AAC7B,QAAMqC,QAAQtC,EAAE3B,IAAF,CAAOtH,WAAP,EAAd;AACA,QAAMwL,QAAQtC,EAAE5B,IAAF,CAAOtH,WAAP,EAAd;;AAEA,QAAIuL,UAAUC,KAAd,EAAqB;AACnB,aAAO,CAAP;AACD;;AAED,WAAOD,QAAQC,KAAR,GAAgB,CAAC,CAAjB,GAAqB,CAA5B;AACD,GATD;;AAWA,SAAON,SAAP;AACD;;AAED;;;;;;;;AAQO,SAASjN,WAAT,CAAsBqN,EAAtB,EAA0BG,YAA1B,EAAwC;AAC7C,MAAInO,WAAW8J,cAAckE,EAAd,CAAf;;AAEA,MAAI,CAAChO,QAAL,EAAe;AACbA,eAAW8J,cAAckE,EAAd,IAAoBG,gBAAgB;AAC7CnE,YAAM,EADuC;AAE7CE,cAAQ;AAFqC,KAA/C;AAID;;AAED,MAAI,CAAClK,SAASkK,MAAV,IAAoBlK,SAASyK,aAAjC,EAAgD;AAC9CzK,aAASkK,MAAT,GAAkBqD,8BAA8BvN,SAASyK,aAAvC,EAAsDzK,SAASoK,SAA/D,EAA0EpK,SAASwK,KAAnF,CAAlB;AACD;;AAED,SAAO;AACLpD,SADK,mBACI;AACP,aAAO4G,EAAP;AACD,KAHI;AAKLI,sBALK,gCAKiB;AACpB,aAAOpO,SAASgK,IAAhB;AACD,KAPI;AASLqE,sBATK,8BASerE,IATf,EASqB;AACxBhK,eAASgK,IAAT,GAAgBA,IAAhB;AACD,KAXI;AAaLsE,qBAbK,+BAagB;AACnB,aAAOtO,SAASkK,MAAT,CAAgBjN,MAAvB;AACD,KAfI;AAiBLuK,qBAjBK,6BAiBc4C,SAjBd,EAiByB;AAC5B,aAAOpK,SAASkK,MAAT,CAAgBjN,MAAhB,GAAyBmN,SAAhC,EAA2C;AACzCpK,iBAASkK,MAAT,CAAgB/M,IAAhB,CAAqB0M,iBAArB;AACD;;AAED7J,eAASkK,MAAT,CAAgBjN,MAAhB,GAAyBmN,SAAzB;AACD,KAvBI;AAyBLmE,YAzBK,oBAyBKzF,KAzBL,EAyBY;AACf,UAAI,KAAK0F,YAAL,CAAkB1F,KAAlB,CAAJ,EAA8B;AAC5B,eAAO9I,SAASkK,MAAT,CAAgBpB,KAAhB,CAAP;AACD;;AAED,aAAOe,iBAAP;AACD,KA/BI;AAiCL4E,qBAjCK,6BAiCc3F,KAjCd,EAiCqB;AACxB,UAAMsB,YAAYpK,SAASkK,MAAT,CAAgBjN,MAAlC;;AAEA6L,cAAQsB,YAAYtB,QAAQsB,SAApB,GAAgC,CAAxC;;AAEA,aAAO,KAAKmE,QAAL,CAAczF,KAAd,CAAP;AACD,KAvCI;AAyCL4F,YAzCK,oBAyCK5F,KAzCL,EAyCY/G,IAzCZ,EAyCkB;AACrB,UAAI,KAAKyM,YAAL,CAAkB1F,KAAlB,CAAJ,EAA8B;AAC5B9I,iBAASkK,MAAT,CAAgBpB,KAAhB,IAAyB/G,IAAzB;AACD;AACF,KA7CI;AA+CL4M,YA/CK,oBA+CK5M,IA/CL,EA+CW;AACd/B,eAASkK,MAAT,CAAgB/M,IAAhB,CAAqB4E,IAArB;AACD,KAjDI;AAmDL6M,eAnDK,uBAmDQ9F,KAnDR,EAmDe/G,IAnDf,EAmDqB;AACxB,UAAI,KAAKyM,YAAL,CAAkB1F,KAAlB,CAAJ,EAA8B;AAC5B9I,iBAASkK,MAAT,CAAgBvF,MAAhB,CAAuBmE,KAAvB,EAA8B,CAA9B,EAAiC/G,IAAjC;AACD;AACF,KAvDI;AAyDL8M,eAzDK,uBAyDQ/F,KAzDR,EAyDe;AAClB,UAAI,KAAK0F,YAAL,CAAkB1F,KAAlB,CAAJ,EAA8B;AAC5B9I,iBAASkK,MAAT,CAAgBvF,MAAhB,CAAuBmE,KAAvB,EAA8B,CAA9B;AACD;AACF,KA7DI;AA+DLgG,eA/DK,yBA+DU;AACb9O,eAASkK,MAAT,GAAkB,EAAlB;AACD,KAjEI;AAmEL6E,oBAnEK,4BAmEa7L,GAnEb,EAmEkB;AACrB,UAAI,CAACA,GAAL,EAAU;AACR;AACD;;AAED,UAAMkH,YAAYpK,SAASkK,MAAT,CAAgBjN,MAAlC;;AAEAiG,UAAI8L,sBAAJ,CAA2B5E,SAA3B;;AAEA,WAAK,IAAIpN,IAAI,CAAb,EAAgBA,IAAIoN,SAApB,EAA+BpN,GAA/B,EAAoC;AAClCkG,YAAI+L,aAAJ,CAAkBjS,CAAlB,EAAqBgD,SAASkK,MAAT,CAAgBlN,CAAhB,CAArB;AACD;AACF,KA/EI;AAiFLqK,qBAjFK,+BAiFgB;AACnB,UAAMnE,MAAM,2BAAZ;;AAEA,WAAK6L,gBAAL,CAAsB7L,GAAtB;;AAEA,aAAOA,GAAP;AACD,KAvFI;AAyFLsL,gBAzFK,wBAyFS1F,KAzFT,EAyFgB;AACnB,aAAQA,SAAS,CAAV,IAAiBA,QAAQ9I,SAASkK,MAAT,CAAgBjN,MAAhD;AACD;AA3FI,GAAP;AA6FD,C;;;;;;;;;;;;;;;;;ACtvBD;AACA;AACA;AACA,IAAMiS,0BAA0B,CAAhC;AACA,IAAMC,0BAA0B,CAAhC;AACA,IAAMC,kBAAkB,CAAxB;;AAEA,SAASC,QAAT,CAAmBC,GAAnB,EAAwBC,GAAxB,EAA6BC,GAA7B,EAAkC;AAChC,MAAIF,MAAM,CAAV,EAAa;AACX,UAAM,IAAIvS,KAAJ,CAAU,0BAAV,CAAN;AACD;;AAED,MAAM0S,MAAM,EAAZ;;AAEA,MAAIF,QAAQ,CAAZ,EAAe;AACbE,QAAI,CAAJ,IAASD,GAAT;AACAC,QAAI,CAAJ,IAASD,GAAT;AACAC,QAAI,CAAJ,IAASD,GAAT;;AAEA,WAAOC,GAAP;AACD;;AAED,MAAMC,UAAUlP,KAAK8L,KAAL,CAAWgD,MAAM,CAAjB,CAAhB;AACA,MAAMK,OAAO,IAAIL,GAAJ,GAAUI,OAAvB;AACA,MAAME,KAAKJ,OAAO,IAAID,GAAX,CAAX;AACA,MAAMM,KAAKL,OAAO,IAAID,MAAMI,IAAjB,CAAX;AACA,MAAMG,KAAKN,OAAO,IAAID,OAAO,IAAII,IAAX,CAAX,CAAX;;AAEA,UAAQD,OAAR;;AAEA;AACA,SAAK,CAAL;AACA,SAAK,CAAL;AACED,UAAI,CAAJ,IAASD,GAAT;AACAC,UAAI,CAAJ,IAASK,EAAT;AACAL,UAAI,CAAJ,IAASG,EAAT;AACA;;AAEA;AACF,SAAK,CAAL;AACEH,UAAI,CAAJ,IAASI,EAAT;AACAJ,UAAI,CAAJ,IAASD,GAAT;AACAC,UAAI,CAAJ,IAASG,EAAT;AACA;;AAEA;AACF,SAAK,CAAL;AACEH,UAAI,CAAJ,IAASG,EAAT;AACAH,UAAI,CAAJ,IAASD,GAAT;AACAC,UAAI,CAAJ,IAASK,EAAT;AACA;;AAEA;AACF,SAAK,CAAL;AACEL,UAAI,CAAJ,IAASG,EAAT;AACAH,UAAI,CAAJ,IAASI,EAAT;AACAJ,UAAI,CAAJ,IAASD,GAAT;AACA;;AAEA;AACF,SAAK,CAAL;AACEC,UAAI,CAAJ,IAASK,EAAT;AACAL,UAAI,CAAJ,IAASG,EAAT;AACAH,UAAI,CAAJ,IAASD,GAAT;AACA;;AAEA;AACF,SAAK,CAAL;AACEC,UAAI,CAAJ,IAASD,GAAT;AACAC,UAAI,CAAJ,IAASG,EAAT;AACAH,UAAI,CAAJ,IAASI,EAAT;AACA;AA3CF;;AA8CA,SAAOJ,GAAP;AACD;;AAED,SAASM,qBAAT,CAAgCC,CAAhC,EAAmCC,CAAnC,EAAsC;AACpC,MAAIC,eAAJ;;AAEA;AACA,MAAIF,IAAIC,EAAEE,KAAF,CAAQ,CAAR,CAAR,EAAoB;AAClBD,aAASD,EAAEG,QAAF,GAAalB,uBAAb,GAAuC,GAAhD;AACD,GAFD,MAEO,IAAIc,IAAIC,EAAEE,KAAF,CAAQ,CAAR,CAAR,EAAoB;AACzBD,aAASD,EAAEG,QAAF,GAAajB,uBAAb,GAAuC,GAAhD;AACD,GAFM,MAEA;AACLe,aAAS,CAACF,IAAIC,EAAEI,KAAP,IAAgBJ,EAAEK,KAA3B;AACD;;AAED,SAAO9P,KAAK8L,KAAL,CAAW4D,MAAX,CAAP;AACD;;IAEKrP,W;AACJ,yBAAe;AAAA;;AACb,SAAK0P,cAAL,GAAsB,GAAtB;AACA,SAAKC,IAAL,GAAY,QAAZ;AACA,SAAKC,UAAL,GAAkB,CAAC,CAAD,EAAI,GAAJ,CAAlB;AACA,SAAKC,QAAL,GAAgB,CAAC,CAAD,EAAI,OAAJ,CAAhB;AACA,SAAKC,eAAL,GAAuB,CAAC,CAAD,EAAI,CAAJ,CAAvB;AACA,SAAKC,UAAL,GAAkB,CAAC,CAAD,EAAI,CAAJ,CAAlB;AACA,SAAKC,UAAL,GAAkB,CAAC,CAAD,EAAI,CAAJ,CAAlB;AACA,SAAKC,QAAL,GAAgB,CAAC,GAAD,EAAM,CAAN,EAAS,CAAT,EAAY,GAAZ,CAAhB;AACA,SAAKC,eAAL,GAAuB,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,GAAV,CAAvB;AACA,SAAKC,kBAAL,GAA0B,IAA1B;AACA,SAAKC,eAAL,GAAuB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAAvB;AACA,SAAKC,kBAAL,GAA0B,IAA1B;AACA,SAAKC,UAAL,GAAkB,CAAC,CAAD,EAAI,GAAJ,CAAlB;AACA,SAAK9K,KAAL,GAAa,EAAb;AACD;;;;2CAEuB+K,M,EAAQ;AAC9B,WAAKb,cAAL,GAAsBa,MAAtB;AACD;;;4BAEQC,I,EAAM;AACb,WAAKb,IAAL,GAAYa,IAAZ;AACD;;;kCAEc5P,K,EAAO6P,G,EAAK;AACzB;AACA;AACA;AACA,WAAKb,UAAL,CAAgB,CAAhB,IAAqBhP,KAArB;AACA,WAAKgP,UAAL,CAAgB,CAAhB,IAAqBa,GAArB;AACD;;;gCAEY7P,K,EAAO6P,G,EAAK;AACvB;AACA,WAAKZ,QAAL,CAAc,CAAd,IAAmBjP,KAAnB;AACA,WAAKiP,QAAL,CAAc,CAAd,IAAmBY,GAAnB;AACD;;;uCAEmB7P,K,EAAO6P,G,EAAK;AAC9B;AACA,WAAKX,eAAL,CAAqB,CAArB,IAA0BlP,KAA1B;AACA,WAAKkP,eAAL,CAAqB,CAArB,IAA0BW,GAA1B;AACD;;;kCAEc7P,K,EAAO6P,G,EAAK;AACzB;AACA,WAAKV,UAAL,CAAgB,CAAhB,IAAqBnP,KAArB;AACA,WAAKmP,UAAL,CAAgB,CAAhB,IAAqBU,GAArB;AACD;;;6BAES7P,K,EAAO6P,G,EAAK;AACpB,WAAKH,UAAL,CAAgB,CAAhB,IAAqB1P,KAArB;AACA,WAAK0P,UAAL,CAAgB,CAAhB,IAAqBG,GAArB;AACD;;;kCAEc7P,K,EAAO6P,G,EAAK;AACzB;AACA,WAAKT,UAAL,CAAgB,CAAhB,IAAqBpP,KAArB;AACA,WAAKoP,UAAL,CAAgB,CAAhB,IAAqBS,GAArB;AACD;;;6BAESC,M,EAAQ;AAChB;AACA;AACA,aAAO,KAAKC,QAAL,CAAcD,MAAd,CAAP;AACD;;;0BAEME,K,EAAO;AACZ,UAAI,KAAKpL,KAAL,CAAWpJ,MAAX,GAAoB,CAApB,IAAyB,CAACwU,KAA9B,EAAqC;AACnC;AACD;;AAED;AACA,WAAKpL,KAAL,GAAa,EAAb;;AAEA,UAAMqL,WAAW,KAAKnB,cAAL,GAAsB,CAAvC;;AAEA,UAAIoB,aAAJ;AAAA,UAAUC,aAAV;AAAA,UAAgBC,aAAhB;AAAA,UAAsBC,aAAtB;;AAEA,UAAIJ,QAAJ,EAAc;AACZC,eAAO,CAAC,KAAKjB,QAAL,CAAc,CAAd,IAAmB,KAAKA,QAAL,CAAc,CAAd,CAApB,IAAwCgB,QAA/C;AACAE,eAAO,CAAC,KAAKjB,eAAL,CAAqB,CAArB,IAA0B,KAAKA,eAAL,CAAqB,CAArB,CAA3B,IAAsDe,QAA7D;AACAG,eAAO,CAAC,KAAKjB,UAAL,CAAgB,CAAhB,IAAqB,KAAKA,UAAL,CAAgB,CAAhB,CAAtB,IAA4Cc,QAAnD;AACAI,eAAO,CAAC,KAAKjB,UAAL,CAAgB,CAAhB,IAAqB,KAAKA,UAAL,CAAgB,CAAhB,CAAtB,IAA4Ca,QAAnD;AACD,OALD,MAKO;AACLC,eAAOC,OAAOC,OAAOC,OAAO,GAA5B;AACD;;AAED,WAAK,IAAI9U,IAAI,CAAb,EAAgBA,KAAK0U,QAArB,EAA+B1U,GAA/B,EAAoC;AAClC,YAAMsS,MAAM,KAAKoB,QAAL,CAAc,CAAd,IAAmB1T,IAAI2U,IAAnC;AACA,YAAMpC,MAAM,KAAKoB,eAAL,CAAqB,CAArB,IAA0B3T,IAAI4U,IAA1C;AACA,YAAMpC,MAAM,KAAKoB,UAAL,CAAgB,CAAhB,IAAqB5T,IAAI6U,IAArC;AACA,YAAME,QAAQ,KAAKlB,UAAL,CAAgB,CAAhB,IAAqB7T,IAAI8U,IAAvC;;AAEA,YAAMrC,MAAMJ,SAASC,GAAT,EAAcC,GAAd,EAAmBC,GAAnB,CAAZ;AACA,YAAMwC,SAAS,EAAf;;AAEA,gBAAQ,KAAKxB,IAAb;AACA,eAAK,QAAL;AACEwB,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW,SAAS,MAAM9L,KAAKyR,GAAL,CAAS,CAAC,MAAMxC,IAAI,CAAJ,CAAP,IAAiBjP,KAAKoG,EAA/B,CAAf,CAAX,CAAZ;AACAoL,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW,SAAS,MAAM9L,KAAKyR,GAAL,CAAS,CAAC,MAAMxC,IAAI,CAAJ,CAAP,IAAiBjP,KAAKoG,EAA/B,CAAf,CAAX,CAAZ;AACAoL,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW,SAAS,MAAM9L,KAAKyR,GAAL,CAAS,CAAC,MAAMxC,IAAI,CAAJ,CAAP,IAAiBjP,KAAKoG,EAA/B,CAAf,CAAX,CAAZ;AACAoL,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAWyF,QAAQ,GAAnB,CAAZ;AACA;AACF,eAAK,QAAL;AACEC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAWmD,IAAI,CAAJ,IAAS,GAAT,GAAe,GAA1B,CAAZ;AACAuC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAWmD,IAAI,CAAJ,IAAS,GAAT,GAAe,GAA1B,CAAZ;AACAuC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAWmD,IAAI,CAAJ,IAAS,GAAT,GAAe,GAA1B,CAAZ;AACAuC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAWyF,QAAQ,GAAR,GAAc,GAAzB,CAAZ;AACA;AACF,eAAK,MAAL;AACEC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW9L,KAAK0R,IAAL,CAAUzC,IAAI,CAAJ,CAAV,IAAoB,GAApB,GAA0B,GAArC,CAAZ;AACAuC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW9L,KAAK0R,IAAL,CAAUzC,IAAI,CAAJ,CAAV,IAAoB,GAApB,GAA0B,GAArC,CAAZ;AACAuC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW9L,KAAK0R,IAAL,CAAUzC,IAAI,CAAJ,CAAV,IAAoB,GAApB,GAA0B,GAArC,CAAZ;AACAuC,mBAAO,CAAP,IAAYxR,KAAK8L,KAAL,CAAW9L,KAAK0R,IAAL,CAAUH,KAAV,IAAmB,GAAnB,GAAyB,GAApC,CAAZ;AACA;AACF;AACE,kBAAM,IAAIhV,KAAJ,0BAAiC,KAAKyT,IAAtC,OAAN;AApBF;;AAuBA,aAAKnK,KAAL,CAAWlJ,IAAX,CAAgB6U,MAAhB;AACD;;AAED,WAAKG,kBAAL;AACD;;;yCAEqB;AACpB,UAAMC,iBAAiB,KAAK7B,cAA5B;AACA,UAAM8B,uBAAuBD,iBAAiBlD,uBAA9C;AACA,UAAMoD,uBAAuBF,iBAAiBjD,uBAA9C;AACA,UAAMoD,gBAAgBH,iBAAiBhD,eAAvC;;AAEA;AACA,UAAI,KAAK4B,kBAAL,IAA2BoB,mBAAmB,CAAlD,EAAqD;AACnD,aAAK/L,KAAL,CAAWgM,oBAAX,IAAmC,KAAKtB,eAAxC;AACD,OAFD,MAEO;AACL;AACA,aAAK1K,KAAL,CAAWgM,oBAAX,IAAmC,KAAKhM,KAAL,CAAW,CAAX,CAAnC;AACD;;AAED;AACA,UAAI,KAAK6K,kBAAL,IAA2BkB,mBAAmB,CAAlD,EAAqD;AACnD,aAAK/L,KAAL,CAAWiM,oBAAX,IAAmC,KAAKrB,eAAxC;AACD,OAFD,MAEO;AACL;AACA,aAAK5K,KAAL,CAAWiM,oBAAX,IAAmC,KAAKjM,KAAL,CAAW+L,iBAAiB,CAA5B,CAAnC;AACD;;AAED;AACA,WAAK/L,KAAL,CAAWkM,aAAX,IAA4B,KAAKzB,QAAjC;AACD;;AAED;;;;6BACUd,C,EAAG;AACX,UAAMlH,QAAQ,KAAK0J,QAAL,CAAcxC,CAAd,CAAd;;AAEA,UAAIlH,QAAQ,CAAZ,EAAe;AACb,eAAO,KAAKgI,QAAZ;AACD,OAFD,MAEO,IAAIhI,UAAU,CAAd,EAAiB;AACtB,YAAI,KAAKkI,kBAAL,IAA2BhB,IAAI,KAAKS,UAAL,CAAgB,CAAhB,CAAnC,EAAuD;AACrD,iBAAO,KAAKM,eAAZ;AACD;AACF,OAJM,MAIA,IAAIjI,UAAU,KAAKyH,cAAL,GAAsB,CAApC,EAAuC;AAC5C,YAAI,KAAKW,kBAAL,IAA2BlB,IAAI,KAAKS,UAAL,CAAgB,CAAhB,CAAnC,EAAuD;AACrD,iBAAO,KAAKQ,eAAZ;AACD;AACF;;AAED,aAAO,KAAK5K,KAAL,CAAWyC,KAAX,CAAP;AACD;;;6BAESkH,C,EAAG;AACX,UAAMC,IAAI,EAAV;;AAEAA,QAAEE,KAAF,GAAU,EAAV;AACAF,QAAEG,QAAF,GAAa,KAAKG,cAAL,GAAsB,CAAnC;;AAEA;AACAN,QAAEI,KAAF,GAAU,CAAC,KAAKI,UAAL,CAAgB,CAAhB,CAAX;AACA,UAAI,KAAKA,UAAL,CAAgB,CAAhB,KAAsB,KAAKA,UAAL,CAAgB,CAAhB,CAA1B,EAA8C;AAC5CR,UAAEK,KAAF,GAAUmC,OAAOC,SAAjB;AACD,OAFD,MAEO;AACLzC,UAAEK,KAAF,GAAUL,EAAEG,QAAF,IAAc,KAAKK,UAAL,CAAgB,CAAhB,IAAqB,KAAKA,UAAL,CAAgB,CAAhB,CAAnC,CAAV;AACD;;AAEDR,QAAEE,KAAF,CAAQ,CAAR,IAAa,KAAKM,UAAL,CAAgB,CAAhB,CAAb;AACAR,QAAEE,KAAF,CAAQ,CAAR,IAAa,KAAKM,UAAL,CAAgB,CAAhB,CAAb;;AAEA;AACA,UAAIkC,MAAM3C,CAAN,CAAJ,EAAc;AACZ;AACA,eAAO,CAAC,CAAR;AACD;;AAED;AACA,UAAIlH,QAAQiH,sBAAsBC,CAAtB,EAAyBC,CAAzB,CAAZ;;AAEA;AACA;AACA,UAAInH,UAAU,KAAKyH,cAAL,GAAsBrB,uBAApC,EAA6D;AAC3DpG,gBAAQ,CAAR;AACD,OAFD,MAEO,IAAIA,UAAU,KAAKyH,cAAL,GAAsBpB,uBAApC,EAA6D;AAClErG,gBAAQ,KAAKyH,cAAL,GAAsB,CAA9B;AACD;;AAED,aAAOzH,KAAP;AACD;;;kCAEcA,K,EAAO/G,I,EAAM;AAC1B;AACA,UAAI6Q,UAAU3V,MAAV,KAAqB,CAAzB,EAA4B;AAC1B8E,eAAO8Q,MAAMC,SAAN,CAAgBC,KAAhB,CAAsBnO,IAAtB,CAA2BgO,SAA3B,EAAsC,CAAtC,CAAP;AACD;;AAED;AACA,UAAI9J,QAAQ,CAAZ,EAAe;AACb,cAAM,IAAI/L,KAAJ,qDAA2D+L,KAA3D,OAAN;AACD;;AAED,UAAIA,SAAS,KAAKyH,cAAlB,EAAkC;AAChC,YAAIxT,KAAJ,YAAmB+L,KAAnB,8CAAiE,KAAKyH,cAAtE;AACD;;AAED,WAAKlK,KAAL,CAAWyC,KAAX,IAAoB/G,IAApB;;AAEA,UAAK+G,UAAU,CAAX,IAAkBA,UAAU,KAAKyH,cAAL,GAAsB,CAAtD,EAA0D;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,aAAK4B,kBAAL;AACD;AACF;;;;;;kBAGYtR,W;;;;;;;;;;;;;kBC/TA,UAAUtD,KAAV,EAAiB2F,GAAjB,EAAsBuC,mBAAtB,EAA2C;AACxD,MAAIhE,QAAQ,oBAAZ;AACA,MAAMiE,YAAYnI,MAAMoI,YAAN,EAAlB;;AAEApI,QAAMoE,KAAN,CAAYiE,oBAAZ,GAAmC,uBAAQnE,KAA3C;;AAEA,MAAMoE,YAAYH,UAAUzI,MAA5B;AACA,MAAM8F,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA,MAAIiN,mBAAJ;;AAEA;AACA;;AAEA;AACAvR,UAAQ,oBAAR;AACA,MAAIiE,qBAAqBM,UAAzB,EAAqC;AACnC,QAAIjD,gBAAgB,CAApB,EAAuB;AACrB,aAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCmN,qBAAa9P,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAAb;AACA0C,4BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,4BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,4BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,4BAAoBK,sBAApB,IAA8C,GAA9C,CALuC,CAKY;AACpD;AACF,KARD,MAQO;AACL,aAAOC,uBAAuBF,SAA9B,EAAyC;AACvCmN,qBAAa9P,IAAIwC,UAAUK,sBAAV,CAAJ,CAAb;AACAN,4BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,4BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,4BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,4BAAoBK,sBAApB,IAA8C,GAA9C,CALuC,CAKY;AACpD;AACF;AACF,GAlBD,MAkBO,IAAIJ,qBAAqBO,WAAzB,EAAsC;AAC3C,WAAOF,uBAAuBF,SAA9B,EAAyC;AACvCmN,mBAAa9P,IAAIwC,UAAUK,sBAAV,CAAJ,CAAb;AACAN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8C,GAA9C,CALuC,CAKY;AACpD;AACF,GARM,MAQA,IAAI/C,gBAAgB,CAApB,EAAuB;AAC5B,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCmN,mBAAa9P,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAAb;AACA0C,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8C,GAA9C,CALuC,CAKY;AACpD;AACF,GARM,MAQA;AACL,WAAOC,uBAAuBF,SAA9B,EAAyC;AACvCmN,mBAAa9P,IAAIwC,UAAUK,sBAAV,CAAJ,CAAb;AACAN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8CkN,UAA9C;AACAvN,0BAAoBK,sBAApB,IAA8C,GAA9C,CALuC,CAKY;AACpD;AACF;;AAEDvI,QAAMoE,KAAN,CAAYuE,wCAAZ,GAAuD,uBAAQzE,KAA/D;AACD,C;;AA1ED;;;;;;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;IACawR,S,WAAAA,S;AACX,uBAAe;AAAA;;AACb,SAAKC,KAAL;AACD;;;;4BAEQ;AACP,WAAKrU,CAAL,GAAS,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,CAAT;AACD;;;4BAEQ;AACP,UAAMF,YAAY,IAAIsU,SAAJ,EAAlB;;AAEAtU,gBAAUE,CAAV,CAAY,CAAZ,IAAiB,KAAKA,CAAL,CAAO,CAAP,CAAjB;AACAF,gBAAUE,CAAV,CAAY,CAAZ,IAAiB,KAAKA,CAAL,CAAO,CAAP,CAAjB;AACAF,gBAAUE,CAAV,CAAY,CAAZ,IAAiB,KAAKA,CAAL,CAAO,CAAP,CAAjB;AACAF,gBAAUE,CAAV,CAAY,CAAZ,IAAiB,KAAKA,CAAL,CAAO,CAAP,CAAjB;AACAF,gBAAUE,CAAV,CAAY,CAAZ,IAAiB,KAAKA,CAAL,CAAO,CAAP,CAAjB;AACAF,gBAAUE,CAAV,CAAY,CAAZ,IAAiB,KAAKA,CAAL,CAAO,CAAP,CAAjB;;AAEA,aAAOF,SAAP;AACD;;;6BAESwU,M,EAAQ;AAChB,UAAMC,MAAM,KAAKvU,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAZ,GAA0B,KAAKA,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAlD;AACA,UAAMwU,MAAM,KAAKxU,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAZ,GAA0B,KAAKA,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAlD;;AAEA,UAAMyU,MAAM,KAAKzU,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAZ,GAA0B,KAAKA,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAlD;AACA,UAAM0U,MAAM,KAAK1U,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAZ,GAA0B,KAAKA,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAlD;;AAEA,UAAM2U,KAAK,KAAK3U,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAZ,GAA0B,KAAKA,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAtC,GAAoD,KAAKA,CAAL,CAAO,CAAP,CAA/D;AACA,UAAM4U,KAAK,KAAK5U,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAZ,GAA0B,KAAKA,CAAL,CAAO,CAAP,IAAYsU,OAAOtU,CAAP,CAAS,CAAT,CAAtC,GAAoD,KAAKA,CAAL,CAAO,CAAP,CAA/D;;AAEA,WAAKA,CAAL,CAAO,CAAP,IAAYuU,GAAZ;AACA,WAAKvU,CAAL,CAAO,CAAP,IAAYwU,GAAZ;AACA,WAAKxU,CAAL,CAAO,CAAP,IAAYyU,GAAZ;AACA,WAAKzU,CAAL,CAAO,CAAP,IAAY0U,GAAZ;AACA,WAAK1U,CAAL,CAAO,CAAP,IAAY2U,EAAZ;AACA,WAAK3U,CAAL,CAAO,CAAP,IAAY4U,EAAZ;AACD;;;6BAES;AACR,UAAMC,IAAI,KAAK,KAAK7U,CAAL,CAAO,CAAP,IAAY,KAAKA,CAAL,CAAO,CAAP,CAAZ,GAAwB,KAAKA,CAAL,CAAO,CAAP,IAAY,KAAKA,CAAL,CAAO,CAAP,CAAzC,CAAV;AACA,UAAM8U,KAAK,KAAK9U,CAAL,CAAO,CAAP,IAAY6U,CAAvB;AACA,UAAME,KAAK,CAAC,KAAK/U,CAAL,CAAO,CAAP,CAAD,GAAa6U,CAAxB;AACA,UAAMG,KAAK,CAAC,KAAKhV,CAAL,CAAO,CAAP,CAAD,GAAa6U,CAAxB;AACA,UAAMI,KAAK,KAAKjV,CAAL,CAAO,CAAP,IAAY6U,CAAvB;AACA,UAAMK,KAAKL,KAAK,KAAK7U,CAAL,CAAO,CAAP,IAAY,KAAKA,CAAL,CAAO,CAAP,CAAZ,GAAwB,KAAKA,CAAL,CAAO,CAAP,IAAY,KAAKA,CAAL,CAAO,CAAP,CAAzC,CAAX;AACA,UAAMmV,KAAKN,KAAK,KAAK7U,CAAL,CAAO,CAAP,IAAY,KAAKA,CAAL,CAAO,CAAP,CAAZ,GAAwB,KAAKA,CAAL,CAAO,CAAP,IAAY,KAAKA,CAAL,CAAO,CAAP,CAAzC,CAAX;;AAEA,WAAKA,CAAL,CAAO,CAAP,IAAY8U,EAAZ;AACA,WAAK9U,CAAL,CAAO,CAAP,IAAY+U,EAAZ;AACA,WAAK/U,CAAL,CAAO,CAAP,IAAYgV,EAAZ;AACA,WAAKhV,CAAL,CAAO,CAAP,IAAYiV,EAAZ;AACA,WAAKjV,CAAL,CAAO,CAAP,IAAYkV,EAAZ;AACA,WAAKlV,CAAL,CAAO,CAAP,IAAYmV,EAAZ;AACD;;;2BAEOC,G,EAAK;AACX,UAAMC,IAAI1T,KAAKyR,GAAL,CAASgC,GAAT,CAAV;AACA,UAAME,IAAI3T,KAAK4T,GAAL,CAASH,GAAT,CAAV;AACA,UAAMb,MAAM,KAAKvU,CAAL,CAAO,CAAP,IAAYqV,CAAZ,GAAgB,KAAKrV,CAAL,CAAO,CAAP,IAAYsV,CAAxC;AACA,UAAMd,MAAM,KAAKxU,CAAL,CAAO,CAAP,IAAYqV,CAAZ,GAAgB,KAAKrV,CAAL,CAAO,CAAP,IAAYsV,CAAxC;AACA,UAAMb,MAAM,KAAKzU,CAAL,CAAO,CAAP,IAAY,CAACsV,CAAb,GAAiB,KAAKtV,CAAL,CAAO,CAAP,IAAYqV,CAAzC;AACA,UAAMX,MAAM,KAAK1U,CAAL,CAAO,CAAP,IAAY,CAACsV,CAAb,GAAiB,KAAKtV,CAAL,CAAO,CAAP,IAAYqV,CAAzC;;AAEA,WAAKrV,CAAL,CAAO,CAAP,IAAYuU,GAAZ;AACA,WAAKvU,CAAL,CAAO,CAAP,IAAYwU,GAAZ;AACA,WAAKxU,CAAL,CAAO,CAAP,IAAYyU,GAAZ;AACA,WAAKzU,CAAL,CAAO,CAAP,IAAY0U,GAAZ;AACD;;;8BAEUnU,C,EAAGC,C,EAAG;AACf,WAAKR,CAAL,CAAO,CAAP,KAAa,KAAKA,CAAL,CAAO,CAAP,IAAYO,CAAZ,GAAgB,KAAKP,CAAL,CAAO,CAAP,IAAYQ,CAAzC;AACA,WAAKR,CAAL,CAAO,CAAP,KAAa,KAAKA,CAAL,CAAO,CAAP,IAAYO,CAAZ,GAAgB,KAAKP,CAAL,CAAO,CAAP,IAAYQ,CAAzC;AACD;;;0BAEMgV,E,EAAIC,E,EAAI;AACb,WAAKzV,CAAL,CAAO,CAAP,KAAawV,EAAb;AACA,WAAKxV,CAAL,CAAO,CAAP,KAAawV,EAAb;AACA,WAAKxV,CAAL,CAAO,CAAP,KAAayV,EAAb;AACA,WAAKzV,CAAL,CAAO,CAAP,KAAayV,EAAb;AACD;;;mCAEeC,E,EAAIC,E,EAAI;AACtB,UAAMpV,IAAImV,EAAV;AACA,UAAMlV,IAAImV,EAAV;;AAEAD,WAAKnV,IAAI,KAAKP,CAAL,CAAO,CAAP,CAAJ,GAAgBQ,IAAI,KAAKR,CAAL,CAAO,CAAP,CAApB,GAAgC,KAAKA,CAAL,CAAO,CAAP,CAArC;AACA2V,WAAKpV,IAAI,KAAKP,CAAL,CAAO,CAAP,CAAJ,GAAgBQ,IAAI,KAAKR,CAAL,CAAO,CAAP,CAApB,GAAgC,KAAKA,CAAL,CAAO,CAAP,CAArC;;AAEA,aAAO;AACLO,WAAGmV,EADE;AAELlV,WAAGmV;AAFE,OAAP;AAID;;;;;;;;;;;;;;;;;kBCjHY,UAAUjX,KAAV,EAAiB0D,QAAjB,EAA2BnC,WAA3B,EAAwC;AACrD;AACA,MAAIvB,MAAM2D,SAAN,KAAoBpE,SAApB,IACFS,MAAM2D,SAAN,CAAgB1B,YAAhB,KAAiCyB,SAAS3B,GAAT,CAAaE,YAD5C,IAEFjC,MAAM2D,SAAN,CAAgB3B,WAAhB,KAAgC0B,SAAS3B,GAAT,CAAaC,WAF3C,IAGF,0BAAWhC,MAAM2D,SAAN,CAAgBpB,WAA3B,EAAwCmB,SAASnB,WAAjD,CAHE,IAIF,0BAAWvC,MAAM2D,SAAN,CAAgBnB,MAA3B,EAAmCkB,SAASlB,MAA5C,CAJE,IAKFxC,MAAM2D,SAAN,CAAgBzB,MAAhB,KAA2BwB,SAASxB,MALlC,IAMFX,gBAAgB,IANlB,EAMwB;AACtB,WAAOvB,MAAM2D,SAAN,CAAgBC,QAAvB;AACD;;AAED;AACA,6BAAY5D,KAAZ,EAAmB0D,SAAS3B,GAAT,CAAaC,WAAhC,EAA6C0B,SAAS3B,GAAT,CAAaE,YAA1D,EAAwEyB,SAASxB,MAAjF,EAAyFwB,SAASnB,WAAlG,EAA+GmB,SAASlB,MAAxH;;AAEAxC,QAAM2D,SAAN,CAAgB3B,WAAhB,GAA8B0B,SAAS3B,GAAT,CAAaC,WAA3C;AACAhC,QAAM2D,SAAN,CAAgB1B,YAAhB,GAA+ByB,SAAS3B,GAAT,CAAaE,YAA5C;AACAjC,QAAM2D,SAAN,CAAgBzB,MAAhB,GAAyBwB,SAASxB,MAAlC;AACAlC,QAAM2D,SAAN,CAAgBnB,MAAhB,GAAyBkB,SAASlB,MAAlC;AACAxC,QAAM2D,SAAN,CAAgBpB,WAAhB,GAA8BmB,SAASnB,WAAvC;;AAEA,SAAOvC,MAAM2D,SAAN,CAAgBC,QAAvB;AACD,C;;AAzBD;;;;AACA;;;;;;;;;;;;;;;;;ACDA;;;;AACA;;;;;;AAEA;;;;AAIA,IAAMsT,aAAa,EAAnB;;AAEA,IAAMC,eAAe,EAArB;;AAEA,IAAIC,qBAAqB,OAAO,IAAP,GAAc,GAAvC,C,CAA4C;AAC5C,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,YAAT,GAAyB;AACvB,SAAO;AACLF,0CADK;AAELC,sCAFK;AAGLE,0BAAsBJ,aAAazX;AAH9B,GAAP;AAKD;;AAED,SAAS8X,qBAAT,GAAkC;AAChC;AACA,MAAIH,oBAAoBD,kBAAxB,EAA4C;AAC1C;AACD;;AAED;AACA;AACA,WAASK,OAAT,CAAkBrJ,CAAlB,EAAqBC,CAArB,EAAwB;AACtB,QAAID,EAAEsJ,SAAF,GAAcrJ,EAAEqJ,SAApB,EAA+B;AAC7B,aAAO,CAAC,CAAR;AACD;AACD,QAAItJ,EAAEsJ,SAAF,GAAcrJ,EAAEqJ,SAApB,EAA+B;AAC7B,aAAO,CAAP;AACD;;AAED,WAAO,CAAP;AACD;AACDP,eAAa7H,IAAb,CAAkBmI,OAAlB;;AAEA;AACA,SAAOJ,mBAAmBD,kBAA1B,EAA8C;AAC5C,QAAMO,kBAAkBR,aAAaA,aAAazX,MAAb,GAAsB,CAAnC,CAAxB;;AAEA2X,wBAAoBM,gBAAgBC,WAApC;AACA,WAAOV,WAAWS,gBAAgB9X,OAA3B,CAAP;AACAsX,iBAAaU,GAAb;;AAEA,kDAAqB,gCAArB,EAAuD,EAAEhY,SAAS8X,gBAAgB9X,OAA3B,EAAvD;AACD;;AAED,MAAMiY,YAAYR,cAAlB;;AAEA,gDAAqB,kCAArB,EAAyDQ,SAAzD;AACD;;AAED,SAASC,mBAAT,CAA8BC,QAA9B,EAAwC;AACtC,MAAIA,aAAazY,SAAjB,EAA4B;AAC1B,UAAM,IAAIC,KAAJ,CAAU,+DAAV,CAAN;AACD;AACD,MAAIwY,SAASC,OAAT,KAAqB1Y,SAAzB,EAAoC;AAClC,UAAM,IAAIC,KAAJ,CAAU,0DAAV,CAAN;AACD;;AAED4X,uBAAqBY,QAArB;AACAR;AACD;;AAED,SAASU,eAAT,CAA0BlY,KAA1B,EAAiCmY,YAAjC,EAA+C;AAC7C,MAAMtY,UAAUG,MAAMH,OAAtB;;AAEA,MAAIG,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,8CAAV,CAAN;AACD;;AAED,MAAIK,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,gDAAV,CAAN;AACD;;AAED,MAAI2Y,iBAAiB5Y,SAArB,EAAgC;AAC9B,UAAM,IAAIC,KAAJ,CAAU,qDAAV,CAAN;AACD;;AAED,MAAIkH,OAAO6O,SAAP,CAAiB/E,cAAjB,CAAgCnJ,IAAhC,CAAqC6P,UAArC,EAAiDrX,OAAjD,MAA8D,IAAlE,EAAwE;AACtE,UAAM,IAAIL,KAAJ,CAAU,2CAAV,CAAN;AACD;;AAED,MAAM4Y,cAAc;AAClBvY,oBADkB;AAElBsY,8BAFkB;AAGlBT,eAAW,IAAItX,IAAJ,EAHO;AAIlBwX,iBAAaO,aAAaP;AAJR,GAApB;;AAOAV,aAAWrX,OAAX,IAAsBuY,WAAtB;AACAjB,eAAavX,IAAb,CAAkBwY,WAAlB;;AAEA,MAAID,aAAaP,WAAb,KAA6BrY,SAAjC,EAA4C;AAC1C,UAAM,IAAIC,KAAJ,CAAU,iEAAV,CAAN;AACD;AACD,MAAI2Y,aAAaP,WAAb,CAAyBK,OAAzB,KAAqC1Y,SAAzC,EAAoD;AAClD,UAAM,IAAIC,KAAJ,CAAU,2DAAV,CAAN;AACD;AACD6X,sBAAoBe,YAAYR,WAAhC;AACAJ;AACD;;AAED,SAASa,eAAT,CAA0BxY,OAA1B,EAAmC;AACjC,MAAIA,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,gDAAV,CAAN;AACD;AACD,MAAM4Y,cAAclB,WAAWrX,OAAX,CAApB;;AAEA,MAAIuY,gBAAgB7Y,SAApB,EAA+B;AAC7B;AACD;;AAED;AACA6Y,cAAYV,SAAZ,GAAwB,IAAItX,IAAJ,EAAxB;;AAEA,SAAOgY,YAAYD,YAAnB;AACD;;AAED,SAASG,kBAAT,CAA6BzY,OAA7B,EAAsC;AACpC,MAAIA,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,mDAAV,CAAN;AACD;AACD,MAAM4Y,cAAclB,WAAWrX,OAAX,CAApB;;AAEA,MAAIuY,gBAAgB7Y,SAApB,EAA+B;AAC7B,UAAM,IAAIC,KAAJ,CAAU,mDAAV,CAAN;AACD;AACD2X,eAAa/P,MAAb,CAAoB+P,aAAaoB,OAAb,CAAqBH,WAArB,CAApB,EAAuD,CAAvD;AACAf,sBAAoBe,YAAYR,WAAhC;AACA,SAAOV,WAAWrX,OAAX,CAAP;;AAEA,SAAOuY,YAAYD,YAAnB;AACD;;AAED,SAASK,UAAT,GAAuB;AACrB,SAAOrB,aAAazX,MAAb,GAAsB,CAA7B,EAAgC;AAC9B,QAAM+Y,qBAAqBtB,aAAaU,GAAb,EAA3B;;AAEA,WAAOX,WAAWuB,mBAAmB5Y,OAA9B,CAAP;AACD;AACDwX,qBAAmB,CAAnB;AACD;;kBAEc;AACbmB,wBADa;AAEbH,kCAFa;AAGbH,kCAHa;AAIbI,wCAJa;AAKbP;AALa,C;;;;;;;;;;;;ACtJf,IAAIhX,IAAId,OAAOc,CAAf;;AAEA,IAAM2X,WAAW;AACf,MAAI3X,CAAJ,CAAO4X,MAAP,EAAe;AACb5X,QAAI4X,MAAJ;AACD,GAHc;AAIf,MAAI5X,CAAJ,GAAS;AACP,WAAOA,CAAP;AACD;AANc,CAAjB;;QASS2X,Q,GAAAA,Q;;;;;;;;;;;;;kBC8DM,UAAUE,EAAV,EAAcC,eAAd,EAA+BC,aAA/B,EAA8C;AAC3D,MAAMC,eAAeC,cAAcJ,EAAd,EAAkBC,eAAlB,EAAmCD,GAAGK,aAAtC,CAArB;AACA,MAAMC,aAAaF,cAAcJ,EAAd,EAAkBE,aAAlB,EAAiCF,GAAGO,eAApC,CAAnB;;AAGA,SAAOC,cAAcR,EAAd,EAAkBG,YAAlB,EAAgCG,UAAhC,CAAP;AACD,C;;AA/ED;;;;;;;;;AASA,SAASF,aAAT,CAAwBJ,EAAxB,EAA4BS,YAA5B,EAA0CC,UAA1C,EAAsD;;AAEpD;AACA,MAAMC,SAASX,GAAGY,YAAH,CAAgBF,UAAhB,CAAf;;AAEA;AACAV,KAAGS,YAAH,CAAgBE,MAAhB,EAAwBF,YAAxB;;AAEA;AACAT,KAAGI,aAAH,CAAiBO,MAAjB;;AAEA;AACA,MAAME,UAAUb,GAAGc,kBAAH,CAAsBH,MAAtB,EAA8BX,GAAGe,cAAjC,CAAhB;;AAEA,MAAI,CAACF,OAAD,IAAY,CAACb,GAAGgB,aAAH,EAAjB,EAAqC;AACnC;AACA,QAAMC,UAAUjB,GAAGkB,gBAAH,CAAoBP,MAApB,CAAhB;;AAEAQ,YAAQC,KAAR,iCAA4CH,OAA5C;AACD;;AAED,SAAON,MAAP;AACD;;AAED;;;;;;;;AAQA,SAASH,aAAT,CAAwBR,EAAxB,EAA4BG,YAA5B,EAA0CkB,cAA1C,EAA0D;;AAExD;AACA,MAAMC,UAAUtB,GAAGQ,aAAH,EAAhB;;AAEA;AACAR,KAAGuB,YAAH,CAAgBD,OAAhB,EAAyBnB,YAAzB;AACAH,KAAGuB,YAAH,CAAgBD,OAAhB,EAAyBD,cAAzB;;AAEA;AACArB,KAAGwB,WAAH,CAAeF,OAAf;;AAEA;AACA,MAAMT,UAAUb,GAAGyB,mBAAH,CAAuBH,OAAvB,EAAgCtB,GAAG0B,WAAnC,CAAhB;;AAEA,MAAI,CAACb,OAAD,IAAY,CAACb,GAAGgB,aAAH,EAAjB,EAAqC;AACnC;AACA,QAAMC,UAAUjB,GAAG2B,iBAAH,CAAqBL,OAArB,CAAhB;;AAEAH,YAAQC,KAAR,oCAA+CH,OAA/C;AACD;;AAED,SAAOK,OAAP;AACD;;AAED;;;;;;;;;;;;;;;;;;QCrDgBM,c,GAAAA,c;;AAVhB;;;;AACA;;;;AAEA;;;;;;;AANA;;;AAaO,SAASA,cAAT,CAAyB7a,cAAzB,EAAyC4B,WAAzC,EAAsD;AAC3D,MAAI5B,mBAAmBJ,SAAvB,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,gEAAV,CAAN;AACD;;AAED,MAAMQ,QAAQL,eAAeK,KAA7B;;AAEA,MAAIA,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,6DAAV,CAAN;AACD;;AAED;AACA;AACA,MAAIG,eAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BC,WAA5B,KAA4CrC,eAAeK,KAAf,CAAqBgC,WAAjE,IACErC,eAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BE,YAA5B,KAA6CtC,eAAeK,KAAf,CAAqBiC,YADpE,IAEEtC,eAAe+D,QAAf,CAAwBxB,MAAxB,KAAmC,KAFzC,EAEgD;;AAE9C;AACA,QAAMhB,UAAUvB,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CAAhB;;AAEA1D,YAAQG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACAH,YAAQ2D,SAAR,GAAoB,OAApB;AACA3D,YAAQ4D,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBnF,eAAegC,MAAf,CAAsBoB,KAA7C,EAAoDpD,eAAegC,MAAf,CAAsBiB,MAA1E;;AAEA;AACA1B,YAAQ6D,qBAAR,GAAgC,CAACpF,eAAe+D,QAAf,CAAwBvB,gBAAzD;AACAjB,YAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEA;AACA,8CAA2BpF,cAA3B,EAA2CuB,OAA3C;;AAEAA,YAAQmE,SAAR,CAAkBrF,MAAMya,QAAN,EAAlB,EAAoC,CAApC,EAAuC,CAAvC,EAA0Cza,MAAM+C,KAAhD,EAAuD/C,MAAM4C,MAA7D,EAAqE,CAArE,EAAwE,CAAxE,EAA2E5C,MAAM+C,KAAjF,EAAwF/C,MAAM4C,MAA9F;AACD,GArBD,MAqBO;AACL,4CAAiBjD,cAAjB,EAAiC4B,WAAjC;AACD;AACF,C;;;;;;;;;;;;;kBCGc,UAAUjC,OAAV,EAAmBob,mBAAnB,EAAwC;;AAErD,MAAM/a,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEAqb,gBAAcrb,OAAd,EAAuBK,eAAegC,MAAtC;;AAEA,MAAMkJ,YAAY;AAChBvL;AADgB,GAAlB;;AAIA,8BAAaA,OAAb,EAAsB,2BAAtB,EAAmDuL,SAAnD;;AAEA,MAAIlL,eAAeK,KAAf,KAAyBT,SAA7B,EAAwC;AACtC;AACD;;AAED,MAAImb,wBAAwB,IAA5B,EAAkC;AAChC,+BAAYpb,OAAZ;AACD,GAFD,MAEO;AACL,+BAAYA,OAAZ;AACD;AACF,C;;AA1ED;;AACA;;;;AACA;;;;AACA;;;;;;AAEA;;;;;;;AAOA,SAASqb,aAAT,CAAwBrb,OAAxB,EAAiCqC,MAAjC,EAAyC;AACvC;AACA;AACA;;;;;;;;;;;;;;;;;AAmBA;AACA,MAAIA,OAAOoB,KAAP,KAAiBzD,QAAQsb,WAA7B,EAA0C;AACxCjZ,WAAOoB,KAAP,GAAezD,QAAQsb,WAAvB;AACAjZ,WAAOkZ,KAAP,CAAa9X,KAAb,GAAwBzD,QAAQsb,WAAhC;AACD;AACD;AACA,MAAIjZ,OAAOiB,MAAP,KAAkBtD,QAAQwb,YAA9B,EAA4C;AAC1CnZ,WAAOiB,MAAP,GAAgBtD,QAAQwb,YAAxB;AACAnZ,WAAOkZ,KAAP,CAAajY,MAAb,GAAyBtD,QAAQwb,YAAjC;AACD;AACF;;AAED;;;;;;;;;;;;;;;;;;;kBCfe,UAAUxb,OAAV,EAAmB;AAChC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAMyb,YAAYC,aAAarb,cAAb,CAAlB;;AAEA,MAAMgD,gBAAgBhD,eAAegC,MAAf,CAAsBiB,MAAtB,GAA+BmY,UAAUnY,MAA/D;AACA,MAAME,kBAAkBnD,eAAegC,MAAf,CAAsBoB,KAAtB,GAA8BgY,UAAUhY,KAAhE;;AAEA;AACApD,iBAAe+D,QAAf,CAAwBvC,KAAxB,GAAgC8B,KAAKC,GAAL,CAASJ,eAAT,EAA0BH,aAA1B,CAAhC;;AAEAhD,iBAAe+D,QAAf,CAAwB9B,WAAxB,CAAoCC,CAApC,GAAwC,CAAxC;AACAlC,iBAAe+D,QAAf,CAAwB9B,WAAxB,CAAoCE,CAApC,GAAwC,CAAxC;AACA,6BAAYxC,OAAZ;AACD,C;;AA5CD;;AACA;;;;;;AAEA;;;;;;AAMA,SAAS0b,YAAT,CAAuBrb,cAAvB,EAAuC;AACrC,MAAIA,eAAe+D,QAAf,CAAwBtB,QAAxB,KAAqC,CAArC,IAA0CzC,eAAe+D,QAAf,CAAwBtB,QAAxB,KAAqC,GAAnF,EAAwF;AACtF,WAAO;AACLW,aAAOpD,eAAeK,KAAf,CAAqB+C,KADvB;AAELH,cAAQjD,eAAeK,KAAf,CAAqB4C;AAFxB,KAAP;AAID;;AAED,SAAO;AACLG,WAAOpD,eAAeK,KAAf,CAAqB4C,MADvB;AAELA,YAAQjD,eAAeK,KAAf,CAAqB+C;AAFxB,GAAP;AAKD;;AAED;;;;;;;;;;;;;;;;;;;kBCZe,UAAUzD,OAAV,EAAmBuC,CAAnB,EAAsBC,CAAtB,EAAyBiB,KAAzB,EAAgCH,MAAhC,EAAwC;AACrD,MAAItD,YAAYC,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,0DAAV,CAAN;AACD;;AAEDqC,MAAIoB,KAAKmN,KAAL,CAAWvO,CAAX,CAAJ;AACAC,MAAImB,KAAKmN,KAAL,CAAWtO,CAAX,CAAJ;AACA,MAAMnC,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAM2b,eAAe,EAArB;AACA,MAAI1P,QAAQ,CAAZ;AACA,MAAMpD,YAAYxI,eAAeK,KAAf,CAAqBoI,YAArB,EAAlB;;AAEA,OAAK,IAAI8S,MAAM,CAAf,EAAkBA,MAAMtY,MAAxB,EAAgCsY,KAAhC,EAAuC;AACrC,SAAK,IAAIC,SAAS,CAAlB,EAAqBA,SAASpY,KAA9B,EAAqCoY,QAArC,EAA+C;AAC7C,UAAMC,UAAW,CAACF,MAAMpZ,CAAP,IAAYnC,eAAeK,KAAf,CAAqBgD,OAAlC,IAA8CmY,SAAStZ,CAAvD,CAAhB;;AAEAoZ,mBAAa1P,OAAb,IAAwBpD,UAAUiT,OAAV,CAAxB;AACD;AACF;;AAED,SAAOH,YAAP;AACD,C;;AAjCD,8C;;;;;;;;;;;;;QCegBlD,mB,GAAAA,mB;QAkDAsD,e,GAAAA,e;QAuDAC,e,GAAAA,e;QAgBAC,kB,GAAAA,kB;QAyBAjE,Y,GAAAA,Y;QAkBAkB,U,GAAAA,U;QAQAgD,sB,GAAAA,sB;;AA3LhB;;;;AACA;;;;;;AAEA;;;AAGA,IAAIpE,qBAAqB,OAAO,IAAP,GAAc,IAAvC,C,CAA6C;AAC7C,IAAIC,mBAAmB,CAAvB;;AAEA;AACA,IAAMoE,iBAAiB,EAAvB;;AAEA;AACO,IAAMtE,sCAAe,EAArB;;AAEA,SAASY,mBAAT,CAA8BC,QAA9B,EAAwC;AAC7C,MAAIA,aAAazY,SAAjB,EAA4B;AAC1B,UAAM,IAAIC,KAAJ,CAAU,+DAAV,CAAN;AACD;AACD,MAAIwY,SAASC,OAAT,KAAqB1Y,SAAzB,EAAoC;AAClC,UAAM,IAAIC,KAAJ,CAAU,0DAAV,CAAN;AACD;;AAED4X,uBAAqBY,QAArB;;AAEA,gDAAqB,yCAArB;;AAEAR;AACD;;AAED,SAASA,qBAAT,GAAkC;AAChC;AACA,MAAIH,oBAAoBD,kBAAxB,EAA4C;AAC1C;AACD;;AAED;AACA;AACA,WAASK,OAAT,CAAkBrJ,CAAlB,EAAqBC,CAArB,EAAwB;AACtB,QAAID,EAAEsJ,SAAF,GAAcrJ,EAAEqJ,SAApB,EAA+B;AAC7B,aAAO,CAAC,CAAR;AACD;AACD,QAAItJ,EAAEsJ,SAAF,GAAcrJ,EAAEqJ,SAApB,EAA+B;AAC7B,aAAO,CAAP;AACD;;AAED,WAAO,CAAP;AACD;AACDP,eAAa7H,IAAb,CAAkBmI,OAAlB;;AAEA;AACA,SAAOJ,mBAAmBD,kBAA1B,EAA8C;AAC5C,QAAMO,kBAAkBR,aAAaA,aAAazX,MAAb,GAAsB,CAAnC,CAAxB;AACA,QAAMG,UAAU8X,gBAAgB9X,OAAhC;;AAEA0b,uBAAmB1b,OAAnB;;AAEA,kDAAqB,qCAArB,EAA4D,EAAEA,gBAAF,EAA5D;AACD;;AAED,MAAMiY,YAAYR,cAAlB;;AAEA,gDAAqB,2BAArB,EAAkDQ,SAAlD;AACD;;AAEM,SAASuD,eAAT,CAA0Bxb,OAA1B,EAAmC6b,YAAnC,EAAiD;AACtD,MAAI7b,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,gDAAV,CAAN;AACD;AACD,MAAIkc,iBAAiBnc,SAArB,EAAgC;AAC9B,UAAM,IAAIC,KAAJ,CAAU,qDAAV,CAAN;AACD;AACD,MAAIic,eAAejL,cAAf,CAA8B3Q,OAA9B,MAA2C,IAA/C,EAAqD;AACnD,UAAM,IAAIL,KAAJ,CAAU,2CAAV,CAAN;AACD;;AAED,MAAM4Y,cAAc;AAClBuD,YAAQ,KADU;AAElB9b,oBAFkB;AAGlB+b,oBAAgBrc,SAHE,EAGS;AAC3Bmc,8BAJkB;AAKlBhE,eAAWtX,KAAKD,GAAL,EALO;AAMlByX,iBAAa;AANK,GAApB;;AASA6D,iBAAe5b,OAAf,IAA0BuY,WAA1B;AACAjB,eAAavX,IAAb,CAAkBwY,WAAlB;;AAEAsD,eAAaG,IAAb,CAAkB,UAAU7b,KAAV,EAAiB;AACjC,QAAImX,aAAaoB,OAAb,CAAqBH,WAArB,MAAsC,CAAC,CAA3C,EAA8C;AAC5C;AACA;AACD;;AAEDA,gBAAYuD,MAAZ,GAAqB,IAArB;AACAvD,gBAAYpY,KAAZ,GAAoBA,KAApB;;AAEA,QAAIA,MAAM4X,WAAN,KAAsBrY,SAA1B,EAAqC;AACnC,YAAM,IAAIC,KAAJ,CAAU,oDAAV,CAAN;AACD;AACD,QAAIQ,MAAM4X,WAAN,CAAkBK,OAAlB,KAA8B1Y,SAAlC,EAA6C;AAC3C,YAAM,IAAIC,KAAJ,CAAU,oDAAV,CAAN;AACD;;AAED4Y,gBAAYR,WAAZ,GAA0B5X,MAAM4X,WAAhC;AACAP,wBAAoBe,YAAYR,WAAhC;;AAEA,QAAMkE,eAAe;AACnBC,cAAQ,UADW;AAEnB/b,aAAOoY;AAFY,KAArB;;AAKA,kDAAqB,8BAArB,EAAqD0D,YAArD;;AAEA1D,gBAAYwD,cAAZ,GAA6B5b,MAAM4b,cAAnC;;AAEApE;AACD,GA7BD;AA8BD;;AAEM,SAAS8D,eAAT,CAA0Bzb,OAA1B,EAAmC;AACxC,MAAIA,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,gDAAV,CAAN;AACD;AACD,MAAM4Y,cAAcqD,eAAe5b,OAAf,CAApB;;AAEA,MAAIuY,gBAAgB7Y,SAApB,EAA+B;AAC7B;AACD;;AAED;AACA6Y,cAAYV,SAAZ,GAAwBtX,KAAKD,GAAL,EAAxB;;AAEA,SAAOiY,YAAYsD,YAAnB;AACD;;AAEM,SAASH,kBAAT,CAA6B1b,OAA7B,EAAsC;AAC3C,MAAIA,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,mDAAV,CAAN;AACD;AACD,MAAM4Y,cAAcqD,eAAe5b,OAAf,CAApB;;AAEA,MAAIuY,gBAAgB7Y,SAApB,EAA+B;AAC7B,UAAM,IAAIC,KAAJ,CAAU,2DAAV,CAAN;AACD;;AAED4Y,cAAYsD,YAAZ,CAAyBM,MAAzB;AACA7E,eAAa/P,MAAb,CAAoB+P,aAAaoB,OAAb,CAAqBH,WAArB,CAApB,EAAuD,CAAvD;AACAf,sBAAoBe,YAAYR,WAAhC;;AAEA,MAAMkE,eAAe;AACnBC,YAAQ,aADW;AAEnB/b,WAAOoY;AAFY,GAArB;;AAKA,gDAAqB,8BAArB,EAAqD0D,YAArD;AACAG,UAAQ7D,YAAYsD,YAApB;;AAEA,SAAOD,eAAe5b,OAAf,CAAP;AACD;;AAEM,SAASyX,YAAT,GAAyB;AAC9B,SAAO;AACLF,0CADK;AAELC,sCAFK;AAGLE,0BAAsBJ,aAAazX;AAH9B,GAAP;AAKD;;AAED;AACA;AACA,SAASuc,OAAT,CAAkBP,YAAlB,EAAgC;AAC9BA,eAAaG,IAAb,CAAkB,UAAU7b,KAAV,EAAiB;AACjC,QAAIA,MAAMic,OAAV,EAAmB;AACjBjc,YAAMic,OAAN;AACD;AACF,GAJD;AAKD;;AAEM,SAASzD,UAAT,GAAuB;AAC5B,SAAOrB,aAAazX,MAAb,GAAsB,CAA7B,EAAgC;AAC9B,QAAM+Y,qBAAqBtB,aAAa,CAAb,CAA3B;;AAEAoE,uBAAmB9C,mBAAmB5Y,OAAtC;AACD;AACF;;AAEM,SAAS2b,sBAAT,CAAiC3b,OAAjC,EAA0Cqc,YAA1C,EAAwD;AAC7D,MAAMC,aAAaV,eAAe5b,OAAf,CAAnB;;AAEA,MAAIsc,UAAJ,EAAgB;AACdA,eAAWT,YAAX,CAAwBG,IAAxB,CAA6B,UAAU7b,KAAV,EAAiB;AAC5C,UAAMoc,sBAAsBF,eAAelc,MAAM4X,WAAjD;;AAEA5X,YAAM4X,WAAN,GAAoBsE,YAApB;AACAC,iBAAWvE,WAAX,GAAyBsE,YAAzB;AACA7E,0BAAoB+E,mBAApB;;AAEA,UAAMN,eAAe;AACnBC,gBAAQ,iBADW;AAEnB/b;AAFmB,OAArB;;AAKA,oDAAqB,8BAArB,EAAqD8b,YAArD;AACD,KAbD;AAcD;AACF;;kBAEc;AACb5E,cAAYuE,cADC;AAEbtE,4BAFa;AAGbY,0CAHa;AAIbsD,kCAJa;AAKbC,kCALa;AAMbC,wCANa;AAObjE,4BAPa;AAQbkB,wBARa;AASbgD;AATa,C;;;;;;;;;;;;;kBCtMA,UAAUxb,KAAV,EAAiBqc,WAAjB,EAA8B;AAC3C,MAAIrc,MAAMsc,KAAN,IAAe,CAACtc,MAAMuc,UAA1B,EAAsC;AACpC,UAAM,IAAI/c,KAAJ,CAAU,0CAAV,CAAN;AACD;;AAED,MAAMgG,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA,MAAMF,YAAYtI,MAAM+C,KAAN,GAAc/C,MAAM4C,MAAtC;AACA,MAAM4Z,gBAAgBxc,MAAMwc,aAAN,IAAuBxc,MAAMoI,YAAN,EAA7C;AACA,MAAMqU,uBAAuB,IAAIC,UAAJ,CAAepU,YAAY,CAA3B,CAA7B;AACA,MAAIqU,WAAJ;AACA,MAAIC,eAAJ;;AAEA5c,QAAMsc,KAAN,GAAc,IAAd;AACAtc,QAAMuc,UAAN,GAAmB,IAAnB;AACAvc,QAAMwc,aAAN,GAAsBA,aAAtB;;AAEA,MAAIH,uBAAuB,gBAAO/Y,WAAlC,EAA+C;AAC7C+Y,gBAAYQ,KAAZ;;AAEA,WAAOrU,uBAAuBF,SAA9B,EAAyC;AACvCqU,WAAKH,cAAchU,sBAAd,CAAL;AACAoU,eAASP,YAAYpI,QAAZ,CAAqB0I,EAArB,CAAT;AACAF,2BAAqBlU,sBAArB,IAA+CqU,OAAO,CAAP,CAA/C;AACAH,2BAAqBlU,sBAArB,IAA+CqU,OAAO,CAAP,CAA/C;AACAH,2BAAqBlU,sBAArB,IAA+CqU,OAAO,CAAP,CAA/C;AACAH,2BAAqBlU,sBAArB,IAA+CqU,OAAO,CAAP,CAA/C;AACD;AACF,GAXD,MAWO,IAAIpX,gBAAgB,CAApB,EAAuB;AAC5B,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCqU,WAAKH,cAAchU,sBAAd,CAAL;AACAiU,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,KAAM,CAACnX,aAAnB,EAAmC,CAAnC,CAA/C,CAFuC,CAE+C;AACtFiX,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,KAAM,CAACnX,aAAnB,EAAmC,CAAnC,CAA/C,CAHuC,CAG+C;AACtFiX,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,KAAM,CAACnX,aAAnB,EAAmC,CAAnC,CAA/C,CAJuC,CAI+C;AACtFiX,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,KAAM,CAACnX,aAAnB,EAAmC,CAAnC,CAA/C,CALuC,CAK+C;AACvF;AACF,GARM,MAQA;AACL,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCqU,WAAKH,cAAchU,sBAAd,CAAL;AACAiU,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,EAAZ,EAAgB,CAAhB,CAA/C,CAFuC,CAE4B;AACnEF,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,EAAZ,EAAgB,CAAhB,CAA/C,CAHuC,CAG4B;AACnEF,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,EAAZ,EAAgB,CAAhB,CAA/C,CAJuC,CAI4B;AACnEF,2BAAqBlU,sBAArB,IAA+C8T,YAAYM,EAAZ,EAAgB,CAAhB,CAA/C,CALuC,CAK4B;AACpE;AACF;;AAED3c,QAAMwE,IAAN,GAAa,IAAb;AACAxE,QAAM2D,SAAN,GAAkBpE,SAAlB;AACAS,QAAMoF,MAAN,GAAe7F,SAAf;AACAS,QAAM6F,KAAN,GAAc,CAAd;AACA7F,QAAM8F,SAAN,GAAkB,CAAlB;AACA9F,QAAMwF,aAAN,GAAsB,CAAtB;AACAxF,QAAMuF,aAAN,GAAsB,GAAtB;AACAvF,QAAMgC,WAAN,GAAoB,GAApB;AACAhC,QAAMiC,YAAN,GAAqB,GAArB;AACAjC,QAAMoI,YAAN,GAAqB;AAAA,WAAMqU,oBAAN;AAAA,GAArB;AACD,C;;AAnED;;;;;;;;;;;;;;;;;;;;;;8CCCSK,O;;;;;;;;;gDACAA,O;;;;;;;;;uDACAA,O;;;;;;;;;0DACAA,O;;;;;;;;;qEACAA,O;;;;;;;;;0EACAA,O;;;;;;;;;6EACAA,O;;;;;;;;;mFACAA,O;;;;;;;;;0CAEAA,O;;;;;;;;;gCAGApT,mB;;;;;;;;;mCACAK,sB;;;;;;;;;6BACAxG,gB;;;;;;;;;iCACAiE,oB;;;;;;;;;2BACAgT,c;;;;;;;;;kDAEAsC,O;;;;;;;;;4CACAA,O;;;;;;;;;iDACAA,O;;;;;;;;;yCACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;2CACAA,O;;;;;;;;;+BACAC,c;;;;;;+BAAgBC,iB;;;;;;;;;4BAEvB/d,iB;;;;;;4BACAC,iB;;;;;;4BACAC,2B;;;;;;4BACAC,kB;;;;;;;;;mBAIA+K,Q;;;;;;mBACAC,W;;;;;;mBACAC,Q;;;;;;mBACAC,S;;;;;;mBACAC,gB;;;;;;mBACAC,c;;;;;;mBACAE,c;;;;;;mBACAD,a;;;;;;;;;gDAGOqS,O;;;;;;;;;+DACAA,O;;;;;;;;;6CACAA,O;;;;;;;;;8CACAA,O;;;;;;;;;oDACAA,O;;;;;;;;;gDACAA,O;;;;;;;;;wBAEPG,S;;;;;;wBACAC,iB;;;;;;wBACAC,mB;;;;;;wBACAC,0B;;;;;;;;;+CAGON,O;;;;;;;;;sDACAA,O;;;;;;;;;gDACAA,O;;;;;;;;;kDACAA,O;;;;;;;;;0CACAA,O;;;;;;;;;2CACAA,O;;;;;;;;;+DACAA,O;;;;;;;;;gDACAA,O;;;;;;;;;gDACAA,O;;;;;;;;;8DACAA,O;;;;;;;;;2CAEAA,O;;;;;;;;;+CACAA,O;;;;;;;;;6CACAA,O;;;;;;;;;2CACAA,O;;;;;;;;;2CACAA,O;;;;;;;;;8BAEAO,6B;;;;;;8BACPC,wB;;;;;;8BACAC,Y;;;;;;;;;2CAEOT,O;;;;;;;;;iDACAA,O;;;;;;;;;4BACApE,Q;;;;;;;;;;;;;;;;;kBCrBM,UAAU1W,WAAV,EAAuBC,YAAvB,EAAqCO,MAArC,EAA6C;AAC1D,MAAIA,MAAJ,EAAY;AACV,WAAOgb,wBAAwBhb,MAAxB,CAAP;AACD;;AAED,SAAOib,qBAAqBzb,WAArB,EAAkCC,YAAlC,CAAP;AACD,C;;;;AAjED;;AAEA;;;;;;;;;AASA;;;;;;AAMA,SAASwb,oBAAT,CAA+Bzb,WAA/B,EAA4CC,YAA5C,EAA0D;AACxD,SAAO,UAAUyb,gBAAV,EAA4B;AACjC,WAAO,CAAC,CAACA,mBAAmBzb,YAApB,IAAoCD,WAApC,GAAkD,GAAnD,IAA0D,KAAjE;AACD,GAFD;AAGD;;AAED;;;;;;;AAOA,SAASwb,uBAAT,CAAkChb,MAAlC,EAA0C;AACxC;AACA,MAAMmb,eAAe1a,KAAK2a,GAAL,gCAAYpb,OAAOmD,GAAnB,GAAwBkY,QAAxB,CAAiC,CAAjC,EAAoCne,MAAzD;AACA,MAAMoe,QAAQH,eAAe,CAA7B;AACA,MAAMzR,WAAW1J,OAAOmD,GAAP,CAAW,CAAX,KAAiBmY,KAAlC;AACA,MAAM3R,WAAW3J,OAAOmD,GAAP,CAAWnD,OAAOmD,GAAP,CAAWjG,MAAX,GAAoB,CAA/B,KAAqCoe,KAAtD;AACA,MAAM1R,iBAAiB5J,OAAO6J,gBAAP,GAA0B7J,OAAOmD,GAAP,CAAWjG,MAArC,GAA8C,CAArE;;AAEA,SAAO,UAAUge,gBAAV,EAA4B;AACjC,QAAIA,mBAAmBlb,OAAO6J,gBAA9B,EAAgD;AAC9C,aAAOH,QAAP;AACD,KAFD,MAEO,IAAIwR,oBAAoBtR,cAAxB,EAAwC;AAC7C,aAAOD,QAAP;AACD;;AAED,WAAO3J,OAAOmD,GAAP,CAAW+X,mBAAmBlb,OAAO6J,gBAArC,KAA0DyR,KAAjE;AACD,GARD;AASD;;AAED;;;;;;;;;;;;;;;;;;;;;;ACjDA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;kBAEe;AACbzY,gCADa;AAEb0Y,oCAFa;AAGbC,kDAHa;AAIbrW,wDAJa;AAKbsW,8EALa;AAMbC,sFANa;AAObtV,8FAPa;AAQbG,0GARa;AASboV,wFATa;AAUbC,sCAVa;AAWbC,kDAXa;AAYb3I;AAZa,C;;;;;;;;;;;;;kBCNA,UAAUtH,CAAV,EAAaC,CAAb,EAAgB;AAC7B;AACA,MAAI,CAACD,CAAD,IAAM,CAACC,CAAX,EAAc;AACZ,WAAO,IAAP;AACD;AACD;AACA,MAAI,CAACD,CAAD,IAAM,CAACC,CAAX,EAAc;AACZ,WAAO,KAAP;AACD;;AAED;AACA,SAAQD,EAAEqC,EAAF,KAASpC,EAAEoC,EAAnB;AACD,C;;;;;;;;;;;;;kBCRc,UAAUzQ,KAAV,EAAiB2F,GAAjB,EAAsBuC,mBAAtB,EAA2C;;AAExD,MAAIhE,QAAQ,oBAAZ;AACA,MAAMiE,YAAYnI,MAAMoI,YAAN,EAAlB;;AAEApI,QAAMoE,KAAN,CAAYiE,oBAAZ,GAAmC,uBAAQnE,KAA3C;;AAEA,MAAMsB,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA,MAAMF,YAAYH,UAAUzI,MAA5B;;AAEA;AACA;AACAwE,UAAQ,oBAAR;AACA,MAAIsB,gBAAgB,CAApB,EAAuB;AACrB,WAAOgD,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA9C,CADuC,CACkE;AACzG0C,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA9C,CAFuC,CAEkE;AACzG0C,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,IAAqC,CAAChD,aAA1C,CAA9C,CAHuC,CAGkE;AACzG0C,0BAAoBK,sBAApB,IAA8CJ,UAAUK,sBAAV,CAA9C;AACD;AACF,GAPD,MAOO;AACL,WAAOA,uBAAuBF,SAA9B,EAAyC;AACvCJ,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA9C,CADuC,CAC+C;AACtFN,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA9C,CAFuC,CAE+C;AACtFN,0BAAoBK,sBAApB,IAA8C5C,IAAIwC,UAAUK,sBAAV,CAAJ,CAA9C,CAHuC,CAG+C;AACtFN,0BAAoBK,sBAApB,IAA8CJ,UAAUK,sBAAV,CAA9C;AACD;AACF;AACDxI,QAAMoE,KAAN,CAAYuE,wCAAZ,GAAuD,uBAAQzE,KAA/D;AACD,C;;AA1CD;;;;;;;;;;;;;;;;;QCegBL,e,GAAAA,e;QAyBA0C,Y,GAAAA,Y;QAoOAnB,M,GAAAA,M;QAkCAoB,gB,GAAAA,gB;;AA5ShB;;AACA;;AACA;;;;AACA;;;;;;AALA;;AAOA,IAAMzC,eAAenD,SAASoD,aAAT,CAAuB,QAAvB,CAArB;AACA,IAAI4U,WAAJ;AACA,IAAI0F,uBAAJ;AACA,IAAIC,uBAAJ;AACA,IAAIC,qBAAqB,KAAzB;;QAESA,kB,GAAAA,kB;AAEF,SAAS3a,eAAT,GAA4B;AACjC,SAAOE,YAAP;AACD;;AAED,SAAS0a,WAAT,GAAwB;AACtB,OAAK,IAAMhO,EAAX,oBAA0B;AACxB;AACA,QAAM8I,SAAS,eAAQ9I,EAAR,CAAf;;AAEA8I,WAAOmF,UAAP,GAAoB,EAApB;AACAnF,WAAOoF,QAAP,GAAkB,EAAlB;AACApF,WAAOqF,IAAP;;AAEArF,WAAOW,OAAP,GAAiB,uCAAwBtB,EAAxB,EAA4BW,OAAOqF,IAAnC,EAAyCrF,OAAOsF,IAAhD,CAAjB;;AAEAtF,WAAOmF,UAAP,CAAkBI,gBAAlB,GAAqClG,GAAGmG,iBAAH,CAAqBxF,OAAOW,OAA5B,EAAqC,YAArC,CAArC;AACAtB,OAAGoG,uBAAH,CAA2BzF,OAAOmF,UAAP,CAAkBI,gBAA7C;;AAEAvF,WAAOmF,UAAP,CAAkBO,gBAAlB,GAAqCrG,GAAGmG,iBAAH,CAAqBxF,OAAOW,OAA5B,EAAqC,YAArC,CAArC;AACAtB,OAAGoG,uBAAH,CAA2BzF,OAAOmF,UAAP,CAAkBO,gBAA7C;;AAEA1F,WAAOoF,QAAP,CAAgBO,kBAAhB,GAAqCtG,GAAGuG,kBAAH,CAAsB5F,OAAOW,OAA7B,EAAsC,cAAtC,CAArC;AACD;AACF;;AAEM,SAAS3T,YAAT,GAAyB;AAC9B,MAAIiY,uBAAuB,IAA3B,EAAiC;AAC/B;AACA;AACD;;AAED,MAAIY,UAAUrb,YAAV,CAAJ,EAA6B;AAC3Bsb;AACAZ;AACA;AACA,YArCKD,kBAqCL,wBAAqB,IAArB;AACD;AACF;;AAED,SAASc,eAAT,CAA0B1G,EAA1B,EAA8B7V,KAA9B,EAAqCH,MAArC,EAA6C;AAC3CgW,KAAG2G,UAAH,CAAc3G,GAAG4G,YAAjB,EAA+B,IAAIC,YAAJ,CAAiB,CAC9C1c,KAD8C,EACvCH,MADuC,EAE9C,CAF8C,EAE3CA,MAF2C,EAG9CG,KAH8C,EAGvC,CAHuC,EAI9C,CAJ8C,EAI3C,CAJ2C,CAAjB,CAA/B,EAIU6V,GAAG8G,WAJb;AAKD;;AAED,SAASC,iBAAT,CAA4Blf,KAA5B,EAAmC;AACjCA,QAAMmf,cAAN;AACA7F,UAAQ8F,IAAR,CAAa,qBAAb;AACD;;AAED,SAASC,qBAAT,CAAgCrf,KAAhC,EAAuC;AACrCA,QAAMmf,cAAN;AACA,UAxDOpB,kBAwDP,wBAAqB,KAArB;AACA,yBAAahG,UAAb;AACAjS;AACA;AACD;;AAED,SAAS6Y,SAAT,CAAoBzd,MAApB,EAA4B;;AAE1BiX,OAAK,IAAL;AACA,MAAI;AACF;AACA,QAAM3T,UAAU;AACd8a,6BAAuB,IADT,CACc;AADd,KAAhB;;AAIA;AACA;AACA;AACA;AACA;;AAEAnH,SAAKjX,OAAOiD,UAAP,CAAkB,OAAlB,EAA2BK,OAA3B,KAAuCtD,OAAOiD,UAAP,CAAkB,oBAAlB,EAAwCK,OAAxC,CAA5C;;AAEA;AACAtD,WAAOqe,mBAAP,CAA2B,kBAA3B,EAA+CL,iBAA/C,EAAkE,KAAlE;AACAhe,WAAOse,gBAAP,CAAwB,kBAAxB,EAA4CN,iBAA5C,EAA+D,KAA/D;;AAEAhe,WAAOqe,mBAAP,CAA2B,sBAA3B,EAAmDF,qBAAnD,EAA0E,KAA1E;AACAne,WAAOse,gBAAP,CAAwB,sBAAxB,EAAgDH,qBAAhD,EAAuE,KAAvE;AAED,GArBD,CAqBE,OAAO9F,KAAP,EAAc;AACd,UAAM,IAAIxa,KAAJ,CAAU,8BAAV,CAAN;AACD;;AAED;AACA,MAAI,CAACoZ,EAAL,EAAS;AACPmB,YAAQC,KAAR,CAAc,8DAAd;AACApB,SAAK,IAAL;AACD;;AAED,SAAOA,EAAP;AACD;;AAED,SAASsH,gBAAT,CAA2BlgB,KAA3B,EAAkC;AAChC,MAAIA,MAAMsc,KAAV,EAAiB;AACf,WAAO,KAAP;AACD;;AAED,MAAI6D,WAAW,KAAf;;AAEA,MAAIngB,MAAMwF,aAAN,IAAuB,CAA3B,EAA8B;AAC5B2a,qBAAeA,QAAf;AACD;;AAED,MAAIngB,MAAMuF,aAAN,GAAsB,GAA1B,EAA+B;AAC7B4a,gBAAY,IAAZ;AACD,GAFD,MAEO;AACLA,gBAAY,GAAZ;AACD;;AAED,SAAOA,QAAP;AACD;;AAED,SAASC,gBAAT,CAA2BpgB,KAA3B,EAAkC;;AAEhC,MAAMmgB,WAAWD,iBAAiBlgB,KAAjB,CAAjB;AACA;AACA;AACA;;AAEA,MAAI,eAAQwQ,cAAR,CAAuB2P,QAAvB,CAAJ,EAAsC;AACpC,WAAO,eAAQA,QAAR,CAAP;AACD;;AAED,SAAO,eAAQjO,GAAf;AACD;;AAED,SAASmO,eAAT,CAA0BrgB,KAA1B,EAAiC;AAC/B,MAAMsgB,iBAAiB;AACrBC,WAAO3H,GAAG4H,SADW;AAErBC,UAAM7H,GAAG8H,eAFY;AAGrBC,YAAQ/H,GAAG8H,eAHU;AAIrBE,WAAOhI,GAAGiI,GAJW;AAKrB3O,SAAK0G,GAAGiI;AALa,GAAvB;;AAQA,MAAMC,gBAAgB;AACpBL,UAAM,CADc,EACX;AACTE,YAAQ,CAFY,EAET;AACXC,WAAO,CAHa,EAGV;AACV1O,SAAK,CAJe,CAIb;AAJa,GAAtB;;AAOA,MAAM6O,gBAAgBb,iBAAiBlgB,KAAjB,CAAtB;AACA,MAAMghB,SAASV,eAAeS,aAAf,CAAf;;AAEA;AACA,MAAME,UAAUrI,GAAGsI,aAAH,EAAhB;;AAEAtI,KAAGuI,WAAH,CAAevI,GAAGwI,UAAlB,EAA8BH,OAA9B;;AAEArI,KAAGyI,aAAH,CAAiBzI,GAAGwI,UAApB,EAAgCxI,GAAG0I,kBAAnC,EAAuD1I,GAAG2I,OAA1D;AACA3I,KAAGyI,aAAH,CAAiBzI,GAAGwI,UAApB,EAAgCxI,GAAG4I,kBAAnC,EAAuD5I,GAAG2I,OAA1D;AACA3I,KAAGyI,aAAH,CAAiBzI,GAAGwI,UAApB,EAAgCxI,GAAG6I,cAAnC,EAAmD7I,GAAG8I,aAAtD;AACA9I,KAAGyI,aAAH,CAAiBzI,GAAGwI,UAApB,EAAgCxI,GAAG+I,cAAnC,EAAmD/I,GAAG8I,aAAtD;AACA9I,KAAGgJ,WAAH,CAAehJ,GAAGiJ,gBAAlB,EAAoC,CAApC;;AAEA,MAAMC,YAAY,qBAAcf,aAAd,EAA6BgB,0BAA7B,CAAwD/hB,KAAxD,EAA+DA,MAAM+C,KAArE,EAA4E/C,MAAM4C,MAAlF,CAAlB;;AAEAgW,KAAGoJ,UAAH,CAAcpJ,GAAGwI,UAAjB,EAA6B,CAA7B,EAAgCJ,MAAhC,EAAwChhB,MAAM+C,KAA9C,EAAqD/C,MAAM4C,MAA3D,EAAmE,CAAnE,EAAsEoe,MAAtE,EAA8EpI,GAAGqJ,aAAjF,EAAgGH,SAAhG;;AAEA;AACA,MAAMlK,cAAc5X,MAAM+C,KAAN,GAAc/C,MAAM4C,MAApB,GAA6Bke,cAAcC,aAAd,CAAjD;;AAEA,SAAO;AACLE,oBADK;AAELrJ;AAFK,GAAP;AAID;;AAED,SAASS,eAAT,CAA0BrY,KAA1B,EAAiC;AAC/B,MAAImY,eAAe,uBAAaE,eAAb,CAA6BrY,MAAMH,OAAnC,CAAnB;;AAEA,MAAI,CAACsY,YAAL,EAAmB;AACjB;AACAA,mBAAekI,gBAAgBrgB,KAAhB,CAAf;AACA,2BAAakY,eAAb,CAA6BlY,KAA7B,EAAoCmY,YAApC;AACD;;AAED,SAAOA,aAAa8I,OAApB;AACD;;AAED,SAAS5B,WAAT,GAAwB;AACtBd,mBAAiB3F,GAAGsJ,YAAH,EAAjB;AACAtJ,KAAGuJ,UAAH,CAAcvJ,GAAG4G,YAAjB,EAA+BjB,cAA/B;AACA3F,KAAG2G,UAAH,CAAc3G,GAAG4G,YAAjB,EAA+B,IAAIC,YAAJ,CAAiB,CAC9C,CAD8C,EAC3C,CAD2C,EAE9C,CAF8C,EAE3C,CAF2C,EAG9C,CAH8C,EAG3C,CAH2C,EAI9C,CAJ8C,EAI3C,CAJ2C,CAAjB,CAA/B,EAKI7G,GAAG8G,WALP;;AAQApB,mBAAiB1F,GAAGsJ,YAAH,EAAjB;AACAtJ,KAAGuJ,UAAH,CAAcvJ,GAAG4G,YAAjB,EAA+BlB,cAA/B;AACA1F,KAAG2G,UAAH,CAAc3G,GAAG4G,YAAjB,EAA+B,IAAIC,YAAJ,CAAiB,CAC9C,GAD8C,EACzC,GADyC,EAE9C,GAF8C,EAEzC,GAFyC,EAG9C,GAH8C,EAGzC,GAHyC,EAI9C,GAJ8C,EAIzC,GAJyC,CAAjB,CAA/B,EAKI7G,GAAG8G,WALP;AAMD;;AAED,SAAS0C,UAAT,CAAqB7I,MAArB,EAA6B8I,UAA7B,EAAyCpB,OAAzC,EAAkDle,KAAlD,EAAyDH,MAAzD,EAAiE;AAC/DgW,KAAG0J,UAAH,CAAc,GAAd,EAAmB,GAAnB,EAAwB,GAAxB,EAA6B,GAA7B;AACA1J,KAAGlV,QAAH,CAAY,CAAZ,EAAe,CAAf,EAAkBX,KAAlB,EAAyBH,MAAzB;;AAEAgW,KAAG2J,KAAH,CAAS3J,GAAG4J,gBAAH,GAAsB5J,GAAG6J,gBAAlC;AACA7J,KAAG8J,UAAH,CAAcnJ,OAAOW,OAArB;;AAEAtB,KAAGuJ,UAAH,CAAcvJ,GAAG4G,YAAjB,EAA+BlB,cAA/B;AACA1F,KAAG+J,mBAAH,CAAuBpJ,OAAOmF,UAAP,CAAkBI,gBAAzC,EAA2D,CAA3D,EAA8DlG,GAAGgK,KAAjE,EAAwE,KAAxE,EAA+E,CAA/E,EAAkF,CAAlF;;AAEAhK,KAAGuJ,UAAH,CAAcvJ,GAAG4G,YAAjB,EAA+BjB,cAA/B;AACA3F,KAAG+J,mBAAH,CAAuBpJ,OAAOmF,UAAP,CAAkBO,gBAAzC,EAA2D,CAA3D,EAA8DrG,GAAGgK,KAAjE,EAAwE,KAAxE,EAA+E,CAA/E,EAAkF,CAAlF;;AAEA,OAAK,IAAMrS,GAAX,IAAkB8R,UAAlB,EAA8B;AAC5B,QAAMQ,kBAAkBjK,GAAGuG,kBAAH,CAAsB5F,OAAOW,OAA7B,EAAsC3J,GAAtC,CAAxB;;AAEA,QAAI,CAACsS,eAAL,EAAsB;AACpB;;AAEA;AACA;AACA;AACD;;AAED,QAAMC,UAAUT,WAAW9R,GAAX,CAAhB;;AAEA,QAAMhQ,OAAOuiB,QAAQviB,IAArB;AACA,QAAMwiB,QAAQD,QAAQC,KAAtB;;AAEA,QAAIxiB,SAAS,GAAb,EAAkB;AAChBqY,SAAGoK,SAAH,CAAaH,eAAb,EAA8BE,KAA9B;AACD,KAFD,MAEO,IAAIxiB,SAAS,GAAb,EAAkB;AACvBqY,SAAGqK,SAAH,CAAaJ,eAAb,EAA8BE,KAA9B;AACD,KAFM,MAEA,IAAIxiB,SAAS,IAAb,EAAmB;AACxBqY,SAAGsK,SAAH,CAAaL,eAAb,EAA8BE,MAAM,CAAN,CAA9B,EAAwCA,MAAM,CAAN,CAAxC;AACD;AACF;;AAEDzD,kBAAgB1G,EAAhB,EAAoB7V,KAApB,EAA2BH,MAA3B;;AAEAgW,KAAGuK,aAAH,CAAiBvK,GAAGwK,QAApB;AACAxK,KAAGuI,WAAH,CAAevI,GAAGwI,UAAlB,EAA8BH,OAA9B;AACArI,KAAGyK,UAAH,CAAczK,GAAG0K,cAAjB,EAAiC,CAAjC,EAAoC,CAApC;AAED;;AAEM,SAASle,MAAT,CAAiBzF,cAAjB,EAAiC;AACtC;AACA,MAAMK,QAAQL,eAAeK,KAA7B;;AAEA+D,eAAahB,KAAb,GAAqB/C,MAAM+C,KAA3B;AACAgB,eAAanB,MAAb,GAAsB5C,MAAM4C,MAA5B;;AAEA,MAAMc,WAAW/D,eAAe+D,QAAhC;;AAEA;AACA,MAAM6V,SAAS6G,iBAAiBpgB,KAAjB,CAAf;AACA,MAAMihB,UAAU5I,gBAAgBrY,KAAhB,CAAhB;AACA,MAAMqiB,aAAa;AACjBkB,kBAAc,EAAEhjB,MAAM,IAAR;AACZwiB,aAAO,CAAC/iB,MAAM+C,KAAP,EAAc/C,MAAM4C,MAApB,CADK,EADG;AAGjB4gB,QAAI,EAAEjjB,MAAM,GAAR;AACFwiB,aAAOrf,SAAS3B,GAAT,CAAaE,YADlB,EAHa;AAKjBwhB,QAAI,EAAEljB,MAAM,GAAR;AACFwiB,aAAOrf,SAAS3B,GAAT,CAAaC,WADlB,EALa;AAOjB6D,WAAO,EAAEtF,MAAM,GAAR;AACLwiB,aAAO/iB,MAAM6F,KADR,EAPU;AASjBC,eAAW,EAAEvF,MAAM,GAAR;AACTwiB,aAAO/iB,MAAM8F,SADJ,EATM;AAWjBN,mBAAe,EAAEjF,MAAM,GAAR;AACbwiB,aAAO/iB,MAAMwF,aADA,EAXE;AAajBtD,YAAQ,EAAE3B,MAAM,GAAR;AACNwiB,aAAOrf,SAASxB,MAAT,GAAkB,CAAlB,GAAsB,CADvB;AAbS,GAAnB;;AAiBAkgB,aAAW7I,MAAX,EAAmB8I,UAAnB,EAA+BpB,OAA/B,EAAwCjhB,MAAM+C,KAA9C,EAAqD/C,MAAM4C,MAA3D;;AAEA,SAAOmB,YAAP;AACD;;AAEM,SAASyC,gBAAT,GAA6B;AAClC;AACA;;AAEA,MAAMvB,UAAU;AACdye,kCAA8B;AADhB,GAAhB;;AAIA,MAAI;AACF,QAAM/hB,SAASf,SAASoD,aAAT,CAAuB,QAAvB,CAAf;;AAGA,WAAOb,QAAQlD,OAAO0jB,qBAAf,MACEhiB,OAAOiD,UAAP,CAAkB,OAAlB,EAA2BK,OAA3B,KAAuCtD,OAAOiD,UAAP,CAAkB,oBAAlB,EAAwCK,OAAxC,CADzC,CAAP;AAED,GAND,CAME,OAAO2e,CAAP,EAAU;AACV,WAAO,KAAP;AACD;AACF,C;;;;;;;;;;;;;;AC/TD;;AACA;;AACA;;AACA;;AACA;;AAEA,IAAMC,UAAU;AACdjD,yBADc;AAEdH,wBAFc;AAGdvO,qBAHc;AAIdyO,4BAJc;AAKdJ;AALc,CAAhB;;AAQA,IAAMuD,gBAAgB;AACpBlD,gCADoB;AAEpBH,+BAFoB;AAGpBvO,4BAHoB;AAIpByO,mCAJoB;AAKpBJ;AALoB,CAAtB;;QAQSsD,O,GAAAA,O;QAASC,a,GAAAA,a;;;;;;;;;;;;ACtBlB;;AAEA,IAAMC,cAAc,EAApB;;AAEA;;;;;;;;AAQA,SAAShC,0BAAT,CAAqC/hB,KAArC,EAA4C;;AAE1C;AACA;;AAEA;AACA,QAAMmI,YAAYnI,MAAMoI,YAAN,EAAlB;AACA,QAAM4b,mBAAmB,CAAzB;AACA,QAAMvf,OAAO,IAAIiY,UAAJ,CAAe1c,MAAM+C,KAAN,GAAc/C,MAAM4C,MAApB,GAA6BohB,gBAA5C,CAAb;AACA,QAAIve,SAAS,CAAb;;AAEA,SAAK,IAAIhG,IAAI,CAAb,EAAgBA,IAAI0I,UAAUzI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzC,YAAMwS,MAAMhP,KAAKghB,GAAL,CAAS9b,UAAU1I,CAAV,CAAT,CAAZ;;AAEAgF,aAAKgB,QAAL,IAAiBwM,MAAM,IAAvB;AACAxN,aAAKgB,QAAL,IAAiBwM,OAAO,CAAxB;AACAxN,aAAKgB,QAAL,IAAiB0C,UAAU1I,CAAV,IAAe,CAAf,GAAmB,CAAnB,GAAuB,CAAxC,CALyC,CAKE;AAC5C;;AAED,WAAOgF,IAAP;AACD;;AAEM,IAAMyf,kDAAqB;AAChCnC;AADgC,CAA3B;;AAIPgC,YAAYlF,IAAZ,GAAmB,6BACf,4BADe,GAEf,mBAFe,GAGf,mBAHe,GAIf,sBAJe,GAKf,0BALe,GAMf,qBANe,GAOf,0BAPe,GASf,eATe;AAUX;AACA,8CAXW;;AAaX;AACA,oDAdW,GAgBX,qBAhBW,GAiBP,yBAjBO;;AAmBX;AACA,4CApBW,GAqBX,2BArBW,GAsBX,8BAtBW,GAuBX,mDAvBW;;AAyBX;AACA,yCA1BW;;AA4BX;AACA,4DA7BW;;AA+BX;AACA,kBAhCW,GAiCP,4CAjCO,GAkCf,GAlCJ;;QAoCSkF,W,GAAAA,W;;;;;;;;;;;;AC1ET,IAAMI,aAAa,EAAnB;;AAEA;;;;;;;;AAQA,SAASpC,0BAAT,CAAqC/hB,KAArC,EAA4C;AAC1C;AACA;AACA,QAAMmI,YAAYnI,MAAMoI,YAAN,EAAlB;AACA,QAAM4b,mBAAmB,CAAzB;AACA,QAAMvf,OAAO,IAAIiY,UAAJ,CAAe1c,MAAM+C,KAAN,GAAc/C,MAAM4C,MAApB,GAA6BohB,gBAA5C,CAAb;AACA,QAAIve,SAAS,CAAb;;AAEA,SAAK,IAAIhG,IAAI,CAAb,EAAgBA,IAAI0I,UAAUzI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzCgF,aAAKgB,QAAL,IAAiB0C,UAAU1I,CAAV,CAAjB;AACAgF,aAAKgB,QAAL,IAAiB0C,UAAU1I,CAAV,IAAe,CAAf,GAAmB,CAAnB,GAAuB,CAAxC,CAFyC,CAEE;AAC5C;;AAED,WAAOgF,IAAP;AACD;;AAEM,IAAM2f,gDAAoB;AAC/BrC;AAD+B,CAA1B;;AAIPoC,WAAWtF,IAAX,GAAkB,6BACd,4BADc,GAEd,mBAFc,GAGd,mBAHc,GAId,sBAJc,GAKd,0BALc,GAMd,qBANc,GAOd,0BAPc,GASd,eATc;AAUV;AACA,8CAXU;;AAaV;AACA,iCAdU,GAgBV,qBAhBU,GAiBN,yBAjBM;;AAmBV;AACA,4CApBU,GAqBV,2BArBU,GAsBV,8BAtBU,GAuBV,mDAvBU;;AAyBV;AACA,yCA1BU;;AA4BV;AACA,4DA7BU;;AA+BV;AACA,kBAhCU,GAiCN,4CAjCM,GAkCd,GAlCJ;;QAoCSsF,U,GAAAA,U;;;;;;;;;;;;AClET,IAAME,YAAY,EAAlB;;AAEA;;;;;;;;AAQA,SAAStC,0BAAT,CAAqC/hB,KAArC,EAA4C;AAC1C,MAAMwF,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAI+C,uBAAuB,CAA3B;AACA,MAAIC,uBAAuB,CAA3B;AACA;AACA,MAAM8b,kBAAkBtkB,MAAM+C,KAAN,GAAc/C,MAAM4C,MAApB,GAA6B,CAArD;AACA,MAAM2hB,kBAAkBvkB,MAAM+C,KAAN,GAAc/C,MAAM4C,MAApB,GAA6B,CAArD;AACA,MAAM4hB,kBAAkBxkB,MAAMoI,YAAN,EAAxB;AACA,MAAM3D,OAAO,IAAIiY,UAAJ,CAAe6H,eAAf,CAAb;;AAEA;AACA;AACA,MAAI/e,gBAAgB,CAApB,EAAuB;AACrB,WAAOgD,uBAAuB8b,eAA9B,EAA+C;AAC7C7f,WAAK8D,sBAAL,IAA+Bic,gBAAgBhc,sBAAhB,IAA2C,CAAChD,aAA3E,CAD6C,CAC8C;AAC3Ff,WAAK8D,sBAAL,IAA+Bic,gBAAgBhc,sBAAhB,IAA2C,CAAChD,aAA3E,CAF6C,CAE8C;AAC3Ff,WAAK8D,sBAAL,IAA+Bic,gBAAgBhc,sBAAhB,IAA2C,CAAChD,aAA3E,CAH6C,CAG8C;AAC3FgD,8BAAwB,CAAxB,CAJ6C,CAIlB;AAC5B;AACF,GAPD,MAOO;AACL,WAAOA,uBAAuB8b,eAA9B,EAA+C;AAC7C7f,WAAK8D,sBAAL,IAA+Bic,gBAAgBhc,sBAAhB,CAA/B,CAD6C,CAC2B;AACxE/D,WAAK8D,sBAAL,IAA+Bic,gBAAgBhc,sBAAhB,CAA/B,CAF6C,CAE2B;AACxE/D,WAAK8D,sBAAL,IAA+Bic,gBAAgBhc,sBAAhB,CAA/B,CAH6C,CAG2B;AACxEA,8BAAwB,CAAxB,CAJ6C,CAIlB;AAC5B;AACF;;AAED,SAAO/D,IAAP;AACD;;AAEM,IAAMggB,8CAAmB;AAC9B1C;AAD8B,CAAzB;;AAIPsC,UAAUxF,IAAV,GAAiB,6BACb,4BADa,GAEb,mBAFa,GAGb,mBAHa,GAIb,sBAJa,GAKb,0BALa,GAMb,8BANa,GAOb,qBAPa,GAQb,0BARa,GAUb,eAVa;;AAYT;AACA,kDAbS;;AAeT;AACA,4CAhBS;;AAkBT;AACA,2CAnBS,GAoBT,8BApBS,GAqBT,2CArBS;;AAuBT;AACA,gCAxBS;;AA0BT;AACA,kBA3BS,GA4BL,2CA5BK,GA6Bb,GA7BJ;;QA+BSwF,S,GAAAA,S;;;;;;;;;;;;AC5ET;;AAEA,IAAMK,eAAe,EAArB;;AAEA;;;;;;;;AAQA,SAAS3C,0BAAT,CAAqC/hB,KAArC,EAA4C;;AAE1C;AACA;;AAEA;AACA,MAAMmI,YAAYnI,MAAMoI,YAAN,EAAlB;AACA,MAAM4b,mBAAmB,CAAzB;AACA,MAAMvf,OAAO,IAAIiY,UAAJ,CAAe1c,MAAM+C,KAAN,GAAc/C,MAAM4C,MAApB,GAA6BohB,gBAA5C,CAAb;AACA,MAAIve,SAAS,CAAb;;AAEA,OAAK,IAAIhG,IAAI,CAAb,EAAgBA,IAAI0I,UAAUzI,MAA9B,EAAsCD,GAAtC,EAA2C;AACzC,QAAMwS,MAAM9J,UAAU1I,CAAV,CAAZ;;AAEAgF,SAAKgB,QAAL,IAAiBwM,MAAM,IAAvB;AACAxN,SAAKgB,QAAL,IAAiBwM,OAAO,CAAxB;AACD;;AAED,SAAOxN,IAAP;AACD;;AAEM,IAAMkgB,oDAAsB;AACjC5C;AADiC,CAA5B;;AAIP2C,aAAa7F,IAAb,GAAoB,6BAChB,4BADgB,GAEhB,mBAFgB,GAGhB,mBAHgB,GAIhB,sBAJgB,GAKhB,0BALgB,GAMhB,qBANgB,GAOhB,0BAPgB,GAShB,eATgB;AAUZ;AACA,8CAXY;;AAaZ;AACA,oDAdY;;AAgBZ;AACA,4CAjBY,GAkBZ,2BAlBY,GAmBZ,8BAnBY,GAoBZ,mDApBY;;AAsBZ;AACA,yCAvBY;;AAyBZ;AACA,4DA1BY;;AA4BZ;AACA,kBA7BY,GA8BR,4CA9BQ,GA+BhB,GA/BJ;;QAiCS6F,Y,GAAAA,Y;;;;;;;;;;;;ACtET,IAAME,cAAc,EAApB;;AAEA;;;;;;;AAOA,SAAS7C,0BAAT,CAAqC/hB,KAArC,EAA4C;AAC1C;AACA,WAAOA,MAAMoI,YAAN,EAAP;AACD;;AAEM,IAAMyc,kDAAqB;AAChC9C;AADgC,CAA3B;;AAIP6C,YAAY/F,IAAZ,GAAmB,6BACf,4BADe,GAEf,mBAFe,GAGf,mBAHe,GAIf,sBAJe,GAKf,0BALe,GAMf,qBANe,GAOf,0BAPe,GASf,eATe;AAUX;AACA,8CAXW;;AAaX;AACA,kCAdW;;AAgBX;AACA,4CAjBW,GAkBX,2BAlBW,GAmBX,8BAnBW,GAoBX,mDApBW;;AAsBX;AACA,yCAvBW;;AAyBX;AACA,4DA1BW;;AA4BX;AACA,kBA7BW,GA8BP,4CA9BO,GA+Bf,GA/BJ;;QAiCS+F,W,GAAAA,W;;;;;;;;;;;;ACnDF,IAAM7L,sCAAe,+BACxB,4BADwB,GAExB,4BAFwB,GAGxB,0BAHwB,GAIxB,eAJwB,GAKpB,6CALoB,GAMpB,mCANoB,GAOpB,mCAPoB,GAQpB,oDARoB,GASpB,0BAToB,GAUxB,GAVG,C;;;;;;;;;;;;;kBCcQ,UAAUzZ,OAAV,EAAmBwlB,EAAnB,EAAuB;AACpC,MAAMnlB,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAM8B,YAAY,4BAAazB,cAAb,CAAlB;;AAEAyB,YAAUc,MAAV;;AAEA,SAAOd,UAAU2jB,cAAV,CAAyBD,GAAGjjB,CAA5B,EAA+BijB,GAAGhjB,CAAlC,CAAP;AACD,C;;AArBD;;AACA;;;;;;;;;;;;;;;;;kBCSe,UAAUxC,OAAV,EAAmB;AAChC,MAAIA,YAAYC,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,wCAAV,CAAN;AACD;;AAED;AACA,MAAMH,kBAAkB,0CAAxB;;AAEA,OAAK,IAAII,IAAI,CAAb,EAAgBA,IAAIJ,gBAAgBK,MAApC,EAA4CD,GAA5C,EAAiD;AAC/C,QAAIJ,gBAAgBI,CAAhB,EAAmBH,OAAnB,KAA+BA,OAAnC,EAA4C;AAC1C;;AAEA;AACA,UAAMuL,YAAY;AAChBvL;AADgB,OAAlB;;AAIA,kCAAaA,OAAb,EAAsB,4BAAtB,EAAoDuL,SAApD;;AAEA;AACAxL,sBAAgBI,CAAhB,EAAmBH,OAAnB,CAA2B0lB,WAA3B,CAAuC3lB,gBAAgBI,CAAhB,EAAmBkC,MAA1D;AACAtC,sBAAgBI,CAAhB,EAAmBkC,MAAnB,GAA4BpC,SAA5B;;AAEA;AACAF,sBAAgB+H,MAAhB,CAAuB3H,CAAvB,EAA0B,CAA1B;;AAEA;AACD;AACF;AACF,C;;AAvCD;;AACA;;;;;;;;;;;;;;;;;kBCgBe,UAAUH,OAAV,EAAmBU,KAAnB,EAA0B0D,QAA1B,EAAoC;AACjD,MAAIpE,YAAYC,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,uDAAV,CAAN;AACD;AACD,MAAIQ,UAAUT,SAAd,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,qDAAV,CAAN;AACD;;AAED,MAAMG,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAM2lB,WAAWtlB,eAAeK,KAAhC;;AAEAL,iBAAeK,KAAf,GAAuBA,KAAvB;;AAEA,MAAIL,eAAe6B,MAAf,IAAyB7B,eAAe6B,MAAf,CAAsB9B,MAAnD,EAA2D;AACzD,+BAAcJ,OAAd,EAAuBU,KAAvB;AACD;;AAED,MAAIL,eAAe+D,QAAf,KAA4BnE,SAAhC,EAA2C;AACzCI,mBAAe+D,QAAf,GAA0B,kCAAmB/D,eAAegC,MAAlC,EAA0C3B,KAA1C,CAA1B;AACD;;AAED;AACA,MAAI0D,QAAJ,EAAc;AACZ,SAAK,IAAMwhB,QAAX,IAAuBxhB,QAAvB,EAAiC;AAC/B,UAAIA,SAASwhB,QAAT,MAAuB,IAA3B,EAAiC;AAC/BvlB,uBAAe+D,QAAf,CAAwBwhB,QAAxB,IAAoCxhB,SAASwhB,QAAT,CAApC;AACD;AACF;AACF;;AAED,MAAIC,kBAAJ;;AAEA,MAAIxlB,eAAeylB,kBAAf,KAAsC7lB,SAA1C,EAAqD;AACnD,QAAM8lB,qBAAqB,uBAAQ1lB,eAAeylB,kBAAlD;;AAEAD,gBAAY,CAAC,OAAOE,kBAAR,EAA4BpN,OAA5B,EAAZ;AACD;;AAEDtY,iBAAeylB,kBAAf,GAAoC,oBAApC;;AAEA,MAAME,oBAAoB;AACxB5hB,cAAU/D,eAAe+D,QADD;AAExBpE,aAASK,eAAeL,OAFA;AAGxBU,WAAOL,eAAeK,KAHE;AAIxBilB,sBAJwB;AAKxBtlB,kCALwB;AAMxBwlB;AANwB,GAA1B;;AASA,8BAAaxlB,eAAeL,OAA5B,EAAqC,qBAArC,EAA4DgmB,iBAA5D;;AAEA,6BAAYhmB,OAAZ;AACD,C;;AArED;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCKe,YAAY;AACzB,SAAUimB,OAAOA,IAAjB,SAAyBA,IAAzB,SAAiCA,IAAjC,SACEA,IADF,SACUA,IADV,GACiBA,IADjB,GACwBA,IADxB;AAED,C;;AAbD,SAASA,EAAT,GAAe;AACb,SAAOtiB,KAAK8L,KAAL,CAAW,CAAC,IAAI9L,KAAKuiB,MAAL,EAAL,IAAsB,OAAjC,EAA0C3H,QAA1C,CAAmD,EAAnD,EACL4H,SADK,CACK,CADL,CAAP;AAED;;AAED;;;;;;;;;;;;;;;;;kBCQe,UAAUnmB,OAAV,EAAmB;AAChC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA,MAAIK,eAAeK,KAAf,KAAyBT,SAA7B,EAAwC;AACtC,UAAM,IAAIC,KAAJ,CAAU,qCAAV,CAAN;AACD;;AAED,2BAAUG,cAAV;AACD,C;;AAjBD;;AACA;;;;;;;;;;;;;;;;;kBCOe,YAAY;AACzB,MAAMN,kBAAkB,0CAAxB;;AAEA,OAAK,IAAII,IAAI,CAAb,EAAgBA,IAAIJ,gBAAgBK,MAApC,EAA4CD,GAA5C,EAAiD;AAC/C,QAAMimB,KAAKrmB,gBAAgBI,CAAhB,CAAX;;AAEA,QAAIimB,GAAGhkB,OAAH,KAAe,IAAnB,EAAyB;AACvB,+BAAUgkB,EAAV,EAAc,IAAd;AACD;AACF;AACF,C;;AAlBD;;AACA;;;;;;;;;;;;;;;;;kBCmBe,UAAUpmB,OAAV,EAAmB2F,OAAnB,EAA4B;AACzC,MAAI3F,YAAYC,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,+CAAV,CAAN;AACD;;AAED;AACA;AACA,MAAIyF,WAAWA,QAAQC,QAAnB,IAA+BD,QAAQC,QAAR,CAAiBC,WAAjB,OAAmC,OAAtE,EAA+E;AAC7E,QAAI,gBAAMD,QAAN,CAAesB,gBAAf,EAAJ,EAAuC;AACrC;AACA;AACA,sBAAMtB,QAAN,CAAeqB,YAAf;AACAtB,cAAQC,QAAR,GAAmB,OAAnB;AACD,KALD,MAKO;AACL;AACA;AACA6U,cAAQC,KAAR,CAAc,sDAAd;AACA,aAAO/U,QAAQC,QAAf;AACD;AACF;;AAED,MAAMvD,SAASf,SAASoD,aAAT,CAAuB,QAAvB,CAAf;;AAEA1E,UAAQqmB,WAAR,CAAoBhkB,MAApB;;AAEA,MAAMhC,iBAAiB;AACrBL,oBADqB;AAErBqC,kBAFqB;AAGrB3B,WAAOT,SAHc,EAGH;AAClBmC,aAAS,KAJY,EAIL;AAChBD,iBAAa,IALQ;AAMrBwD,oBANqB;AAOrBzD,YAAQ,EAPa;AAQrBiD,UAAM,EARe;AASrBX,oBAAgB;AATK,GAAvB;;AAYA,0CAAkBnE,cAAlB;;AAEA,wBAAOL,OAAP,EAAgB,IAAhB;;AAEA;;;;;;AAMA,WAASsmB,IAAT,CAAeC,SAAf,EAA0B;AACxB,QAAIlmB,eAAegC,MAAf,KAA0BpC,SAA9B,EAAyC;AACvC;AACD;;AAED,QAAMuc,eAAe;AACnBnc,oCADmB;AAEnBkmB;AAFmB,KAArB;;AAKA,gCAAalmB,eAAeL,OAA5B,EAAqC,sBAArC,EAA6Dwc,YAA7D;;AAEA,QAAInc,eAAe8B,WAAf,IAA8BqkB,iBAAiBnmB,cAAjB,CAAlC,EAAoE;AAClE,mCAAcA,cAAd,EAA8BA,eAAe+B,OAA7C;AACD;;AAED,yCAAsBkkB,IAAtB;AACD;;AAEDA;AACD,C;;AA3FD;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA;;;;AAIA,SAASE,gBAAT,CAA2BnmB,cAA3B,EAA2C;AACzC,SAAOA,eAAeK,KAAf,KAAyBT,SAAzB,IAAsCI,eAAe6B,MAAf,CAAsB9B,MAAnE;AACD;;AAGD;;;;;;;;;;;;;;;;;;;;kBCDe,UAAUC,cAAV,EAA0B4B,WAA1B,EAAuC;AACpD,MAAMvB,QAAQL,eAAeK,KAA7B;AACA,MAAMV,UAAUK,eAAeL,OAA/B;AACA,MAAMkC,SAAS7B,eAAe6B,MAAf,IAAyB,EAAxC;;AAEA;AACA,MAAI,CAAC7B,eAAegC,MAAhB,IAA0B,EAAEhC,eAAeK,KAAf,IAAwBwB,OAAO9B,MAAjC,CAA9B,EAAwE;AACtE;AACD;;AAED;AACA,MAAMwE,QAAQ,oBAAd;;AAEAlE,QAAMoE,KAAN,GAAc;AACZiE,0BAAsB,CAAC,GADX;AAEZM,8CAA0C,CAAC,GAF/B;AAGZhE,0BAAsB,CAAC,GAHX;AAIZohB,oBAAgB,CAAC,GAJL;AAKZ1hB,yBAAqB,CAAC;AALV,GAAd;;AAQA,MAAI7C,UAAUA,OAAO9B,MAArB,EAA6B;AAC3B,sCAAmBC,cAAnB,EAAmC4B,WAAnC;AACD,GAFD,MAEO,IAAIvB,KAAJ,EAAW;AAChB,QAAIoF,SAASpF,MAAMoF,MAAnB;;AAEA,QAAI,CAACA,MAAL,EAAa;AACX,UAAIzF,eAAe+D,QAAf,CAAwBjB,QAAxB,IACA9C,eAAe+D,QAAf,CAAwBjB,QAAxB,KAAqC,EADrC,IAEA9C,eAAeK,KAAf,CAAqB0C,QAArB,KAAkC,IAFtC,EAE4C;AAC1C0C;AACD,OAJD,MAIO,IAAIzF,eAAe+D,QAAf,CAAwBjB,QAAxB,IAAoC9C,eAAe+D,QAAf,CAAwBjB,QAAxB,KAAqC,EAA7E,EAAiF;AACtF2C;AACD,OAFM,MAEA,IAAIpF,MAAMsc,KAAV,EAAiB;AACtBlX;AACD,OAFM,MAEA;AACLA;AACD;AACF;;AAEDA,WAAOzF,cAAP,EAAuB4B,WAAvB;AACD;;AAED;AACA,MAAMykB,iBAAiB,uBAAQ9hB,KAA/B;;AAEA,MAAM2G,YAAY;AAChBnH,cAAU/D,eAAe+D,QADT;AAEhBpE,oBAFgB;AAGhBU,gBAHgB;AAIhBL,kCAJgB;AAKhBsG,mBAAetG,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CALC;AAMhBohB;AANgB,GAAlB;;AASAhmB,QAAMoE,KAAN,CAAY2hB,cAAZ,GAA6BC,cAA7B;;AAEArmB,iBAAe+B,OAAf,GAAyB,KAAzB;AACA/B,iBAAe8B,WAAf,GAA6B,KAA7B;;AAEA,8BAAanC,OAAb,EAAsB,0BAAtB,EAAkDuL,SAAlD;AACD,C;;AA5ED;;;;AACA;;;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;kBCgHe,UAAUlL,cAAV,EAA0B4B,WAA1B,EAAuC;AACpD,MAAMjC,UAAUK,eAAeL,OAA/B;AACA,MAAM2mB,YAAY,uBAAU3mB,OAAV,CAAlB;AACA,MAAM4mB,cAAc,4BAAe5mB,OAAf,CAApB;AACA,MAAM6mB,gBAAgB,8BAAiB7mB,OAAjB,CAAtB;AACA,MAAM8mB,WAAW,CAACzmB,eAAe0mB,sBAAhB,IAA0C1mB,eAAe0L,aAA1E;;AAEA;AACA;AACA1L,iBAAe0mB,sBAAf,GAAwC1mB,eAAe0L,aAAvD;;AAEA;AACA;AACA,MAAI+a,QAAJ,EAAc;AACZH,cAAUlmB,OAAV,CAAkB,UAAUuF,KAAV,EAAiB;AACjC,UAAIA,MAAM5B,QAAV,EAAoB;AAClB4iB,8BAAsBhhB,MAAMsF,OAA5B,IAAuCtF,MAAM5B,QAAN,CAAevC,KAAtD;AACD;AACF,KAJD;AAKD;;AAED;AACA,MAAIxB,eAAe0L,aAAf,KAAiC,IAArC,EAA2C;AACzCA,kBAAc8a,aAAd,EAA6BD,WAA7B;AACD;;AAED;AACA,MAAMhlB,UAAUvB,eAAegC,MAAf,CAAsBiD,UAAtB,CAAiC,IAAjC,CAAhB;;AAEA1D,UAAQG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;;AAEA;AACAH,UAAQ2D,SAAR,GAAoB,OAApB;AACA3D,UAAQ4D,QAAR,CAAiB,CAAjB,EAAoB,CAApB,EAAuBnF,eAAegC,MAAf,CAAsBoB,KAA7C,EAAoDpD,eAAegC,MAAf,CAAsBiB,MAA1E;;AAEA;AACA2jB,eAAarlB,OAAb,EAAsBilB,aAAtB,EAAqC5kB,WAArC;AACD,C;;AA3JD;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA;AACA,IAAM+kB,wBAAwB,EAA9B;;AAEA,SAASE,gBAAT,CAA2BC,WAA3B,EAAwCC,aAAxC,EAAuD;AACrD,SAAOJ,sBAAsBI,aAAtB,IAAuCJ,sBAAsBG,WAAtB,CAA9C;AACD;;AAED;AACA,SAASpb,aAAT,CAAwB7J,MAAxB,EAAgC0kB,WAAhC,EAA6C;AAC3C;AACA;AACA1kB,SAAOzB,OAAP,CAAe,UAACuF,KAAD,EAAW;AACxB;AACA;AACA,QAAIA,UAAU4gB,WAAV,IACA,CAAC5gB,MAAM5B,QADP,IAEA,CAACwiB,YAAYxiB,QAFjB,EAE2B;AACzB;AACD;;AAED,QAAI,CAAC4iB,sBAAsBhhB,MAAMsF,OAA5B,CAAL,EAA2C;AACzC0b,4BAAsBhhB,MAAMsF,OAA5B,IAAuCtF,MAAM5B,QAAN,CAAevC,KAAtD;AACD;;AAED,QAAMgK,gBAAgBqb,iBAAiBN,YAAYtb,OAA7B,EAAsCtF,MAAMsF,OAA5C,CAAtB;;AAEA;AACA;AACAtF,UAAM5B,QAAN,CAAevC,KAAf,GAAuB+kB,YAAYxiB,QAAZ,CAAqBvC,KAArB,GAA6BgK,aAApD;AACA7F,UAAM5B,QAAN,CAAetB,QAAf,GAA0B8jB,YAAYxiB,QAAZ,CAAqBtB,QAA/C;AACAkD,UAAM5B,QAAN,CAAe9B,WAAf,GAA6B;AAC3BC,SAAIqkB,YAAYxiB,QAAZ,CAAqB9B,WAArB,CAAiCC,CAAjC,GAAqCsJ,aADd;AAE3BrJ,SAAIokB,YAAYxiB,QAAZ,CAAqB9B,WAArB,CAAiCE,CAAjC,GAAqCqJ;AAFd,KAA7B;AAIA7F,UAAM5B,QAAN,CAAerB,KAAf,GAAuB6jB,YAAYxiB,QAAZ,CAAqBrB,KAA5C;AACAiD,UAAM5B,QAAN,CAAepB,KAAf,GAAuB4jB,YAAYxiB,QAAZ,CAAqBpB,KAA5C;AACD,GAzBD;AA0BD;;AAED;;;;;;;;AAQA,SAASikB,YAAT,CAAuBrlB,OAAvB,EAAgCM,MAAhC,EAAwCD,WAAxC,EAAqD;AACnD;AACAC,SAAOzB,OAAP,CAAe,UAACuF,KAAD,EAAQiG,KAAR,EAAkB;AAC/B,QAAI,CAACjG,MAAMtF,KAAX,EAAkB;AAChB;AACD;;AAEDkB,YAAQylB,IAAR;;AAEA;AACArhB,UAAM3D,MAAN,GAAeT,QAAQS,MAAvB;AACA,8CAA2B2D,KAA3B,EAAkCpE,OAAlC;;AAEA;AACA,QAAMuB,WAAW6C,MAAM5B,QAAN,CAAejB,QAAf,IAA2B6C,MAAML,OAAN,CAAcxC,QAA1D;AACA,QAAMC,WAAW4C,MAAM5B,QAAN,CAAehB,QAAhC;AACA,QAAMkkB,YAAYthB,MAAM5D,OAAN,IAAiBH,WAAnC;;AAEA,QAAIkB,YAAYA,aAAa,EAAzB,IAA+BC,aAAa,IAAhD,EAAsD;AACpD,iDAAiB4C,KAAjB,EAAwBshB,SAAxB;AACD,KAFD,MAEO,IAAInkB,YAAYA,aAAa,EAA7B,EAAiC;AACtC,uDAAoB6C,KAApB,EAA2BshB,SAA3B;AACD,KAFM,MAEA,IAAIthB,MAAMtF,KAAN,CAAYsc,KAAZ,KAAsB,IAA1B,EAAgC;AACrC,2CAAchX,KAAd,EAAqBshB,SAArB;AACD,KAFM,MAEA;AACL;AACA,UAAMlf,kBAAmB6D,UAAU,CAAnC;;AAEA,mDAAkBjG,KAAlB,EAAyBshB,SAAzB,EAAoClf,eAApC;AACD;;AAED;AACA,QAAIpC,MAAML,OAAN,IAAiBK,MAAML,OAAN,CAAc4G,OAAnC,EAA4C;AAC1C3K,cAAQ2lB,WAAR,GAAsBvhB,MAAML,OAAN,CAAc4G,OAApC;AACD,KAFD,MAEO;AACL3K,cAAQ2lB,WAAR,GAAsB,CAAtB;AACD;;AAED,QAAIvhB,MAAML,OAAN,IAAiBK,MAAML,OAAN,CAAcJ,SAAnC,EAA8C;AAC5C3D,cAAQ2D,SAAR,GAAoBS,MAAML,OAAN,CAAcJ,SAAlC;AACD;;AAED;AACA;AACA3D,YAAQ6D,qBAAR,GAAgC,CAACO,MAAM5B,QAAN,CAAevB,gBAAhD;AACAjB,YAAQ8D,wBAAR,GAAmC9D,QAAQ6D,qBAA3C;;AAEA;AA7C+B,uBA8CLO,MAAMtF,KA9CD;AAAA,QA8CvB+C,KA9CuB,gBA8CvBA,KA9CuB;AAAA,QA8ChBH,MA9CgB,gBA8ChBA,MA9CgB;;;AAgD/B1B,YAAQmE,SAAR,CAAkBC,MAAM3D,MAAxB,EAAgC,CAAhC,EAAmC,CAAnC,EAAsCoB,KAAtC,EAA6CH,MAA7C,EAAqD,CAArD,EAAwD,CAAxD,EAA2DG,KAA3D,EAAkEH,MAAlE;AACA1B,YAAQ4lB,OAAR;;AAEAxhB,UAAM5D,OAAN,GAAgB,KAAhB;AACD,GApDD;AAqDD;;AAED;;;;;;;;;;;;;;;;;;QCrGgBqb,c,GAAAA,c;QAmBAC,iB,GAAAA,iB;;AA7BhB;;AAEA;;;;;;;;AAQO,SAASD,cAAT,CAAyBzd,OAAzB,EAAkCynB,QAAlC,EAA4C;AACjD,MAAMrB,KAAK,wCAAkBpmB,OAAlB,CAAX;;AAEA,MAAIomB,GAAGjhB,IAAH,CAAQ+L,cAAR,CAAuBuW,QAAvB,MAAqC,KAAzC,EAAgD;AAC9CrB,OAAGjhB,IAAH,CAAQsiB,QAAR,IAAoB,EAApB;AACD;;AAED,SAAOrB,GAAGjhB,IAAH,CAAQsiB,QAAR,CAAP;AACD;;AAED;;;;;;;;;AASO,SAAS/J,iBAAT,CAA4B1d,OAA5B,EAAqCynB,QAArC,EAA+C;AACpD,MAAMrB,KAAK,wCAAkBpmB,OAAlB,CAAX;;AAEA,SAAOomB,GAAGjhB,IAAH,CAAQsiB,QAAR,CAAP;AACD,C;;;;;;;;;;;;;kBCrBc,UAAUznB,OAAV,EAAmBU,KAAnB,EAA0B;AACvC,MAAML,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA,SAAO,kCAAmBK,eAAegC,MAAlC,EAA0C3B,KAA1C,CAAP;AACD,C;;AAhBD;;AACA;;;;;;;;;;;;;;;;;kBCQe,UAAUV,OAAV,EAAmB;AAChC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA,SAAOK,eAAeK,KAAtB;AACD,C;;AAbD,8C;;;;;;;;;;;;;kBCce,UAAUV,OAAV,EAAmBuC,CAAnB,EAAsBC,CAAtB,EAAyBiB,KAAzB,EAAgCH,MAAhC,EAAwC;AACrD,MAAMqY,eAAe,+BAAgB3b,OAAhB,EAAyBuC,CAAzB,EAA4BC,CAA5B,EAA+BiB,KAA/B,EAAsCH,MAAtC,CAArB;AACA,MAAM8iB,KAAK,wCAAkBpmB,OAAlB,CAAX;AACA,MAAMsG,SAAS,8BAAe8f,GAAG1lB,KAAH,CAAS6F,KAAxB,EAA+B6f,GAAG1lB,KAAH,CAAS8F,SAAxC,EAAmD4f,GAAGhiB,QAAH,CAAYnB,WAA/D,CAAf;;AAEA,SAAO0Y,aAAa+L,GAAb,CAAiBphB,MAAjB,CAAP;AACD,C;;AApBD;;AACA;;;;AACA;;;;;;;;;;;;;;;;;kBCMe,UAAUtG,OAAV,EAAmB;AAChC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAMoE,WAAW/D,eAAe+D,QAAhC;;AAEA,MAAIA,aAAanE,SAAjB,EAA4B;AAC1B;AACD;;AAED;AACA,SAAOmH,OAAO0E,MAAP,CAAc,EAAd,EAAkB1H,QAAlB,CAAP;AACD,C;;AAlBD,8C;;;;;;;;;;;;QC2DgBuZ,S,GAAAA,S;QA2BAC,iB,GAAAA,iB;QAyBAC,mB,GAAAA,mB;QAWAC,0B,GAAAA,0B;;AA1HhB;;AACA;;;;AACA;;;;;;AAEA;;;;AAKA,IAAM6J,eAAe,EAArB;;AAEA,IAAIC,2BAAJ;;AAEA;;;;;;;;;;;AAWA,SAASC,wBAAT,CAAmCtnB,OAAnC,EAA4CoF,OAA5C,EAAqD;AACnD,MAAMmiB,aAAavnB,QAAQ0Y,OAAR,CAAgB,GAAhB,CAAnB;AACA,MAAM8O,SAASxnB,QAAQ4lB,SAAR,CAAkB,CAAlB,EAAqB2B,UAArB,CAAf;AACA,MAAME,SAASL,aAAaI,MAAb,CAAf;AACA,MAAI3L,qBAAJ;;AAEA,MAAI4L,WAAW/nB,SAAX,IAAwB+nB,WAAW,IAAvC,EAA6C;AAC3C,QAAIJ,uBAAuB3nB,SAA3B,EAAsC;AACpCmc,qBAAewL,mBAAmBrnB,OAAnB,CAAf;;AAEA,aAAO6b,YAAP;AACD;;AAED,UAAM,IAAIlc,KAAJ,CAAU,uDAAV,CAAN;AACD;;AAEDkc,iBAAe4L,OAAOznB,OAAP,EAAgBoF,OAAhB,CAAf;;AAEA;AACAyW,eAAaG,IAAb,CAAkB,UAAU7b,KAAV,EAAiB;AACjC,kDAAqB,wBAArB,EAA+C,EAAEA,YAAF,EAA/C;AACD,GAFD;;AAIA,SAAO0b,YAAP;AACD;;AAED;;;;;;;;;AASO,SAASuB,SAAT,CAAoBpd,OAApB,EAA6BoF,OAA7B,EAAsC;AAC3C,MAAIpF,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,oDAAV,CAAN;AACD;;AAED,MAAIkc,eAAe,iCAAgB7b,OAAhB,CAAnB;;AAEA,MAAI6b,iBAAiBnc,SAArB,EAAgC;AAC9B,WAAOmc,YAAP;AACD;;AAEDA,iBAAeyL,yBAAyBtnB,OAAzB,EAAkCoF,OAAlC,CAAf;;AAEA,SAAOyW,YAAP;AACD;;AAED;;AAEA;;;;;;;;;AASO,SAASwB,iBAAT,CAA4Brd,OAA5B,EAAqCoF,OAArC,EAA8C;AACnD,MAAIpF,YAAYN,SAAhB,EAA2B;AACzB,UAAM,IAAIC,KAAJ,CAAU,4DAAV,CAAN;AACD;;AAED,MAAIkc,eAAe,iCAAgB7b,OAAhB,CAAnB;;AAEA,MAAI6b,iBAAiBnc,SAArB,EAAgC;AAC9B,WAAOmc,YAAP;AACD;;AAEDA,iBAAeyL,yBAAyBtnB,OAAzB,EAAkCoF,OAAlC,CAAf;;AAEA,mCAAgBpF,OAAhB,EAAyB6b,YAAzB;;AAEA,SAAOA,YAAP;AACD;;AAED;;;;;;;AAOO,SAASyB,mBAAT,CAA8BkK,MAA9B,EAAsCE,WAAtC,EAAmD;AACxDN,eAAaI,MAAb,IAAuBE,WAAvB;AACD;;AAED;;;;;;;AAOO,SAASnK,0BAAT,CAAqCmK,WAArC,EAAkD;AACvD,MAAMC,iBAAiBN,kBAAvB;;AAEAA,uBAAqBK,WAArB;;AAEA,SAAOC,cAAP;AACD,C;;;;;;;;;;;;;kBCpHc,UAAUloB,OAAV,EAAmB;AAChC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEAK,iBAAe+B,OAAf,GAAyB,IAAzB;AACA/B,iBAAe8B,WAAf,GAA6B,IAA7B;AACA,MAAMoJ,YAAY;AAChBvL;AADgB,GAAlB;;AAIA,8BAAaA,OAAb,EAAsB,wBAAtB,EAAgDuL,SAAhD;AACD,C;;AAtBD;;AACA;;;;;;;;;;;;;;;;;kBCae,UAAUhL,OAAV,EAAmB;;AAEhC,MAAMR,kBAAkB,kDAA4BQ,OAA5B,CAAxB;;AAEAR,kBAAgBU,OAAhB,CAAwB,UAAUJ,cAAV,EAA0B;AAChD,6BAAUA,cAAV,EAA0B,IAA1B;AACD,GAFD;AAGD,C;;AAjBD;;AACA;;;;;;;;;;;;;;;;;kBCQe,UAAUL,OAAV,EAAmBmoB,KAAnB,EAA0BC,KAA1B,EAAiC;AAC9C,MAAM/nB,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEA,MAAIK,eAAeK,KAAf,KAAyBT,SAA7B,EAAwC;AACtC,UAAM,IAAIC,KAAJ,CAAU,+BAAV,CAAN;AACD;;AAED;AACA,MAAMmoB,OAAOroB,QAAQsoB,qBAAR,EAAb;AACA,MAAMC,UAAUJ,QAAQE,KAAK/Y,IAAb,GAAoB3O,OAAO6nB,WAA3C;AACA,MAAMC,UAAUL,QAAQC,KAAKK,GAAb,GAAmB/nB,OAAOgoB,WAA1C;;AAEA,MAAMnD,KAAK,EAAEjjB,GAAGgmB,OAAL;AACT/lB,OAAGimB,OADM,EAAX;AAEA,MAAM3mB,YAAY,4BAAazB,cAAb,CAAlB;;AAEAyB,YAAUc,MAAV;;AAEA,SAAOd,UAAU2jB,cAAV,CAAyBD,GAAGjjB,CAA5B,EAA+BijB,GAAGhjB,CAAlC,CAAP;AACD,C;;AAhCD;;AACA;;;;;;;;;;;;;;;;;kBCYe,UAAUxC,OAAV,EAAmBwlB,EAAnB,EAAuB;AACpC,MAAMnlB,iBAAiB,wCAAkBL,OAAlB,CAAvB;AACA,MAAM8B,YAAY,4BAAazB,cAAb,CAAlB;;AAGA,SAAOyB,UAAU2jB,cAAV,CAAyBD,GAAGjjB,CAA5B,EAA+BijB,GAAGhjB,CAAlC,CAAP;AACD,C;;AAnBD;;AACA;;;;;;;;;;;;;;;;;kBCSe,UAAUxC,OAAV,EAAmB;AAChC,MAAMK,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEAK,iBAAe+D,QAAf,GAA0B,kCAAmB/D,eAAegC,MAAlC,EAA0ChC,eAAeK,KAAzD,CAA1B;AACA,6BAAYV,OAAZ;AACD,C;;AAfD;;AACA;;;;AACA;;;;;;;;;;;;;;;;;kBCWe,UAAUA,OAAV,EAAmBoE,QAAnB,EAA6B;AAC1C,MAAM/D,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAEAK,iBAAe+D,QAAf,CAAwB9B,WAAxB,CAAoCC,CAApC,GAAwC6B,SAAS9B,WAAT,CAAqBC,CAA7D;AACAlC,iBAAe+D,QAAf,CAAwB9B,WAAxB,CAAoCE,CAApC,GAAwC4B,SAAS9B,WAAT,CAAqBE,CAA7D;AACAnC,iBAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BE,YAA5B,GAA2CyB,SAAS3B,GAAT,CAAaE,YAAxD;AACAtC,iBAAe+D,QAAf,CAAwBxB,MAAxB,GAAiCwB,SAASxB,MAA1C;AACAvC,iBAAe+D,QAAf,CAAwBvB,gBAAxB,GAA2CuB,SAASvB,gBAApD;AACAxC,iBAAe+D,QAAf,CAAwBtB,QAAxB,GAAmCsB,SAAStB,QAA5C;AACAzC,iBAAe+D,QAAf,CAAwBrB,KAAxB,GAAgCqB,SAASrB,KAAzC;AACA1C,iBAAe+D,QAAf,CAAwBpB,KAAxB,GAAgCoB,SAASpB,KAAzC;AACA3C,iBAAe+D,QAAf,CAAwBnB,WAAxB,GAAsCmB,SAASnB,WAA/C;AACA5C,iBAAe+D,QAAf,CAAwBlB,MAAxB,GAAiCkB,SAASlB,MAA1C;AACA7C,iBAAe+D,QAAf,CAAwBjB,QAAxB,GAAmCiB,SAASjB,QAA5C;AACA9C,iBAAe+D,QAAf,CAAwBhB,QAAxB,GAAmCgB,SAAShB,QAA5C;;AAEA;AACA;AACA/C,iBAAe+D,QAAf,CAAwB3B,GAAxB,CAA4BC,WAA5B,GAA0CiB,KAAK2a,GAAL,CAASla,SAAS3B,GAAT,CAAaC,WAAtB,EAAmCkmB,gBAAnC,CAA1C;;AAEA;AACAvoB,iBAAe+D,QAAf,CAAwBvC,KAAxB,GAAgC8B,KAAK2a,GAAL,CAASla,SAASvC,KAAlB,EAAyBgnB,kBAAzB,CAAhC;;AAEA;AACAxoB,iBAAe+D,QAAf,CAAwBtB,QAAxB,IAAoC,GAApC;AACA,MAAIzC,eAAe+D,QAAf,CAAwBtB,QAAxB,GAAmC,CAAvC,EAA0C;AACxCzC,mBAAe+D,QAAf,CAAwBtB,QAAxB,IAAoC,GAApC;AACD;;AAED;AACA,6BAAY9C,OAAZ;AACD,C;;AA5CD;;AACA;;;;;;AAEA,IAAM4oB,mBAAmB,QAAzB;AACA,IAAMC,qBAAqB,MAA3B;;AAEA;;;;;;;;;;;;;;;;;;;ACNA;;AACA;;AACA;;kBAEe;AACbC,gDADa;AAEbC,4DAFa;AAGbC;AAHa,C;;;;;;;;;;;;QCQCC,W,GAAAA,W;QAwBAC,c,GAAAA,c;AApChB;AACA;;AAEA,IAAMC,YAAY,EAAlB;;AAEA;;;;;;;AAOO,SAASF,WAAT,CAAsBG,QAAtB,EAA8C;AAAA,MAAdC,QAAc,uEAAH,CAAG;;AACnD,MAAIlpB,UAAJ;;AAEA;AACA,OAAKA,IAAI,CAAT,EAAYA,IAAIgpB,UAAU/oB,MAA1B,EAAkCD,GAAlC,EAAuC;AACrC,QAAIgpB,UAAUhpB,CAAV,EAAakpB,QAAb,IAAyBA,QAA7B,EAAuC;AACrC;AACD;AACF;;AAED;AACAF,YAAUrhB,MAAV,CAAiB3H,CAAjB,EAAoB,CAApB,EAAuB;AACrBkpB,sBADqB;AAErBD;AAFqB,GAAvB;AAID;;AAED;;;;;;;AAOO,SAASF,cAAT,CAAyBE,QAAzB,EAAmC;AACxC,OAAK,IAAIjpB,IAAI,CAAb,EAAgBA,IAAIgpB,UAAU/oB,MAA9B,EAAsCD,GAAtC,EAA2C;AACzC,QAAIgpB,UAAUhpB,CAAV,EAAaipB,QAAb,KAA0BA,QAA9B,EAAwC;AACtCD,gBAAUrhB,MAAV,CAAiB3H,CAAjB,EAAoB,CAApB;;AAEA;AACD;AACF;AACF;;AAED;;;;;;;;;AASA,SAASmpB,WAAT,CAAsBroB,IAAtB,EAA4BV,OAA5B,EAAqC;AACnC;AACA,OAAK,IAAIJ,IAAI,CAAb,EAAgBA,IAAIgpB,UAAU/oB,MAA9B,EAAsCD,GAAtC,EAA2C;AACzC,QAAMopB,SAASJ,UAAUhpB,CAAV,EAAaipB,QAAb,CAAsBnoB,IAAtB,EAA4BV,OAA5B,CAAf;;AAEA,QAAIgpB,WAAWtpB,SAAf,EAA0B;AACxB,aAAOspB,MAAP;AACD;AACF;AACF;;kBAEc;AACbN,0BADa;AAEbC,gCAFa;AAGb1hB,OAAK8hB;AAHQ,C;;;;;;;;;;;;;;AClEf;;AACA;;;;AACA;;;;AAEA;;;;;;;AAOA,SAASE,cAAT,CAAyB3gB,SAAzB,EAAoC;AAClC,MAAI3C,gBAAgB0P,OAAOC,SAA3B;AACA,MAAI5P,gBAAgB2P,OAAO6T,SAA3B;AACA,MAAM1Z,MAAMlH,UAAUzI,MAAtB;AACA,MAAIspB,cAAJ;;AAEA,OAAK,IAAIvpB,IAAI,CAAb,EAAgBA,IAAI4P,GAApB,EAAyB5P,GAAzB,EAA8B;AAC5BupB,YAAQ7gB,UAAU1I,CAAV,CAAR;AACA+F,oBAAgBA,gBAAgBwjB,KAAhB,GAAwBxjB,aAAxB,GAAwCwjB,KAAxD;AACAzjB,oBAAgBA,gBAAgByjB,KAAhB,GAAwBzjB,aAAxB,GAAwCyjB,KAAxD;AACD;;AAED,SAAO;AACLxjB,gCADK;AAELD;AAFK,GAAP;AAID;;AAED;;;;;;;;AAQA,SAAS0jB,qBAAT,CAAgCjpB,KAAhC,EAAuC;AACrC,MAAIA,MAAM8mB,OAAV,EAAmB;AACjB,WAAO9mB,MAAM8mB,OAAb;AACD;;AAED,MAAMxK,QAAQtc,MAAMsc,KAApB;AACA,MAAM9X,OAAOxE,MAAMwE,IAAnB;AACA,MAAMb,YAAY3D,MAAM2D,SAAxB;AACA,MAAMkC,QAAQ7F,MAAM6F,KAApB;AACA,MAAM7D,cAAchC,MAAMgC,WAA1B;AACA,MAAMC,eAAejC,MAAMiC,YAA3B;AACA,MAAMuD,gBAAgBxF,MAAMwF,aAA5B;AACA,MAAMD,gBAAgBvF,MAAMuF,aAA5B;;AAEA,SAAO,YAAY;AACjBvF,UAAMsc,KAAN,GAAcA,KAAd;AACAtc,UAAMwE,IAAN,GAAaA,IAAb;AACAxE,UAAM2D,SAAN,GAAkBA,SAAlB;AACA3D,UAAM6F,KAAN,GAAcA,KAAd;AACA7F,UAAMgC,WAAN,GAAoBA,WAApB;AACAhC,UAAMiC,YAAN,GAAqBA,YAArB;AACAjC,UAAMwF,aAAN,GAAsBA,aAAtB;AACAxF,UAAMuF,aAAN,GAAsBA,aAAtB;;AAEA,QAAIvF,MAAMwc,aAAV,EAAyB;AACvB,UAAMrU,YAAYnI,MAAMwc,aAAxB;;AAEAxc,YAAMoI,YAAN,GAAqB;AAAA,eAAMD,SAAN;AAAA,OAArB;AACD;;AAED;AACAnI,UAAMwc,aAAN,GAAsBjd,SAAtB;AACAS,UAAM4J,UAAN,GAAmBrK,SAAnB;AACAS,UAAMuc,UAAN,GAAmBhd,SAAnB;AACD,GApBD;AAqBD;;AAED;AACA;;AAEA;;;;;;;AAOA,SAAS2pB,eAAT,CAA0BzmB,QAA1B,EAAoC;AAClC,MAAIA,YAAa,OAAOA,QAAP,KAAoB,QAArC,EAAgD;AAC9CA,eAAW,2BAAYA,QAAZ,CAAX;AACD;;AAED,SAAOA,QAAP;AACD;;AAED;;;;;;AAMA,SAAS8a,YAAT,CAAuBvd,KAAvB,EAA8B;AAC5B,MAAIA,MAAM8mB,OAAN,IAAkB,OAAO9mB,MAAM8mB,OAAb,KAAyB,UAA/C,EAA4D;AAC1D9mB,UAAM8mB,OAAN;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD;;AAED;;;;;;;;AAQA,SAASzJ,6BAAT,CAAwCrd,KAAxC,EAA+CyC,QAA/C,EAAyD;AACvD,MAAIzC,MAAMsc,KAAN,IAAe,CAACtc,MAAMuc,UAA1B,EAAsC;AACpC,UAAM,IAAI/c,KAAJ,CAAU,0CAAV,CAAN;AACD;;AAED;AACAiD,aAAWymB,gBAAgBzmB,QAAhB,CAAX;;AAEA,MAAMmH,aAAanH,SAASoH,KAAT,EAAnB;;AAEA;AACA,MAAI7J,MAAM4J,UAAN,KAAqBA,UAAzB,EAAqC;AACnC;AACA;AACA,WAAO,KAAP;AACD;;AAED;AACA2T,eAAavd,KAAb;;AAEA;AACA,MAAI4J,UAAJ,EAAgB;AACd,QAAMpE,gBAAgBxF,MAAMwF,aAAN,IAAuB,CAA7C;AACA,QAAMD,gBAAgBvF,MAAMuF,aAAN,IAAuB,GAA7C;;AAEAvF,UAAM8mB,OAAN,GAAgBmC,sBAAsBjpB,KAAtB,CAAhB;;AAEA,QAAMqc,cAAc5Z,SAASqH,iBAAT,EAApB;;AAEAuS,gBAAY8M,aAAZ,CAA0B3jB,aAA1B,EAAyCD,aAAzC;;AAEA;AACA,6CAA0BvF,KAA1B,EAAiCqc,WAAjC;;AAEA;AACA,QAAM+M,cAAcN,eAAe9oB,MAAMoI,YAAN,EAAf,CAApB;;AAEApI,UAAMwF,aAAN,GAAsB4jB,YAAY5jB,aAAlC;AACAxF,UAAMuF,aAAN,GAAsB6jB,YAAY7jB,aAAlC;;AAEAvF,UAAMgC,WAAN,GAAoB,GAApB;AACAhC,UAAMiC,YAAN,GAAqB,GAArB;;AAEA;AACA;AACA;AACAjC,UAAM4J,UAAN,GAAmBA,UAAnB;AACD;;AAED;AACA,SAAO,IAAP;AACD;;AAED;;;;;;;;AAQA,SAAS0T,wBAAT,CAAmChe,OAAnC,EAA4CmD,QAA5C,EAAsD;AACpD,MAAM9C,iBAAiB,wCAAkBL,OAAlB,CAAvB;;AAGA,SAAO+d,8BAA8B1d,eAAeK,KAA7C,EAAoDyC,QAApD,CAAP;AACD;;QAEQ4a,6B,GAAAA,6B;QACPC,wB,GAAAA,wB;QACAC,Y,GAAAA,Y","file":"cornerstone.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstone-core\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstone-core\"] = factory();\n\telse\n\t\troot[\"cornerstone\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 41);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5c9a59949cb46f217c1a","const enabledElements = [];\n\n/**\n * A two-dimensional vector\n *\n * @typedef {Object} vec2\n * @param {Number} x - The x distance\n * @param {Number} y - The y distance\n */\n\n/**\n * VOI\n *\n * @typedef {Object} VOI\n * @param {Number} windowWidth - Window Width for display\n * @param {Number} windowCenter - Window Center for display\n */\n\n/**\n * Lookup Table Array\n *\n * @typedef {Object} LUT\n * @property {Number} firstValueMapped\n * @property {Number} numBitsPerEntry\n * @property {Array} lut\n */\n\n/**\n * Image Statistics Object\n *\n * @typedef {Object} ImageStats\n *\n * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image\n * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array\n * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context\n * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run\n * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image\n */\n\n/**\n * An Image Object in Cornerstone\n *\n * @typedef {Object} Image\n *\n * @property {string} imageId - The imageId associated with this image object\n * @property {Number} minPixelValue - the minimum stored pixel value in the image\n * @property {Number} maxPixelValue - the maximum stored pixel value in the image\n * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified\n * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified\n * @property {Number} windowCenter - the default windowCenter to apply to the image\n * @property {Number} windowWidth - the default windowWidth to apply to the image\n * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color\n * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images\n * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.\n * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats\n * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience\n * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience\n * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience\n * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience\n * @property {Boolean} color - true if pixel data is RGB, false if grayscale\n * @property {Object} lut - The Lookup Table\n * @property {Boolean} rgba - Is the color pixel data stored in RGBA?\n * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known\n * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or heigh of each pixel) in mm or undefined if not known\n * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1\n * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.\n * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping\n * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping\n * @property {ImageStats} [stats] - Statistics for the last redraw of the image\n * @property {Object} cachedLut - Cached Lookup Table for this image.\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * A Viewport Settings Object Cornerstone\n *\n * @typedef {Object} Viewport\n *\n * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x\n * @param {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.\n * @param {VOI} [voi] - an object with properties windowWidth and windowCenter.\n * @property {boolean} [invert=false] - Whether or not the image is inverted.\n * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.\n * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false\n * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false\n * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0\n * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none\n * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * An Enabled Element in Cornerstone\n *\n * @typedef {Object} EnabledElement\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement\n * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters\n * for each of the enabled element's layers\n * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean\n */\n\n/**\n * An Enabled Element Layer in Cornerstone\n *\n * @typedef {Object} EnabledElementLayer\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Object} [options] - Layer drawing options\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n */\n\n\n/**\n * Retrieves a Cornerstone Enabled Element object\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n *\n * @returns {EnabledElement} A Cornerstone Enabled Element\n */\nexport function getEnabledElement (element) {\n if (element === undefined) {\n throw new Error('getEnabledElement: parameter element must not be undefined');\n }\n for (let i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n return enabledElements[i];\n }\n }\n\n throw new Error('element not enabled');\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object\n * @returns {void}\n */\nexport function addEnabledElement (enabledElement) {\n if (enabledElement === undefined) {\n throw new Error('getEnabledElement: enabledElement element must not be undefined');\n }\n\n enabledElements.push(enabledElement);\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {string} imageId A Cornerstone Image ID\n * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElementsByImageId (imageId) {\n const ees = [];\n\n enabledElements.forEach(function (enabledElement) {\n if (enabledElement.image && enabledElement.image.imageId === imageId) {\n ees.push(enabledElement);\n }\n });\n\n return ees;\n}\n\n/**\n * Retrieve all of the currently enabled Cornerstone elements\n *\n * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElements () {\n return enabledElements;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElements.js","/**\n * Use the performance.now() method if possible, and if not, use Date.now()\n *\n * @return {number} Time elapsed since the time origin\n */\nexport default function () {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/now.js","import { external } from './externalModules.js';\n\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {void}\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type.toLocaleLowerCase(), { detail });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail);\n }\n\n // TODO: remove jQuery event triggers\n external.$(el).trigger(type, detail);\n el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./triggerEvent.js","/**\n * This module contains a function that will set the canvas context to the pixel coordinates system\n * making it easy to draw geometry on the image\n */\n\nimport calculateTransform from './internal/calculateTransform.js';\n\n/**\n * Sets the canvas context transformation matrix to the pixel coordinate system. This allows\n * geometry to be driven using the canvas context using coordinates in the pixel coordinate system\n * @param {EnabledElement} enabledElement The\n * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas\n * @param {Number} [scale] Optional scale to apply\n * @returns {void}\n */\nexport default function (enabledElement, context, scale) {\n if (enabledElement === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');\n }\n if (context === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');\n }\n\n const transform = calculateTransform(enabledElement, scale);\n\n context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setToPixelCoordinateSystem.js","import { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the specified enabled element\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Boolean} [invalidated=false] Whether or not the image pixel data has been changed, necessitating a redraw\n *\n * @returns {void}\n */\nexport default function (element, invalidated = false) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined && !enabledElement.layers.length) {\n throw new Error('updateImage: image has not been loaded yet');\n }\n\n drawImage(enabledElement, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./updateImage.js","/**\n * Internal API function to draw an image to a given enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} [invalidated] - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated = false) {\n enabledElement.needsRedraw = true;\n if (invalidated) {\n enabledElement.invalid = true;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImage.js","/**\n * Creates a new viewport object containing default values for the image and canvas\n *\n * @param {HTMLElement} canvas A Canvas DOM element\n * @param {Image} image A Cornerstone Image Object\n * @returns {Viewport} viewport object\n */\nexport default function (canvas, image) {\n if (canvas === undefined) {\n throw new Error('getDefaultViewport: parameter canvas must not be undefined');\n }\n\n if (image === undefined) {\n return {\n scale: 1,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false\n };\n }\n\n // Fit image to window\n const verticalScale = canvas.height / image.rows;\n const horizontalScale = canvas.width / image.columns;\n const scale = Math.min(horizontalScale, verticalScale);\n\n return {\n scale,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: image.windowWidth,\n windowCenter: image.windowCenter\n },\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n voiLUT: image.voiLUT,\n colormap: image.colormap,\n labelmap: Boolean(image.labelmap)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getDefaultViewport.js","import { getColormap, getColormapsList } from './colormap.js';\nimport LookupTable from './lookupTable.js';\n\nexport default {\n getColormap,\n getColormapsList,\n LookupTable\n};\n\n\n\n// WEBPACK FOOTER //\n// ./colors/index.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport now from '../internal/now.js';\nimport generateLut from '../internal/generateLut.js';\nimport storedColorPixelDataToCanvasImageData from '../internal/storedColorPixelDataToCanvasImageData.js';\nimport storedRGBAPixelDataToCanvasImageData from '../internal/storedRGBAPixelDataToCanvasImageData.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport webGL from '../webgl/index.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getLut (image, viewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n image.cachedLut.invert === viewport.invert) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n}\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing\n if (enabledElement.viewport.voi.windowWidth === 255 &&\n enabledElement.viewport.voi.windowCenter === 128 &&\n enabledElement.viewport.invert === false &&\n image.getCanvas &&\n image.getCanvas()\n ) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const colorLut = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n storedRGBAPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n } else {\n storedColorPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderColorImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderColorImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\nexport function addColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addColorLayer: image must be loaded before it can be drawn');\n }\n\n // All multi-layer images should include the alpha value\n image.rgba = true;\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderColorImage.js","import getModalityLUT from './getModalityLUT.js';\r\nimport getVOILUT from './getVOILut.js';\r\n\r\n/**\r\n * Creates a LUT used while rendering to convert stored pixel values to\r\n * display pixels\r\n *\r\n * @param {Image} image A Cornerstone Image Object\r\n * @param {Number} windowWidth The Window Width\r\n * @param {Number} windowCenter The Window Center\r\n * @param {Boolean} invert A boolean describing whether or not the image has been inverted\r\n * @param {Array} [modalityLUT] A modality Lookup Table\r\n * @param {Array} [voiLUT] A Volume of Interest Lookup Table\r\n *\r\n * @returns {Uint8ClampedArray} A lookup table to apply to the image\r\n */\r\nexport default function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {\r\n const maxPixelValue = image.maxPixelValue;\r\n const minPixelValue = image.minPixelValue;\r\n const offset = Math.min(minPixelValue, 0);\r\n\r\n if (image.cachedLut === undefined) {\r\n const length = maxPixelValue - offset + 1;\r\n\r\n image.cachedLut = {};\r\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\r\n }\r\n\r\n const lut = image.cachedLut.lutArray;\r\n const mlutfn = getModalityLUT(image.slope, image.intercept, modalityLUT);\r\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\r\n\r\n if (invert === true) {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = 255 - vlutfn(mlutfn(storedValue));\r\n }\r\n } else {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = vlutfn(mlutfn(storedValue));\r\n }\r\n }\r\n\r\n return lut;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/generateLut.js","import calculateTransform from './calculateTransform.js';\n\nexport default function (enabledElement) {\n // For now we will calculate it every time it is requested.\n // In the future, we may want to cache it in the enabled element to speed things up.\n return calculateTransform(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getTransform.js","export default function (enabledElement, image) {\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n const renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/initializeRenderCanvas.js","export default function (enabledElement) {\n const imageId = enabledElement.image.imageId;\n const viewport = enabledElement.viewport;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap\n };\n\n return enabledElement.renderingTools;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/saveLastRendered.js","export default function (enabledElement, image) {\n const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n const lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;\n\n return (\n image.imageId !== lastRenderedImageId ||\n !lastRenderedViewport ||\n lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter ||\n lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth ||\n lastRenderedViewport.invert !== enabledElement.viewport.invert ||\n lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||\n lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||\n lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||\n lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||\n lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||\n lastRenderedViewport.colormap !== enabledElement.viewport.colormap\n );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/doesImageNeedToBeRendered.js","import { render, initRenderer, getRenderCanvas, isWebGLAvailable, isWebGLInitialized } from './renderer.js';\nimport createProgramFromString from './createProgramFromString.js';\nimport textureCache from './textureCache.js';\n\nconst mod = {\n createProgramFromString,\n renderer: {\n render,\n initRenderer,\n getRenderCanvas,\n isWebGLAvailable\n },\n textureCache\n};\n\nObject.defineProperty(mod, 'isWebGLInitialized', {\n enumerable: true,\n configurable: false,\n get: () => isWebGLInitialized\n});\n\nexport default mod;\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/index.js","class EventTarget {\n constructor () {\n this.listeners = {};\n }\n\n addEventListener (type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n\n removeEventListener (type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n const stack = this.listeners[type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n\n dispatchEvent (event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n\n const stack = this.listeners[event.type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n}\n\n\nconst events = new EventTarget();\n\nexport default events;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import storedPixelDataToCanvasImageData from '../internal/storedPixelDataToCanvasImageData.js';\nimport storedPixelDataToCanvasImageDataRGBA from '../internal/storedPixelDataToCanvasImageDataRGBA.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport webGL from '../webgl/index.js';\nimport getLut from './getLut.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated, useAlphaChannel = true) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // Gray scale image - apply the lut and put the resulting image onto the render canvas\n if (useAlphaChannel) {\n storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);\n } else {\n storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderGrayscaleImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a grayscale image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.\n This does not work if this layer is not the first layer in the enabledElement.\n * @returns {void}\n */\nexport function addGrayscaleLayer (layer, invalidated, useAlphaChannel = false) {\n if (layer === undefined) {\n throw new Error('addGrayscaleLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderGrayscaleImage.js","function requestFrame (callback) {\n window.setTimeout(callback, 1000 / 60);\n}\n\n/**\n * Polyfills requestAnimationFrame for older browsers.\n *\n * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.\n *\n * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.\n */\nexport default function (callback) {\n return window.requestAnimationFrame(callback) ||\n window.webkitRequestAnimationFrame(callback) ||\n window.mozRequestAnimationFrame(callback) ||\n window.oRequestAnimationFrame(callback) ||\n window.msRequestAnimationFrame(callback) ||\n requestFrame(callback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/requestAnimationFrame.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageData.js","import now from './now.js';\n\n/**\n * Converts stored color pixel values to display pixel values using a LUT.\n *\n * Note: Skips alpha value for any input image pixel data.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + (-minPixelValue)]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedColorPixelDataToCanvasImageData.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataColorLUT (image, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataColorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataColorLUT.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT (image, grayscaleLut, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","import { Transform } from './transform.js';\n\n/**\n * Calculate the transform for a Cornerstone enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {Number} [scale] The viewport scale\n * @return {Transform} The current transform\n */\nexport default function (enabledElement, scale) {\n\n const transform = new Transform();\n\n transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2);\n\n // Apply the rotation before scaling for non square pixels\n const angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n // Apply the scale\n let widthScale = enabledElement.viewport.scale;\n let heightScale = enabledElement.viewport.scale;\n\n if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {\n widthScale *= (enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing);\n } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {\n heightScale *= (enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing);\n }\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate(-angle * Math.PI / 180);\n }\n\n // Apply the pan offset\n transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y);\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Translate the origin back to the corner of the image so the event handlers can draw in image coordinate system\n transform.translate(-enabledElement.image.width / 2, -enabledElement.image.height / 2);\n\n return transform;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/calculateTransform.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataColorLUT from '../internal/storedPixelDataToCanvasImageDataColorLUT';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderLabelMapImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataColorLUT(image, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a label map image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderLabelMapImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for label map pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addLabelMapLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addLabelMapLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderLabelMapImage.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport getLut from './getLut.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from '../internal/storedPixelDataToCanvasImageDataPseudocolorLUT';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataPseudocolorLUT(image, lut, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderPseudoColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addPseudoColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addPseudoColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderPseudoColorImage.js","import guid from './internal/guid.js';\nimport { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport triggerCustomEvent from './triggerEvent.js';\n\n/**\n * Helper function to trigger an event on a Cornerstone element with\n * a specific layerId\n *\n * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)\n * @param {EnabledElement} enabledElement The Cornerstone enabled element\n * @param {String} layerId The layer's unique identifier\n * @returns {void}\n */\nfunction triggerEvent (eventName, enabledElement, layerId) {\n const element = enabledElement.element;\n const eventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n enabledElement,\n layerId\n };\n\n triggerCustomEvent(element, eventName, eventData);\n}\n\n/**\n * Rescale the target layer to the base layer based on the\n * relative size of each image and their pixel dimensions.\n *\n * This function will update the Viewport parameters of the\n * target layer to a new scale.\n *\n * @param {EnabledElementLayer} baseLayer The base layer\n * @param {EnabledElementLayer} targetLayer The target layer to rescale\n * @returns {void}\n */\nexport function rescaleImage (baseLayer, targetLayer) {\n if (baseLayer.layerId === targetLayer.layerId) {\n throw new Error('rescaleImage: both arguments represent the same layer');\n }\n\n const baseImage = baseLayer.image;\n const targetImage = targetLayer.image;\n\n // Return if these images don't have an imageId (e.g. for dynamic images)\n if (!baseImage.imageId || !targetImage.imageId) {\n return;\n }\n\n // Column pixel spacing need to be considered when calculating the\n // ratio between the layer added and base layer images\n const colRelative = (targetImage.columnPixelSpacing * targetImage.width) /\n (baseImage.columnPixelSpacing * baseImage.width);\n const viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;\n\n targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;\n}\n\n/**\n * Add a layer to a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image object to add as a new layer\n * @param {Object} options Options for the layer\n *\n * @returns {String} layerId The new layer's unique identifier\n */\nexport function addLayer (element, image, options) {\n const layerId = guid();\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n let viewport;\n\n if (image) {\n viewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (options && options.viewport) {\n viewport = Object.assign(viewport, options.viewport);\n }\n }\n\n // Set syncViewports to true by default when a new layer is added\n if (enabledElement.syncViewports !== false) {\n enabledElement.syncViewports = true;\n }\n\n const newLayer = {\n image,\n layerId,\n viewport,\n options: options || {},\n renderingTools: {}\n };\n\n // Rescale the new layer based on the base layer to make sure\n // they will have a proportional size (pixel spacing)\n if (layers.length && image) {\n rescaleImage(layers[0], newLayer);\n }\n\n layers.push(newLayer);\n\n triggerEvent('CornerstoneLayerAdded', enabledElement, layerId);\n\n // Set the layer as active if it's the first layer added\n if (layers.length === 1 && image) {\n setActiveLayer(element, layerId);\n }\n\n return layerId;\n}\n\n/**\n * Remove a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function removeLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index !== -1) {\n layers.splice(index, 1);\n\n // If the current layer is active, and we have other layers,\n // switch to the first layer that remains in the array\n if (layerId === enabledElement.activeLayerId && layers.length) {\n setActiveLayer(element, layers[0].layerId);\n }\n\n triggerEvent('CornerstoneLayerRemoved', enabledElement, layerId);\n }\n}\n\n/**\n * Retrieve a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @return {EnabledElementLayer} The layer\n */\nexport function getLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === layerId);\n}\n\n/**\n * Retrieve all layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers;\n}\n\n/**\n * Retrieve all visible layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getVisibleLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.layers.filter((layer) => layer.options &&\n layer.options.visible !== false &&\n layer.options.opacity !== 0);\n}\n\n/**\n * Set the active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function setActiveLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n // Stop here if this layer is already active\n if (enabledElement.activeLayerId === layerId) {\n return;\n }\n\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index === -1) {\n throw new Error('setActiveLayer: layer not found in layers array');\n }\n\n const layer = enabledElement.layers[index];\n\n if (!layer.image) {\n throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');\n }\n\n enabledElement.activeLayerId = layerId;\n enabledElement.image = layer.image;\n enabledElement.viewport = layer.viewport;\n\n updateImage(element);\n triggerEvent('CornerstoneActiveLayerChanged', enabledElement, layerId);\n}\n\n/**\n * Set a new image for a specific layerId\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image The image to be displayed in this layer\n * @param {String} [layerId] The unique identifier for the layer\n * @returns {void}\n */\nexport function setLayerImage (element, image, layerId) {\n const enabledElement = getEnabledElement(element);\n const baseLayer = enabledElement.layers[0];\n\n let layer;\n\n if (layerId) {\n layer = getLayer(element, layerId);\n } else {\n layer = getActiveLayer(element);\n }\n\n if (!layer) {\n throw new Error('setLayerImage: Layer not found');\n }\n\n layer.image = image;\n\n if (!image) {\n layer.viewport = undefined;\n\n return;\n }\n\n if (!layer.viewport) {\n const defaultViewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (layer.options && layer.options.viewport) {\n layer.viewport = Object.assign(defaultViewport, layer.options.viewport);\n }\n\n if (baseLayer.layerId !== layerId) {\n rescaleImage(baseLayer, layer);\n }\n }\n}\n\n/**\n * Retrieve the currently active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @return {EnabledElementLayer} The currently active layer\n */\nexport function getActiveLayer (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === enabledElement.activeLayerId);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./layers.js","/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n */\nfunction generateLinearModalityLUT (slope, intercept) {\n return (storedPixelValue) => storedPixelValue * slope + intercept;\n}\n\nfunction generateNonLinearModalityLUT (modalityLUT) {\n const minValue = modalityLUT.lut[0];\n const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return (storedPixelValue) => {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n */\nexport default function (slope, intercept, modalityLUT) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getModalityLUT.js","import LookupTable from './lookupTable.js';\n\nconst COLOR_TRANSPARENT = [0, 0, 0, 0];\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palattes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nconst colormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [\n [0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255],\n [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255],\n [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255],\n [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255],\n [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255],\n [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255],\n [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255],\n [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255],\n [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255],\n [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255],\n [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255],\n [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255],\n [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255],\n [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255],\n [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255],\n [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255],\n [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255],\n [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255],\n [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255],\n [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255],\n [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255],\n [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255],\n [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255],\n [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255],\n [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255],\n [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255],\n [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255],\n [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255],\n [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255],\n [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255],\n [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255],\n [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255],\n [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255],\n [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255],\n [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255],\n [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255],\n [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255],\n [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255],\n [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255],\n [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255],\n [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255],\n [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255],\n [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255],\n [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255],\n [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255],\n [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255],\n [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255],\n [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255],\n [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255],\n [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255],\n [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255],\n [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255],\n [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255],\n [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255],\n [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255],\n [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255],\n [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255],\n [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255],\n [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255],\n [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255],\n [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255],\n [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255],\n [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255],\n [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255],\n [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255],\n [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255],\n [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255],\n [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255],\n [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255],\n [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255],\n [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255],\n [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255],\n [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255],\n [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255],\n [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255],\n [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255],\n [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255],\n [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255],\n [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255],\n [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255],\n [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255],\n [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255],\n [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255],\n [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255],\n [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255],\n [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255],\n [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255],\n [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255],\n [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255],\n [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255],\n [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255],\n [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255],\n [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255],\n [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255],\n [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255],\n [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255],\n [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255],\n [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255],\n [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255],\n [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255],\n [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255],\n [255, 255, 255, 255]\n ]\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255],\n [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255],\n [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255],\n [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255],\n [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255],\n [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255],\n [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255],\n [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255],\n [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255],\n [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255],\n [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255],\n [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255],\n [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255],\n [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255],\n [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255],\n [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255],\n [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255],\n [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255],\n [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255],\n [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255],\n [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255],\n [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255],\n [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255],\n [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255],\n [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255],\n [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255],\n [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255],\n [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255],\n [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255],\n [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255],\n [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255],\n [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255],\n [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255],\n [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255],\n [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255],\n [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255],\n [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255],\n [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255],\n [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255],\n [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255],\n [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255],\n [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255],\n [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255],\n [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255],\n [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255],\n [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255],\n [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255],\n [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255],\n [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255],\n [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255],\n [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255]\n ]\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 1, 1]]\n }\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],\n green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],\n blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]\n }\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750],\n [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0],\n [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750],\n [0.857143, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1],\n [0.507937, 1, 1], [0.666667, 0.062500, 0.062500],\n [0.682540, 0, 0], [1, 0, 0]],\n blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500],\n [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500],\n [1, 0.09375, 0.09375]]\n }\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],\n blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]\n }\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 1, 1], [1, 0, 0]],\n blue: [[0, 1, 1], [1, 1, 1]]\n }\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0, 0]]\n }\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0.5, 0.5], [1, 1, 1]],\n blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]\n }\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 0, 0]]\n }\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 0, 0]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0.5, 0.5]]\n }\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],\n blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]\n }\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 0.7812, 0.7812]],\n blue: [[0, 0, 0], [1, 0.4975, 0.4975]]\n }\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0],\n [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0],\n [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1],\n [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80],\n [1, 0.80, 0.80]],\n green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000],\n [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000],\n [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1],\n [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000],\n [0.80, 0.6000, 0.6000], [0.85, 0, 0],\n [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],\n blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667],\n [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667],\n [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0],\n [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0],\n [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]\n }\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388],\n [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478],\n [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608],\n [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204],\n [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162],\n [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281],\n [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949],\n [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556],\n [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179],\n [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518],\n [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803],\n [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177],\n [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866],\n [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617],\n [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542],\n [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934],\n [1, 0.705673158, 0.705673158]],\n green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838],\n [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618],\n [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092],\n [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772],\n [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107],\n [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712],\n [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879],\n [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984],\n [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047],\n [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443],\n [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809],\n [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156],\n [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968],\n [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467],\n [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446],\n [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067],\n [1, 0.01555616, 0.01555616]],\n blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763],\n [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899],\n [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588],\n [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814],\n [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203],\n [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227],\n [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269],\n [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838],\n [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546],\n [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146],\n [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763],\n [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762],\n [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684],\n [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596],\n [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199],\n [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123],\n [1, 0.150232812, 0.150232812]]\n }\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991],\n [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429],\n [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256],\n [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502],\n [1, 0.031372550874948502, 0.031372550874948502]],\n green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449],\n [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144],\n [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698],\n [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169],\n [1, 0.18823529779911041, 0.18823529779911041]],\n blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359],\n [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171],\n [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162],\n [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]\n }\n }\n};\n\n// Generate linearly spaced vectors\n// http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\nfunction linspace (a, b, n) {\n n = n === null ? 100 : n;\n\n const increment = (b - a) / (n - 1);\n const vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n// Return the number of elements smaller than \"elem\" (binary search)\nfunction getRank (array, elem) {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = left + Math.floor((right - left) / 2);\n const midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n// Find the indices into a sorted array a such that, if the corresponding elements\n// In v were inserted before the indices, the order of a would be preserved.\n// http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\nfunction searchSorted (inputArray, values) {\n let i;\n const indexes = [];\n const len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n// Create an *N* -element 1-d lookup table\n//\n// *Data* represented by a list of x,y0,y1 mapping correspondences. Each element in this\n// List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n// A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n// Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n// The value of y for values of x <= to that given, and y1 is the value to be used for x >\n// Than that given). The list must start with x=0, end with x=1, and all values of x must be\n// In increasing order. Values between the given mapping points are determined by simple linear\n// Interpolation.\n//\n// The function returns an array \"result\" where result[x*(N-1)] gives the closest value for\n// Values of x between 0 and 1.\nfunction makeMappingArray (N, data, gamma) {\n let i;\n const x = [];\n const y0 = [];\n const y1 = [];\n const lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n const element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n const xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n const xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n const index = xLinSpaceIndexes[i];\n const colorPercent = ((xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]));\n const colorDelta = (y0[index] - y1[index - 1]);\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n// Colormap based on lookup tables using linear segments.\n//\n// The lookup table is generated using linear interpolation for each\n// Primary color, with the 0-1 domain divided into any number of\n// Segments.\n//\n// https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\nfunction createLinearSegmentedColormap (segmentedData, N, gamma) {\n let i;\n const lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n const redLut = makeMappingArray(N, segmentedData.red, gamma);\n const greenLut = makeMappingArray(N, segmentedData.green, gamma);\n const blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n const red = Math.round(redLut[i] * 255);\n const green = Math.round(greenLut[i] * 255);\n const blue = Math.round(blueLut[i] * 255);\n const rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/*\n* Return all colormaps (id and name) available\n*/\nexport function getColormapsList () {\n const colormaps = [];\n const keys = Object.keys(colormapsData);\n\n keys.forEach(function (key) {\n if (colormapsData.hasOwnProperty(key)) {\n const colormap = colormapsData[key];\n\n colormaps.push({\n id: key,\n name: colormap.name\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n *\n * @returns {*} The Colormap Object\n */\nexport function getColormap (id, colormapData) {\n let colormap = colormapsData[id];\n\n if (!colormap) {\n colormap = colormapsData[id] = colormapData || {\n name: '',\n colors: []\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);\n }\n\n return {\n getId () {\n return id;\n },\n\n getColorSchemeName () {\n return colormap.name;\n },\n\n setColorSchemeName (name) {\n colormap.name = name;\n },\n\n getNumberOfColors () {\n return colormap.colors.length;\n },\n\n setNumberOfColors (numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n\n getColor (index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n\n getColorRepeating (index) {\n const numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n\n setColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n\n addColor (rgba) {\n colormap.colors.push(rgba);\n },\n\n insertColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n\n removeColor (index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n\n clearColors () {\n colormap.colors = [];\n },\n\n buildLookupTable (lut) {\n if (!lut) {\n return;\n }\n\n const numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (let i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n\n createLookupTable () {\n const lut = new LookupTable();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n\n isValidIndex (index) {\n return (index >= 0) && (index < colormap.colors.length);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./colors/colormap.js","// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nconst BELOW_RANGE_COLOR_INDEX = 0;\nconst ABOVE_RANGE_COLOR_INDEX = 1;\nconst NAN_COLOR_INDEX = 2;\n\nfunction HSVToRGB (hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n const rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n const hueCase = Math.floor(hue * 6);\n const frac = 6 * hue - hueCase;\n const lx = val * (1 - sat);\n const ly = val * (1 - sat * frac);\n const lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\nclass LookupTable {\n constructor () {\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n setNumberOfTableValues (number) {\n this.NumberOfColors = number;\n }\n\n setRamp (ramp) {\n this.Ramp = ramp;\n }\n\n setTableRange (start, end) {\n // Set/Get the minimum/maximum scalar values for scalar mapping.\n // Scalar values less than minimum range value are clamped to minimum range value.\n // Scalar values greater than maximum range value are clamped to maximum range value.\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n\n setHueRange (start, end) {\n // Set the range in hue (using automatic generation). Hue ranges between [0,1].\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n\n setSaturationRange (start, end) {\n // Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n\n setValueRange (start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n\n setRange (start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n\n setAlphaRange (start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n\n getColor (scalar) {\n // Map one value through the lookup table and return the color as an\n // RGB array of doubles between 0 and 1.\n return this.mapValue(scalar);\n }\n\n build (force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n const maxIndex = this.NumberOfColors - 1;\n\n let hinc, sinc, vinc, ainc;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (let i = 0; i <= maxIndex; i++) {\n const hue = this.HueRange[0] + i * hinc;\n const sat = this.SaturationRange[0] + i * sinc;\n const val = this.ValueRange[0] + i * vinc;\n const alpha = this.AlphaRange[0] + i * ainc;\n\n const rgb = HSVToRGB(hue, sat, val);\n const c_rgba = [];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));\n c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));\n c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error(`Invalid Ramp value (${this.Ramp})`);\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n\n buildSpecialColors () {\n const numberOfColors = this.NumberOfColors;\n const belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n const aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n const nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n // Given a scalar value v, return an rgba color value from lookup table.\n mapValue (v) {\n const index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n\n getIndex (v) {\n const p = {};\n\n p.Range = [];\n p.MaxIndex = this.NumberOfColors - 1;\n\n // This was LookupShiftAndScale\n p.Shift = -this.TableRange[0];\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n let index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n\n setTableValue (index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error(`Can't set the table value for negative index (${index})`);\n }\n\n if (index >= this.NumberOfColors) {\n new Error(`Index ${index} is greater than the number of colors ${this.NumberOfColors}`);\n }\n\n this.Table[index] = rgba;\n\n if ((index === 0) || (index === this.NumberOfColors - 1)) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n}\n\nexport default LookupTable;\n\n\n\n// WEBPACK FOOTER //\n// ./colors/lookupTable.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let pixelValue;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataRGBA.js","// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nexport class Transform {\n constructor () {\n this.reset();\n }\n\n reset () {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n\n clone () {\n const transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n\n multiply (matrix) {\n const m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n const m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n const m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n const m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n const dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n const dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n\n invert () {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n\n rotate (rad) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n\n translate (x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n\n scale (sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n\n transformPoint (px, py) {\n const x = px;\n const y = py;\n\n px = x * this.m[0] + y * this.m[2] + this.m[4];\n py = x * this.m[1] + y * this.m[3] + this.m[5];\n\n return {\n x: px,\n y: py\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/transform.js","import lutMatches from './lutMatches.js';\nimport generateLut from '../internal/generateLut.js';\n\nexport default function (image, viewport, invalidated) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&\n lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&\n image.cachedLut.invert === viewport.invert &&\n invalidated !== true) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/getLut.js","import events from '../events.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * This module deals with caching image textures in VRAM for WebGL\r\n */\r\n\r\nconst imageCache = {};\r\n\r\nconst cachedImages = [];\r\n\r\nlet maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB\r\nlet cacheSizeInBytes = 0;\r\n\r\nfunction getCacheInfo () {\r\n return {\r\n maximumSizeInBytes,\r\n cacheSizeInBytes,\r\n numberOfImagesCached: cachedImages.length\r\n };\r\n}\r\n\r\nfunction purgeCacheIfNecessary () {\r\n // If max cache size has not been exceeded, do nothing\r\n if (cacheSizeInBytes <= maximumSizeInBytes) {\r\n return;\r\n }\r\n\r\n // Cache size has been exceeded, create list of images sorted by timeStamp\r\n // So we can purge the least recently used image\r\n function compare (a, b) {\r\n if (a.timeStamp > b.timeStamp) {\r\n return -1;\r\n }\r\n if (a.timeStamp < b.timeStamp) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n cachedImages.sort(compare);\r\n\r\n // Remove images as necessary\r\n while (cacheSizeInBytes > maximumSizeInBytes) {\r\n const lastCachedImage = cachedImages[cachedImages.length - 1];\r\n\r\n cacheSizeInBytes -= lastCachedImage.sizeInBytes;\r\n delete imageCache[lastCachedImage.imageId];\r\n cachedImages.pop();\r\n\r\n triggerEvent(events, 'CornerstoneWebGLTextureRemoved', { imageId: lastCachedImage.imageId });\r\n }\r\n\r\n const cacheInfo = getCacheInfo();\r\n\r\n triggerEvent(events, 'CornerstoneWebGLTextureCacheFull', cacheInfo);\r\n}\r\n\r\nfunction setMaximumSizeBytes (numBytes) {\r\n if (numBytes === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\r\n }\r\n if (numBytes.toFixed === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\r\n }\r\n\r\n maximumSizeInBytes = numBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction putImageTexture (image, imageTexture) {\r\n const imageId = image.imageId;\r\n\r\n if (image === undefined) {\r\n throw new Error('putImageTexture: image must not be undefined');\r\n }\r\n\r\n if (imageId === undefined) {\r\n throw new Error('putImageTexture: imageId must not be undefined');\r\n }\r\n\r\n if (imageTexture === undefined) {\r\n throw new Error('putImageTexture: imageTexture must not be undefined');\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {\r\n throw new Error('putImageTexture: imageId already in cache');\r\n }\r\n\r\n const cachedImage = {\r\n imageId,\r\n imageTexture,\r\n timeStamp: new Date(),\r\n sizeInBytes: imageTexture.sizeInBytes\r\n };\r\n\r\n imageCache[imageId] = cachedImage;\r\n cachedImages.push(cachedImage);\r\n\r\n if (imageTexture.sizeInBytes === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');\r\n }\r\n if (imageTexture.sizeInBytes.toFixed === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');\r\n }\r\n cacheSizeInBytes += cachedImage.sizeInBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction getImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('getImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n return;\r\n }\r\n\r\n // Bump time stamp for cached image\r\n cachedImage.timeStamp = new Date();\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction removeImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\r\n cacheSizeInBytes -= cachedImage.sizeInBytes;\r\n delete imageCache[imageId];\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction purgeCache () {\r\n while (cachedImages.length > 0) {\r\n const removedCachedImage = cachedImages.pop();\r\n\r\n delete imageCache[removedCachedImage.imageId];\r\n }\r\n cacheSizeInBytes = 0;\r\n}\r\n\r\nexport default {\r\n purgeCache,\r\n getImageTexture,\r\n putImageTexture,\r\n removeImageTexture,\r\n setMaximumSizeBytes\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/textureCache.js","let $ = window.$;\n\nconst external = {\n set $ (module) {\n $ = module;\n },\n get $ () {\n return $;\n }\n};\n\nexport { external };\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","/**\n * Creates and compiles a shader.\n *\n * @param {!WebGLRenderingContext} gl The WebGL Context.\n * @param {string} shaderSource The GLSL source code for the shader.\n * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.\n *\n * @return {!WebGLShader} The shader.\n */\nfunction compileShader (gl, shaderSource, shaderType) {\n\n // Create the shader object\n const shader = gl.createShader(shaderType);\n\n // Set the shader source code.\n gl.shaderSource(shader, shaderSource);\n\n // Compile the shader\n gl.compileShader(shader);\n\n // Check if it compiled\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong during compilation; get the error\n const infoLog = gl.getShaderInfoLog(shader);\n\n console.error(`Could not compile shader:\\n${infoLog}`);\n }\n\n return shader;\n}\n\n/**\n * Creates a program from 2 shaders.\n *\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShader A vertex shader.\n * @param {!WebGLShader} fragmentShader A fragment shader.\n * @return {!WebGLProgram} A program.\n */\nfunction createProgram (gl, vertexShader, fragmentShader) {\n\n // Create a program.\n const program = gl.createProgram();\n\n // Attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n // Link the program.\n gl.linkProgram(program);\n\n // Check if it linked.\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong with the link\n const infoLog = gl.getProgramInfoLog(program);\n\n console.error(`WebGL program filed to link:\\n${infoLog}`);\n }\n\n return program;\n}\n\n/**\n * Creates a program from 2 shaders source (Strings)\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShaderSrc Vertex shader string\n * @param {!WebGLShader} fragShaderSrc Fragment shader string\n * @return {!WebGLProgram} A program\n */\nexport default function (gl, vertexShaderSrc, fragShaderSrc) {\n const vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);\n const fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);\n\n\n return createProgram(gl, vertexShader, fragShader);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/createProgramFromString.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport { renderColorImage } from './renderColorImage.js';\n\n/**\n * API function to draw a standard web image (PNG, JPG) to an enabledImage\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderWebImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderWebImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderWebImage: image must be loaded before it can be drawn');\n }\n\n // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image\n // Directly. If any of those are changed, we call renderColorImage() to apply the lut\n if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth &&\n enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter &&\n enabledElement.viewport.invert === false) {\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n context.drawImage(image.getImage(), 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n } else {\n renderColorImage(enabledElement, invalidated);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderWebImage.js","import { getEnabledElement } from './enabledElements.js';\r\nimport fitToWindow from './fitToWindow.js';\r\nimport updateImage from './updateImage.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nfunction setCanvasSize (element, canvas) {\r\n // The device pixel ratio is 1.0 for normal displays and > 1.0\r\n // For high DPI displays like Retina\r\n /*\r\n\r\n This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas\r\n is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to\r\n a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel\r\n produces incorrect results. I couldn't find any way to determine when the DPI changed other than\r\n by polling which is not very clean. If anyone has any ideas here, please let me know, but for now\r\n we will disable this functionality. We may want\r\n to add a mechanism to optionally enable this functionality if we can determine it is safe to do\r\n so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing\r\n to be cautious here since I would rather not have bug reports or safety issues related to this\r\n scenario.\r\n\r\n var devicePixelRatio = window.devicePixelRatio;\r\n if(devicePixelRatio === undefined) {\r\n devicePixelRatio = 1.0;\r\n }\r\n */\r\n\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.width !== element.clientWidth) {\r\n canvas.width = element.clientWidth;\r\n canvas.style.width = `${element.clientWidth}px`;\r\n }\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.height !== element.clientHeight) {\r\n canvas.height = element.clientHeight;\r\n canvas.style.height = `${element.clientHeight}px`;\r\n }\r\n}\r\n\r\n/**\r\n * Resizes an enabled element and optionally fits the image to window\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {Boolean} fitViewportToWindow true to refit, false to leave viewport parameters as they are\r\n * @returns {void}\r\n */\r\nexport default function (element, fitViewportToWindow) {\r\n\r\n const enabledElement = getEnabledElement(element);\r\n\r\n setCanvasSize(element, enabledElement.canvas);\r\n\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'CornerstoneElementResized', eventData);\r\n\r\n if (enabledElement.image === undefined) {\r\n return;\r\n }\r\n\r\n if (fitViewportToWindow === true) {\r\n fitToWindow(element);\r\n } else {\r\n updateImage(element);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./resize.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @return {{width, height}} The Image dimensions\n */\nfunction getImageSize (enabledElement) {\n if (enabledElement.viewport.rotation === 0 || enabledElement.viewport.rotation === 180) {\n return {\n width: enabledElement.image.width,\n height: enabledElement.image.height\n };\n }\n\n return {\n width: enabledElement.image.height,\n height: enabledElement.image.width\n };\n\n}\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param {HTMLElement} element The Cornerstone element to update\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const imageSize = getImageSize(enabledElement);\n\n const verticalScale = enabledElement.canvas.height / imageSize.height;\n const horizontalScale = enabledElement.canvas.width / imageSize.width;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = Math.min(horizontalScale, verticalScale);\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./fitToWindow.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves an array of stored pixel values from a rectangular region of an image\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The stored pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n if (element === undefined) {\n throw new Error('getStoredPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = getEnabledElement(element);\n const storedPixels = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < width; column++) {\n const spIndex = ((row + y) * enabledElement.image.columns) + (column + x);\n\n storedPixels[index++] = pixelData[spIndex];\n }\n }\n\n return storedPixels;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getStoredPixels.js","import events from './events.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * This module deals with caching images\n */\nlet maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB\nlet cacheSizeInBytes = 0;\n\n// Dictionary of imageId to cachedImage objects\nconst imageCacheDict = {};\n\n// Array of cachedImage objects\nexport const cachedImages = [];\n\nexport function setMaximumSizeBytes (numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n\n triggerEvent(events, 'CornerstoneImageCacheMaximumSizeChanged');\n\n purgeCacheIfNecessary();\n}\n\nfunction purgeCacheIfNecessary () {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare (a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary)\n while (cacheSizeInBytes > maximumSizeInBytes) {\n const lastCachedImage = cachedImages[cachedImages.length - 1];\n const imageId = lastCachedImage.imageId;\n\n removeImagePromise(imageId);\n\n triggerEvent(events, 'CornerstoneImageCachePromiseRemoved', { imageId });\n }\n\n const cacheInfo = getCacheInfo();\n\n triggerEvent(events, 'CornerstoneImageCacheFull', cacheInfo);\n}\n\nexport function putImagePromise (imageId, imagePromise) {\n if (imageId === undefined) {\n throw new Error('putImagePromise: imageId must not be undefined');\n }\n if (imagePromise === undefined) {\n throw new Error('putImagePromise: imagePromise must not be undefined');\n }\n if (imageCacheDict.hasOwnProperty(imageId) === true) {\n throw new Error('putImagePromise: imageId already in cache');\n }\n\n const cachedImage = {\n loaded: false,\n imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imagePromise,\n timeStamp: Date.now(),\n sizeInBytes: 0\n };\n\n imageCacheDict[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n imagePromise.then(function (image) {\n if (cachedImages.indexOf(cachedImage) === -1) {\n // If the image has been purged before being loaded, we stop here.\n return;\n }\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n\n if (image.sizeInBytes === undefined) {\n throw new Error('putImagePromise: sizeInBytes must not be undefined');\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error('putImagePromise: image.sizeInBytes is not a number');\n }\n\n cachedImage.sizeInBytes = image.sizeInBytes;\n cacheSizeInBytes += cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'addImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'CornerstoneImageCacheChanged', eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n\n purgeCacheIfNecessary();\n });\n}\n\nexport function getImagePromise (imageId) {\n if (imageId === undefined) {\n throw new Error('getImagePromise: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imagePromise;\n}\n\nexport function removeImagePromise (imageId) {\n if (imageId === undefined) {\n throw new Error('removeImagePromise: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImagePromise: imageId was not present in imageCache');\n }\n\n cachedImage.imagePromise.reject();\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'deleteImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'CornerstoneImageCacheChanged', eventDetails);\n decache(cachedImage.imagePromise);\n\n delete imageCacheDict[imageId];\n}\n\nexport function getCacheInfo () {\n return {\n maximumSizeInBytes,\n cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\n// This method should only be called by `removeImagePromise` because it's\n// The one that knows how to deal with shared cache keys and cache size.\nfunction decache (imagePromise) {\n imagePromise.then(function (image) {\n if (image.decache) {\n image.decache();\n }\n });\n}\n\nexport function purgeCache () {\n while (cachedImages.length > 0) {\n const removedCachedImage = cachedImages[0];\n\n removeImagePromise(removedCachedImage.imageId);\n }\n}\n\nexport function changeImageIdCacheSize (imageId, newCacheSize) {\n const cacheEntry = imageCacheDict[imageId];\n\n if (cacheEntry) {\n cacheEntry.imagePromise.then(function (image) {\n const cacheSizeDifference = newCacheSize - image.sizeInBytes;\n\n image.sizeInBytes = newCacheSize;\n cacheEntry.sizeInBytes = newCacheSize;\n cacheSizeInBytes += cacheSizeDifference;\n\n const eventDetails = {\n action: 'changeImageSize',\n image\n };\n\n triggerEvent(events, 'CornerstoneImageCacheChanged', eventDetails);\n });\n }\n}\n\nexport default {\n imageCache: imageCacheDict,\n cachedImages,\n setMaximumSizeBytes,\n putImagePromise,\n getImagePromise,\n removeImagePromise,\n getCacheInfo,\n purgeCache,\n changeImageIdCacheSize\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageCache.js","import colors from './colors/index.js';\n\n/**\n * Converts the image pixel data into a false color data\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Object} lookupTable A lookup table Object\n *\n * @returns {void}\n */\nexport default function (image, lookupTable) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = image.width * image.height;\n const origPixelData = image.origPixelData || image.getPixelData();\n const storedColorPixelData = new Uint8Array(numPixels * 4);\n let sp;\n let mapped;\n\n image.color = true;\n image.falseColor = true;\n image.origPixelData = origPixelData;\n\n if (lookupTable instanceof colors.LookupTable) {\n lookupTable.build();\n\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n mapped = lookupTable.mapValue(sp);\n storedColorPixelData[canvasImageDataIndex++] = mapped[0];\n storedColorPixelData[canvasImageDataIndex++] = mapped[1];\n storedColorPixelData[canvasImageDataIndex++] = mapped[2];\n storedColorPixelData[canvasImageDataIndex++] = mapped[3];\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][3]; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha\n }\n }\n\n image.rgba = true;\n image.cachedLut = undefined;\n image.render = undefined;\n image.slope = 1;\n image.intercept = 0;\n image.minPixelValue = 0;\n image.maxPixelValue = 255;\n image.windowWidth = 255;\n image.windowCenter = 128;\n image.getPixelData = () => storedColorPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelDataToFalseColorData.js","// Internal (some of these are from old internal/legacy expose)\nexport { default as drawImage } from './internal/drawImage.js';\nexport { default as generateLut } from './internal/generateLut.js';\nexport { default as getDefaultViewport } from './internal/getDefaultViewport.js';\nexport { default as requestAnimationFrame } from './internal/requestAnimationFrame.js';\nexport { default as storedPixelDataToCanvasImageData } from './internal/storedPixelDataToCanvasImageData.js';\nexport { default as storedColorPixelDataToCanvasImageData } from './internal/storedColorPixelDataToCanvasImageData.js';\nexport { default as storedPixelDataToCanvasImageDataColorLUT } from './internal/storedPixelDataToCanvasImageDataColorLUT.js';\nexport { default as storedPixelDataToCanvasImageDataPseudocolorLUT } from './internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js';\n\nexport { default as internal } from './internal/index.js';\n\n// Rendering\nexport { renderLabelMapImage } from './rendering/renderLabelMapImage.js';\nexport { renderPseudoColorImage } from './rendering/renderPseudoColorImage.js';\nexport { renderColorImage } from './rendering/renderColorImage.js';\nexport { renderGrayscaleImage } from './rendering/renderGrayscaleImage.js';\nexport { renderWebImage } from './rendering/renderWebImage.js';\n\nexport { default as canvasToPixel } from './canvasToPixel.js';\nexport { default as disable } from './disable.js';\nexport { default as displayImage } from './displayImage.js';\nexport { default as draw } from './draw.js';\nexport { default as drawInvalidated } from './drawInvalidated.js';\nexport { default as enable } from './enable.js';\nexport { getElementData, removeElementData } from './enabledElementData.js';\nexport {\n getEnabledElement,\n addEnabledElement,\n getEnabledElementsByImageId,\n getEnabledElements\n} from './enabledElements.js';\n\nexport {\n addLayer,\n removeLayer,\n getLayer,\n getLayers,\n getVisibleLayers,\n setActiveLayer,\n getActiveLayer,\n setLayerImage\n} from './layers.js';\n\nexport { default as fitToWindow } from './fitToWindow.js';\nexport { default as getDefaultViewportForImage } from './getDefaultViewportForImage.js';\nexport { default as getImage } from './getImage.js';\nexport { default as getPixels } from './getPixels.js';\nexport { default as getStoredPixels } from './getStoredPixels.js';\nexport { default as getViewport } from './getViewport.js';\nexport {\n loadImage,\n loadAndCacheImage,\n registerImageLoader,\n registerUnknownImageLoader\n} from './imageLoader.js';\n\nexport { default as invalidate } from './invalidate.js';\nexport { default as invalidateImageId } from './invalidateImageId.js';\nexport { default as pageToPixel } from './pageToPixel.js';\nexport { default as pixelToCanvas } from './pixelToCanvas.js';\nexport { default as reset } from './reset.js';\nexport { default as resize } from './resize.js';\nexport { default as setToPixelCoordinateSystem } from './setToPixelCoordinateSystem.js';\nexport { default as setViewport } from './setViewport.js';\nexport { default as updateImage } from './updateImage.js';\nexport { default as pixelDataToFalseColorData } from './pixelDataToFalseColorData.js';\n\nexport { default as rendering } from './rendering/index.js';\nexport { default as imageCache } from './imageCache.js';\nexport { default as metaData } from './metaData.js';\nexport { default as webGL } from './webgl/index.js';\nexport { default as colors } from './colors/index.js';\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage } from './falseColorMapping.js';\n\nexport { default as events } from './events.js';\nexport { default as triggerEvent } from './triggerEvent.js';\nexport { external } from './externalModules.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n */\n\n/**\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateLinearVOILUT (windowWidth, windowCenter) {\n return function (modalityLutValue) {\n return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateNonLinearVOILUT (voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;\n const shift = bitsPerEntry - 8;\n const minValue = voiLUT.lut[0] >> shift;\n const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n */\nexport default function (windowWidth, windowCenter, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getVOILut.js","import drawImage from './drawImage.js';\r\nimport generateLut from './generateLut.js';\r\nimport getDefaultViewport from './getDefaultViewport.js';\r\nimport requestAnimationFrame from './requestAnimationFrame.js';\r\nimport storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA.js';\r\nimport storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataColorLUT from './storedPixelDataToCanvasImageDataColorLUT.js';\r\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from './storedPixelDataToCanvasImageDataPseudocolorLUT.js';\r\nimport getTransform from './getTransform.js';\r\nimport calculateTransform from './calculateTransform.js';\r\nimport { Transform } from './transform.js';\r\n\r\nexport default {\r\n drawImage,\r\n generateLut,\r\n getDefaultViewport,\r\n requestAnimationFrame,\r\n storedPixelDataToCanvasImageData,\r\n storedPixelDataToCanvasImageDataRGBA,\r\n storedPixelDataToCanvasImageDataColorLUT,\r\n storedPixelDataToCanvasImageDataPseudocolorLUT,\r\n storedColorPixelDataToCanvasImageData,\r\n getTransform,\r\n calculateTransform,\r\n Transform\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/index.js","/**\n * Check if two lookup tables match\n *\n * @param {LUT} a A lookup table function\n * @param {LUT} b Another lookup table function\n * @return {boolean} Whether or not they match\n */\nexport default function (a, b) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return (a.id === b.id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/lutMatches.js","import now from './now.js';\n\n/**\n * Converts stored RGBA color pixel values to display pixel values using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedRGBAPixelDataToCanvasImageData.js","/* eslint no-bitwise: 0 */\n\nimport { shaders, dataUtilities } from './shaders/index.js';\nimport { vertexShader } from './vertexShader.js';\nimport textureCache from './textureCache.js';\nimport createProgramFromString from './createProgramFromString.js';\n\nconst renderCanvas = document.createElement('canvas');\nlet gl;\nlet texCoordBuffer;\nlet positionBuffer;\nlet isWebGLInitialized = false;\n\nexport { isWebGLInitialized };\n\nexport function getRenderCanvas () {\n return renderCanvas;\n}\n\nfunction initShaders () {\n for (const id in shaders) {\n // Console.log(\"WEBGL: Loading shader\", id);\n const shader = shaders[id];\n\n shader.attributes = {};\n shader.uniforms = {};\n shader.vert = vertexShader;\n\n shader.program = createProgramFromString(gl, shader.vert, shader.frag);\n\n shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');\n gl.enableVertexAttribArray(shader.attributes.texCoordLocation);\n\n shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');\n gl.enableVertexAttribArray(shader.attributes.positionLocation);\n\n shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');\n }\n}\n\nexport function initRenderer () {\n if (isWebGLInitialized === true) {\n // Console.log(\"WEBGL Renderer already initialized\");\n return;\n }\n\n if (initWebGL(renderCanvas)) {\n initBuffers();\n initShaders();\n // Console.log(\"WEBGL Renderer initialized!\");\n isWebGLInitialized = true;\n }\n}\n\nfunction updateRectangle (gl, width, height) {\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n width, height,\n 0, height,\n width, 0,\n 0, 0]), gl.STATIC_DRAW);\n}\n\nfunction handleLostContext (event) {\n event.preventDefault();\n console.warn('WebGL Context Lost!');\n}\n\nfunction handleRestoredContext (event) {\n event.preventDefault();\n isWebGLInitialized = false;\n textureCache.purgeCache();\n initRenderer();\n // Console.log('WebGL Context Restored.');\n}\n\nfunction initWebGL (canvas) {\n\n gl = null;\n try {\n // Try to grab the standard context. If it fails, fallback to experimental.\n const options = {\n preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element\n };\n\n // ---------------- Testing purposes -------------\n // If (debug === true && WebGLDebugUtils) {\n // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);\n // }\n // ---------------- Testing purposes -------------\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n // Set up event listeners for context lost / context restored\n canvas.removeEventListener('webglcontextlost', handleLostContext, false);\n canvas.addEventListener('webglcontextlost', handleLostContext, false);\n\n canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);\n canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);\n\n } catch (error) {\n throw new Error('Error creating WebGL context');\n }\n\n // If we don't have a GL context, give up now\n if (!gl) {\n console.error('Unable to initialize WebGL. Your browser may not support it.');\n gl = null;\n }\n\n return gl;\n}\n\nfunction getImageDataType (image) {\n if (image.color) {\n return 'rgb';\n }\n\n let datatype = 'int';\n\n if (image.minPixelValue >= 0) {\n datatype = `u${datatype}`;\n }\n\n if (image.maxPixelValue > 255) {\n datatype += '16';\n } else {\n datatype += '8';\n }\n\n return datatype;\n}\n\nfunction getShaderProgram (image) {\n\n const datatype = getImageDataType(image);\n // We need a mechanism for\n // Choosing the shader based on the image datatype\n // Console.log(\"Datatype: \" + datatype);\n\n if (shaders.hasOwnProperty(datatype)) {\n return shaders[datatype];\n }\n\n return shaders.rgb;\n}\n\nfunction generateTexture (image) {\n const TEXTURE_FORMAT = {\n uint8: gl.LUMINANCE,\n int8: gl.LUMINANCE_ALPHA,\n uint16: gl.LUMINANCE_ALPHA,\n int16: gl.RGB,\n rgb: gl.RGB\n };\n\n const TEXTURE_BYTES = {\n int8: 1, // Luminance\n uint16: 2, // Luminance + Alpha\n int16: 3, // RGB\n rgb: 3 // RGB\n };\n\n const imageDataType = getImageDataType(image);\n const format = TEXTURE_FORMAT[imageDataType];\n\n // GL texture configuration\n const texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n const imageData = dataUtilities[imageDataType].storedPixelDataToImageData(image, image.width, image.height);\n\n gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData);\n\n // Calculate the size in bytes of this image in memory\n const sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];\n\n return {\n texture,\n sizeInBytes\n };\n}\n\nfunction getImageTexture (image) {\n let imageTexture = textureCache.getImageTexture(image.imageId);\n\n if (!imageTexture) {\n // Console.log(\"Generating texture for imageid: \", image.imageId);\n imageTexture = generateTexture(image);\n textureCache.putImageTexture(image, imageTexture);\n }\n\n return imageTexture.texture;\n}\n\nfunction initBuffers () {\n positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1, 1,\n 0, 1,\n 1, 0,\n 0, 0\n ]), gl.STATIC_DRAW);\n\n\n texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1.0, 1.0,\n 0.0, 1.0,\n 1.0, 0.0,\n 0.0, 0.0\n ]), gl.STATIC_DRAW);\n}\n\nfunction renderQuad (shader, parameters, texture, width, height) {\n gl.clearColor(1.0, 0.0, 0.0, 1.0);\n gl.viewport(0, 0, width, height);\n\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(shader.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n for (const key in parameters) {\n const uniformLocation = gl.getUniformLocation(shader.program, key);\n\n if (!uniformLocation) {\n continue;\n\n // Disabling this error for now since RGB requires minPixelValue\n // but the other shaders do not.\n // throw `Could not access location for uniform: ${key}`;\n }\n\n const uniform = parameters[key];\n\n const type = uniform.type;\n const value = uniform.value;\n\n if (type === 'i') {\n gl.uniform1i(uniformLocation, value);\n } else if (type === 'f') {\n gl.uniform1f(uniformLocation, value);\n } else if (type === '2f') {\n gl.uniform2f(uniformLocation, value[0], value[1]);\n }\n }\n\n updateRectangle(gl, width, height);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n}\n\nexport function render (enabledElement) {\n // Resize the canvas\n const image = enabledElement.image;\n\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const viewport = enabledElement.viewport;\n\n // Render the current image\n const shader = getShaderProgram(image);\n const texture = getImageTexture(image);\n const parameters = {\n u_resolution: { type: '2f',\n value: [image.width, image.height] },\n wc: { type: 'f',\n value: viewport.voi.windowCenter },\n ww: { type: 'f',\n value: viewport.voi.windowWidth },\n slope: { type: 'f',\n value: image.slope },\n intercept: { type: 'f',\n value: image.intercept },\n minPixelValue: { type: 'f',\n value: image.minPixelValue },\n invert: { type: 'i',\n value: viewport.invert ? 1 : 0 }\n };\n\n renderQuad(shader, parameters, texture, image.width, image.height);\n\n return renderCanvas;\n}\n\nexport function isWebGLAvailable () {\n // Adapted from\n // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas\n\n const options = {\n failIfMajorPerformanceCaveat: true\n };\n\n try {\n const canvas = document.createElement('canvas');\n\n\n return Boolean(window.WebGLRenderingContext) &&\n (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));\n } catch (e) {\n return false;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/renderer.js","import { int16Shader, int16DataUtilities } from './int16.js';\nimport { int8Shader, int8DataUtilities } from './int8.js';\nimport { rgbShader, rgbDataUtilities } from './rgb.js';\nimport { uint16Shader, uint16DataUtilities } from './uint16.js';\nimport { uint8Shader, uint8DataUtilities } from './uint8.js';\n\nconst shaders = {\n int16: int16Shader,\n int8: int8Shader,\n rgb: rgbShader,\n uint16: uint16Shader,\n uint8: uint8Shader\n};\n\nconst dataUtilities = {\n int16: int16DataUtilities,\n int8: int8DataUtilities,\n rgb: rgbDataUtilities,\n uint16: uint16DataUtilities,\n uint8: uint8DataUtilities\n};\n\nexport { shaders, dataUtilities };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/index.js","/* eslint no-bitwise: 0 */\n\nconst int16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack int16 into three uint8 channels (r, g, b)\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack int16 into three uint8 channels (r, g, b)\n const pixelData = image.getPixelData();\n const numberOfChannels = 3;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = Math.abs(pixelData[i]);\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int16DataUtilities = {\n storedPixelDataToImageData\n};\n\nint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.g*65536.0;' +\n\n 'if (color.b == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int16.js","const int8Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Store data in Uint8Array\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n // Store data in Uint8Array\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n data[offset++] = pixelData[i];\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int8DataUtilities = {\n storedPixelDataToImageData\n};\n\nint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.;' +\n\n 'if (color.a == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int8.js","const rgbShader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack RGB images into a 3-channel RGB texture\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n // Only 3 channels, since we use WebGL's RGB texture format\n const numStoredPixels = image.width * image.height * 4;\n const numOutputPixels = image.width * image.height * 3;\n const storedPixelData = image.getPixelData();\n const data = new Uint8Array(numOutputPixels);\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n } else {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n }\n\n return data;\n}\n\nexport const rgbDataUtilities = {\n storedPixelDataToImageData\n};\n\nrgbShader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform float minPixelValue;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n\n // Get texture\n 'vec3 color = texture2D(u_image, v_texCoord).xyz;' +\n\n // Rescale based on slope and intercept\n 'color = color * 256.0 * slope + intercept;' +\n\n // Apply window settings\n 'float center0 = wc - 0.5 - minPixelValue;' +\n 'float width0 = max(ww, 1.0);' +\n 'color = (color - center0) / width0 + 0.5;' +\n\n // RGBA output\n 'gl_FragColor = vec4(color, 1);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' +\n '}';\n\nexport { rgbShader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/rgb.js","/* eslint no-bitwise: 0 */\n\nconst uint16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * For uint16 pack uint16 into two uint8 channels (r and a).\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack uint16 into two uint8 channels (r and a)\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = pixelData[i];\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n }\n\n return data;\n}\n\nexport const uint16DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.a*65536.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint16.js","const uint8Shader = {};\n\n/**\n * Convert stored pixel data to image data. Here we will store\n * all data in the alpha channel.\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n return image.getPixelData();\n}\n\nexport const uint8DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint8.js","export const vertexShader = 'attribute vec2 a_position;' +\n 'attribute vec2 a_texCoord;' +\n 'uniform vec2 u_resolution;' +\n 'varying vec2 v_texCoord;' +\n 'void main() {' +\n 'vec2 zeroToOne = a_position / u_resolution;' +\n 'vec2 zeroToTwo = zeroToOne * 2.0;' +\n 'vec2 clipSpace = zeroToTwo - 1.0;' +\n 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +\n 'v_texCoord = a_texCoord;' +\n '}';\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/vertexShader.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the canvas coordinate system to the pixel coordinate system\n * system. This can be used to reset tools' image coordinates after modifications\n * have been made in canvas space (e.g. moving a tool by a few cm, independent of\n * image resolution).\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {{x: Number, y: Number}} pt The input point in the canvas coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./canvasToPixel.js","import { getEnabledElements } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n\r\n/**\r\n * Disable an HTML element for further use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n if (element === undefined) {\r\n throw new Error('disable: element must not be undefined');\r\n }\r\n\r\n // Search for this element in this list of enabled elements\r\n const enabledElements = getEnabledElements();\r\n\r\n for (let i = 0; i < enabledElements.length; i++) {\r\n if (enabledElements[i].element === element) {\r\n // We found it!\r\n\r\n // Fire an event so dependencies can cleanup\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'CornerstoneElementDisabled', eventData);\r\n\r\n // Remove the child DOM elements that we created (e.g.canvas)\r\n enabledElements[i].element.removeChild(enabledElements[i].canvas);\r\n enabledElements[i].canvas = undefined;\r\n\r\n // Remove this element from the list of enabled elements\r\n enabledElements.splice(i, 1);\r\n\r\n break;\r\n }\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./disable.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport now from './internal/now.js';\nimport { setLayerImage } from './layers.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * Sets a new image object for a given element.\n *\n * Will also apply an optional viewport setting.\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Object} image An Image loaded by a Cornerstone Image Loader\n * @param {Object} [viewport] A set of Cornerstone viewport parameters\n * @returns {void}\n */\nexport default function (element, image, viewport) {\n if (element === undefined) {\n throw new Error('displayImage: parameter element must not be undefined');\n }\n if (image === undefined) {\n throw new Error('displayImage: parameter image must not be undefined');\n }\n\n const enabledElement = getEnabledElement(element);\n const oldImage = enabledElement.image;\n\n enabledElement.image = image;\n\n if (enabledElement.layers && enabledElement.layers.length) {\n setLayerImage(element, image);\n }\n\n if (enabledElement.viewport === undefined) {\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, image);\n }\n\n // Merge viewport\n if (viewport) {\n for (const attrname in viewport) {\n if (viewport[attrname] !== null) {\n enabledElement.viewport[attrname] = viewport[attrname];\n }\n }\n }\n\n let frameRate;\n\n if (enabledElement.lastImageTimeStamp !== undefined) {\n const timeSinceLastImage = now() - enabledElement.lastImageTimeStamp;\n\n frameRate = (1000 / timeSinceLastImage).toFixed();\n }\n\n enabledElement.lastImageTimeStamp = now();\n\n const newImageEventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n oldImage,\n enabledElement,\n frameRate\n };\n\n triggerEvent(enabledElement.element, 'CornerstoneNewImage', newImageEventData);\n\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./displayImage.js","function s4 () {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).\n substring(1);\n}\n\n/**\n * Generate a unique identifier\n *\n * @return {string} A unique identifier\n */\nexport default function () {\n return `${s4() + s4()}-${s4()}-${s4()}-${\n s4()}-${s4()}${s4()}${s4()}`;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/guid.js","/**\n * This module is responsible for immediately drawing an enabled element\n */\n\nimport { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Immediately draws the enabled element\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('draw: image has not been loaded yet');\n }\n\n drawImage(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./draw.js","/**\n * This module is responsible for drawing invalidated enabled elements\n */\n\nimport { getEnabledElements } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Draws all invalidated enabled elements and clears the invalid flag after drawing it\n *\n * @returns {void}\n */\nexport default function () {\n const enabledElements = getEnabledElements();\n\n for (let i = 0; i < enabledElements.length; i++) {\n const ee = enabledElements[i];\n\n if (ee.invalid === true) {\n drawImage(ee, true);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./drawInvalidated.js","import { addEnabledElement } from './enabledElements.js';\r\nimport resize from './resize.js';\r\nimport drawImageSync from './internal/drawImageSync.js';\r\nimport requestAnimationFrame from './internal/requestAnimationFrame.js';\r\nimport webGL from './webgl/index.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n */\r\n\r\nfunction hasImageOrLayers (enabledElement) {\r\n return enabledElement.image !== undefined || enabledElement.layers.length;\r\n}\r\n\r\n\r\n/**\r\n * Enable an HTML Element for use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @param {Object} options Options for the enabledElement\r\n *\r\n * @return {void}\r\n */\r\nexport default function (element, options) {\r\n if (element === undefined) {\r\n throw new Error('enable: parameter element cannot be undefined');\r\n }\r\n\r\n // If this enabled element has the option set for WebGL, we should\r\n // Check if this device actually supports it\r\n if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {\r\n if (webGL.renderer.isWebGLAvailable()) {\r\n // If WebGL is available on the device, initialize the renderer\r\n // And return the renderCanvas from the WebGL rendering path\r\n webGL.renderer.initRenderer();\r\n options.renderer = 'webgl';\r\n } else {\r\n // If WebGL is not available on this device, we will fall back\r\n // To using the Canvas renderer\r\n console.error('WebGL not available, falling back to Canvas renderer');\r\n delete options.renderer;\r\n }\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n\r\n element.appendChild(canvas);\r\n\r\n const enabledElement = {\r\n element,\r\n canvas,\r\n image: undefined, // Will be set once image is loaded\r\n invalid: false, // True if image needs to be drawn, false if not\r\n needsRedraw: true,\r\n options,\r\n layers: [],\r\n data: {},\r\n renderingTools: {}\r\n };\r\n\r\n addEnabledElement(enabledElement);\r\n\r\n resize(element, true);\r\n\r\n /**\r\n * Draw the image immediately\r\n *\r\n * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks\r\n * @returns {void}\r\n */\r\n function draw (timestamp) {\r\n if (enabledElement.canvas === undefined) {\r\n return;\r\n }\r\n\r\n const eventDetails = {\r\n enabledElement,\r\n timestamp\r\n };\r\n\r\n triggerEvent(enabledElement.element, 'CornerstonePreRender', eventDetails);\r\n\r\n if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {\r\n drawImageSync(enabledElement, enabledElement.invalid);\r\n }\r\n\r\n requestAnimationFrame(draw);\r\n }\r\n\r\n draw();\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./enable.js","import now from './now.js';\r\nimport drawCompositeImage from './drawCompositeImage.js';\r\nimport { renderColorImage } from '../rendering/renderColorImage.js';\r\nimport { renderGrayscaleImage } from '../rendering/renderGrayscaleImage.js';\r\nimport { renderPseudoColorImage } from '../rendering/renderPseudoColorImage.js';\r\nimport { renderLabelMapImage } from '../rendering/renderLabelMapImage.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * Draw an image to a given enabled element synchronously\r\n *\r\n * @param {EnabledElement} enabledElement An enabled element to draw into\r\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\r\n * @returns {void}\r\n */\r\nexport default function (enabledElement, invalidated) {\r\n const image = enabledElement.image;\r\n const element = enabledElement.element;\r\n const layers = enabledElement.layers || [];\r\n\r\n // Check if enabledElement can be redrawn\r\n if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {\r\n return;\r\n }\r\n\r\n // Start measuring the time needed to draw the image/layers\r\n const start = now();\r\n\r\n image.stats = {\r\n lastGetPixelDataTime: -1.0,\r\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\r\n lastPutImageDataTime: -1.0,\r\n lastRenderTime: -1.0,\r\n lastLutGenerateTime: -1.0\r\n };\r\n\r\n if (layers && layers.length) {\r\n drawCompositeImage(enabledElement, invalidated);\r\n } else if (image) {\r\n let render = image.render;\r\n\r\n if (!render) {\r\n if (enabledElement.viewport.colormap &&\r\n enabledElement.viewport.colormap !== '' &&\r\n enabledElement.image.labelmap === true) {\r\n render = renderLabelMapImage;\r\n } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {\r\n render = renderPseudoColorImage;\r\n } else if (image.color) {\r\n render = renderColorImage;\r\n } else {\r\n render = renderGrayscaleImage;\r\n }\r\n }\r\n\r\n render(enabledElement, invalidated);\r\n }\r\n\r\n // Calculate how long it took to draw the image/layers\r\n const renderTimeInMs = now() - start;\r\n\r\n const eventData = {\r\n viewport: enabledElement.viewport,\r\n element,\r\n image,\r\n enabledElement,\r\n canvasContext: enabledElement.canvas.getContext('2d'),\r\n renderTimeInMs\r\n };\r\n\r\n image.stats.lastRenderTime = renderTimeInMs;\r\n\r\n enabledElement.invalid = false;\r\n enabledElement.needsRedraw = false;\r\n\r\n triggerEvent(element, 'CornerstoneImageRendered', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImageSync.js","import { getLayers, getActiveLayer, getVisibleLayers } from '../layers.js';\nimport { addGrayscaleLayer } from '../rendering/renderGrayscaleImage.js';\nimport { addColorLayer } from '../rendering/renderColorImage.js';\nimport { addPseudoColorLayer } from '../rendering/renderPseudoColorImage.js';\nimport { addLabelMapLayer } from '../rendering/renderLabelMapImage.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\n\n// This is used to keep each of the layers' viewports in sync with the active layer\nconst originalViewportScale = {};\n\nfunction getViewportRatio (baseLayerId, targetLayerId) {\n return originalViewportScale[targetLayerId] / originalViewportScale[baseLayerId];\n}\n\n// Sync all viewports based on active layer's viewport\nfunction syncViewports (layers, activeLayer) {\n // If we intend to keep the viewport's scale, translation and rotation in sync,\n // loop through the layers\n layers.forEach((layer) => {\n // Don't do anything to the active layer\n // Don't do anything if this layer has no viewport\n if (layer === activeLayer ||\n !layer.viewport ||\n !activeLayer.viewport) {\n return;\n }\n\n if (!originalViewportScale[layer.layerId]) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n\n const viewportRatio = getViewportRatio(activeLayer.layerId, layer.layerId);\n\n // Update the layer's translation and scale to keep them in sync with the first image\n // based on the ratios between the images\n layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;\n layer.viewport.rotation = activeLayer.viewport.rotation;\n layer.viewport.translation = {\n x: (activeLayer.viewport.translation.x / viewportRatio),\n y: (activeLayer.viewport.translation.y / viewportRatio)\n };\n layer.viewport.hflip = activeLayer.viewport.hflip;\n layer.viewport.vflip = activeLayer.viewport.vflip;\n });\n}\n\n/**\n * Internal function to render all layers for a Cornerstone enabled element\n *\n * @param {CanvasRenderingContext2D} context Canvas context to draw upon\n * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element\n * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn\n * @returns {void}\n */\nfunction renderLayers (context, layers, invalidated) {\n // Loop through each layer and draw it to the canvas\n layers.forEach((layer, index) => {\n if (!layer.image) {\n return;\n }\n\n context.save();\n\n // Set the layer's canvas to the pixel coordinate system\n layer.canvas = context.canvas;\n setToPixelCoordinateSystem(layer, context);\n\n // Render into the layer's canvas\n const colormap = layer.viewport.colormap || layer.options.colormap;\n const labelmap = layer.viewport.labelmap;\n const isInvalid = layer.invalid || invalidated;\n\n if (colormap && colormap !== '' && labelmap === true) {\n addLabelMapLayer(layer, isInvalid);\n } else if (colormap && colormap !== '') {\n addPseudoColorLayer(layer, isInvalid);\n } else if (layer.image.color === true) {\n addColorLayer(layer, isInvalid);\n } else {\n // If this is the base layer, use the alpha channel for rendering of the grayscale image\n const useAlphaChannel = (index === 0);\n\n addGrayscaleLayer(layer, isInvalid, useAlphaChannel);\n }\n\n // Apply any global opacity settings that have been defined for this layer\n if (layer.options && layer.options.opacity) {\n context.globalAlpha = layer.options.opacity;\n } else {\n context.globalAlpha = 1;\n }\n\n if (layer.options && layer.options.fillStyle) {\n context.fillStyle = layer.options.fillStyle;\n }\n\n // Set the pixelReplication property before drawing from the layer into the\n // composite canvas\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Draw from the current layer's canvas onto the enabled element's canvas\n const { width, height } = layer.image;\n\n context.drawImage(layer.canvas, 0, 0, width, height, 0, 0, width, height);\n context.restore();\n\n layer.invalid = false;\n });\n}\n\n/**\n * Internal API function to draw a composite image to a given enabled element\n *\n * @param {EnabledElement} enabledElement An enabled element to draw into\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated) {\n const element = enabledElement.element;\n const allLayers = getLayers(element);\n const activeLayer = getActiveLayer(element);\n const visibleLayers = getVisibleLayers(element);\n const resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports;\n\n // This state will help us to determine if the user has re-synced the\n // layers allowing us to make a new copy of the viewports\n enabledElement.lastSyncViewportsState = enabledElement.syncViewports;\n\n // Stores a copy of all viewports if the user has just synced them then we can use the\n // copies to calculate anything later (ratio, translation offset, rotation offset, etc)\n if (resynced) {\n allLayers.forEach(function (layer) {\n if (layer.viewport) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n });\n }\n\n // Sync all viewports in case it's activated\n if (enabledElement.syncViewports === true) {\n syncViewports(visibleLayers, activeLayer);\n }\n\n // Get the enabled element's canvas so we can draw to it\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Render all visible layers\n renderLayers(context, visibleLayers, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawCompositeImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n * @returns {*} Whatever data is stored for this enabled element\n */\nexport function getElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n if (ee.data.hasOwnProperty(dataType) === false) {\n ee.data[dataType] = {};\n }\n\n return ee.data[dataType];\n}\n\n/**\n * Clears any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n *\n * @returns {void}\n */\nexport function removeElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n delete ee.data[dataType];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElementData.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\n\n/**\n * Returns a default viewport for display the specified image on the specified\n * enabled element. The default viewport is fit to window\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image Object\n *\n * @returns {Viewport} The default viewport for the image\n */\nexport default function (element, image) {\n const enabledElement = getEnabledElement(element);\n\n return getDefaultViewport(enabledElement.canvas, image);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getDefaultViewportForImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Returns the currently displayed image for an element or undefined if no image has\n * been displayed yet\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Image} The Cornerstone Image Object displayed in this element\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.image;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getImage.js","import { getEnabledElement } from './enabledElements.js';\nimport getStoredPixels from './getStoredPixels.js';\nimport getModalityLUT from './internal/getModalityLUT.js';\n\n/**\n * Retrieves an array of pixels from a rectangular region with modality LUT transformation applied\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The modality pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n const storedPixels = getStoredPixels(element, x, y, width, height);\n const ee = getEnabledElement(element);\n const mlutfn = getModalityLUT(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);\n\n return storedPixels.map(mlutfn);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getPixels.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves the viewport for the specified enabled element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Viewport|undefined} The Cornerstone Viewport settings for this element, if they exist. Otherwise, undefined\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const viewport = enabledElement.viewport;\n\n if (viewport === undefined) {\n return;\n }\n\n // Return a copy of the viewport\n return Object.assign({}, viewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getViewport.js","import { getImagePromise, putImagePromise } from './imageCache.js';\r\nimport events from './events.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module deals with ImageLoaders, loading images and caching images\r\n */\r\n\r\n\r\nconst imageLoaders = {};\r\n\r\nlet unknownImageLoader;\r\n\r\n/**\r\n * Load an image using a registered Cornerstone Image Loader.\r\n *\r\n * The image loader that is used will be\r\n * determined by the image loader scheme matching against the imageId.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\r\nfunction loadImageFromImageLoader (imageId, options) {\r\n const colonIndex = imageId.indexOf(':');\r\n const scheme = imageId.substring(0, colonIndex);\r\n const loader = imageLoaders[scheme];\r\n let imagePromise;\r\n\r\n if (loader === undefined || loader === null) {\r\n if (unknownImageLoader !== undefined) {\r\n imagePromise = unknownImageLoader(imageId);\r\n\r\n return imagePromise;\r\n }\r\n\r\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\r\n }\r\n\r\n imagePromise = loader(imageId, options);\r\n\r\n // Broadcast an image loaded event once the image is loaded\r\n imagePromise.then(function (image) {\r\n triggerEvent(events, 'CornerstoneImageLoaded', { image });\r\n });\r\n\r\n return imagePromise;\r\n}\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\r\nexport function loadImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadImage: parameter imageId must not be undefined');\r\n }\r\n\r\n let imagePromise = getImagePromise(imageId);\r\n\r\n if (imagePromise !== undefined) {\r\n return imagePromise;\r\n }\r\n\r\n imagePromise = loadImageFromImageLoader(imageId, options);\r\n\r\n return imagePromise;\r\n}\r\n\r\n//\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\r\nexport function loadAndCacheImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadAndCacheImage: parameter imageId must not be undefined');\r\n }\r\n\r\n let imagePromise = getImagePromise(imageId);\r\n\r\n if (imagePromise !== undefined) {\r\n return imagePromise;\r\n }\r\n\r\n imagePromise = loadImageFromImageLoader(imageId, options);\r\n\r\n putImagePromise(imageId, imagePromise);\r\n\r\n return imagePromise;\r\n}\r\n\r\n/**\r\n * Registers an imageLoader plugin with cornerstone for the specified scheme\r\n *\r\n * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\r\n * @param {Function} imageLoader A Cornerstone Image Loader function\r\n * @returns {void}\r\n */\r\nexport function registerImageLoader (scheme, imageLoader) {\r\n imageLoaders[scheme] = imageLoader;\r\n}\r\n\r\n/**\r\n * Registers a new unknownImageLoader and returns the previous one\r\n *\r\n * @param {Function} imageLoader A Cornerstone Image Loader\r\n *\r\n * @returns {Function|Undefined} The previous Unknown Image Loader\r\n */\r\nexport function registerUnknownImageLoader (imageLoader) {\r\n const oldImageLoader = unknownImageLoader;\r\n\r\n unknownImageLoader = imageLoader;\r\n\r\n return oldImageLoader;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./imageLoader.js","import { getEnabledElement } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module contains a function to make an image is invalid\r\n */\r\n\r\n/**\r\n * Sets the invalid flag on the enabled element and fire an event\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n const enabledElement = getEnabledElement(element);\r\n\r\n enabledElement.invalid = true;\r\n enabledElement.needsRedraw = true;\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'CornerstoneInvalidated', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./invalidate.js","/**\n * This module contains a function to immediately invalidate an image\n */\n\nimport { getEnabledElementsByImageId } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the all enabled elements\n * displaying the specified imageId\n *\n * @param {string} imageId The imageId of the Cornerstone Image Object to redraw\n * @returns {void}\n */\nexport default function (imageId) {\n\n const enabledElements = getEnabledElementsByImageId(imageId);\n\n enabledElements.forEach(function (enabledElement) {\n drawImage(enabledElement, true);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./invalidateImageId.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the page coordinate system to the pixel coordinate\n * system\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {Number} pageX The x value in the page coordinate system\n * @param {Number} pageY The y value in the page coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pageX, pageY) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('image has not been loaded yet');\n }\n\n // Convert the pageX and pageY to the canvas client coordinates\n const rect = element.getBoundingClientRect();\n const clientX = pageX - rect.left - window.pageXOffset;\n const clientY = pageY - rect.top - window.pageYOffset;\n\n const pt = { x: clientX,\n y: clientY };\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pageToPixel.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the pixel coordinate system to the canvas coordinate system\n * system. This can be used to render using canvas context without having the weird\n * side effects that come from scaling and non square pixels\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system\n *\n * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelToCanvas.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Resets the viewport to the default settings\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, enabledElement.image);\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./reset.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\nconst MIN_WINDOW_WIDTH = 0.000001;\nconst MIN_VIEWPORT_SCALE = 0.0001;\n\n/**\n * Sets the viewport for an element and corrects invalid values\n *\n * @param {HTMLElement} element - DOM element of the enabled element\n * @param {Viewport} viewport - Object containing the viewport properties\n * @returns {void}\n */\nexport default function (element, viewport) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport.translation.x = viewport.translation.x;\n enabledElement.viewport.translation.y = viewport.translation.y;\n enabledElement.viewport.voi.windowCenter = viewport.voi.windowCenter;\n enabledElement.viewport.invert = viewport.invert;\n enabledElement.viewport.pixelReplication = viewport.pixelReplication;\n enabledElement.viewport.rotation = viewport.rotation;\n enabledElement.viewport.hflip = viewport.hflip;\n enabledElement.viewport.vflip = viewport.vflip;\n enabledElement.viewport.modalityLUT = viewport.modalityLUT;\n enabledElement.viewport.voiLUT = viewport.voiLUT;\n enabledElement.viewport.colormap = viewport.colormap;\n enabledElement.viewport.labelmap = viewport.labelmap;\n\n // Prevent window width from being too small (note that values close to zero are valid and can occur with\n // PET images in particular)\n enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);\n\n // Prevent scale from getting too small\n enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);\n\n // Normalize the rotation value to a positive rotation in degrees\n enabledElement.viewport.rotation %= 360;\n if (enabledElement.viewport.rotation < 0) {\n enabledElement.viewport.rotation += 360;\n }\n\n // Force the image to be updated since the viewport has been modified\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setViewport.js","import { renderColorImage } from './renderColorImage.js';\nimport { renderGrayscaleImage } from './renderGrayscaleImage.js';\nimport { renderWebImage } from './renderWebImage.js';\n\nexport default {\n colorImage: renderColorImage,\n grayscaleImage: renderGrayscaleImage,\n webImage: renderWebImage\n};\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/index.js","// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nconst providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param {Function} provider Metadata provider function\n * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @returns {void}\n */\nexport function addProvider (provider, priority = 0) {\n let i;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority,\n provider\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param {Function} provider Metadata provider function\n *\n * @returns {void}\n */\nexport function removeProvider (provider) {\n for (let i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param {String} type The type of metadata requested from the metadata store\n * @param {String} imageId The Cornerstone Image Object's imageId\n *\n * @returns {*} The metadata retrieved from the metadata store\n */\nfunction getMetaData (type, imageId) {\n // Invoke each provider in priority order until one returns something\n for (let i = 0; i < providers.length; i++) {\n const result = providers[i].provider(type, imageId);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexport default {\n addProvider,\n removeProvider,\n get: getMetaData\n};\n\n\n\n// WEBPACK FOOTER //\n// ./metaData.js","import { getEnabledElement } from './enabledElements.js';\nimport pixelDataToFalseColorData from './pixelDataToFalseColorData.js';\nimport { getColormap } from './colors/colormap.js';\n\n/**\n * Retrieves the minimum and maximum pixel values from an Array of pixel data\n *\n * @param {Array} pixelData The input pixel data array\n *\n * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array\n */\nfunction getPixelValues (pixelData) {\n let minPixelValue = Number.MAX_VALUE;\n let maxPixelValue = Number.MIN_VALUE;\n const len = pixelData.length;\n let pixel;\n\n for (let i = 0; i < len; i++) {\n pixel = pixelData[i];\n minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;\n maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;\n }\n\n return {\n minPixelValue,\n maxPixelValue\n };\n}\n\n/**\n * Retrieve a function that will allow an image object to be reset to its original form\n * after a false color mapping transformation\n *\n * @param {Image} image A Cornerstone Image Object\n *\n * @return {Function} A function for resetting an Image Object to its original form\n */\nfunction getRestoreImageMethod (image) {\n if (image.restore) {\n return image.restore;\n }\n\n const color = image.color;\n const rgba = image.rgba;\n const cachedLut = image.cachedLut;\n const slope = image.slope;\n const windowWidth = image.windowWidth;\n const windowCenter = image.windowCenter;\n const minPixelValue = image.minPixelValue;\n const maxPixelValue = image.maxPixelValue;\n\n return function () {\n image.color = color;\n image.rgba = rgba;\n image.cachedLut = cachedLut;\n image.slope = slope;\n image.windowWidth = windowWidth;\n image.windowCenter = windowCenter;\n image.minPixelValue = minPixelValue;\n image.maxPixelValue = maxPixelValue;\n\n if (image.origPixelData) {\n const pixelData = image.origPixelData;\n\n image.getPixelData = () => pixelData;\n }\n\n // Remove some attributes added by false color mapping\n image.origPixelData = undefined;\n image.colormapId = undefined;\n image.falseColor = undefined;\n };\n}\n\n//\n// Then we need to make sure it will be converted into a colormap object if it's as string.\n\n/**\n * User can pass a colormap or its id as string to some of these public functions.\n * Then we need to make sure it will be converted into a colormap object if it's a string.\n *\n * @param {*} colormap A colormap ID or Object\n * @return {*} The colormap\n */\nfunction ensuresColormap (colormap) {\n if (colormap && (typeof colormap === 'string')) {\n colormap = getColormap(colormap);\n }\n\n return colormap;\n}\n\n/**\n * Restores a false color image to its original version\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.\n */\nfunction restoreImage (image) {\n if (image.restore && (typeof image.restore === 'function')) {\n image.restore();\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Convert an image to a false color image\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {Boolean} - Whether or not the image has been converted to a false color image\n */\nfunction convertImageToFalseColorImage (image, colormap) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n // User can pass a colormap id or a colormap object\n colormap = ensuresColormap(colormap);\n\n const colormapId = colormap.getId();\n\n // Doesn't do anything if colormapId hasn't changed\n if (image.colormapId === colormapId) {\n // It has already being converted into a false color image\n // Using the colormapId passed as parameter\n return false;\n }\n\n // Restore the image attributes updated when converting to a false color image\n restoreImage(image);\n\n // Convert the image to a false color image\n if (colormapId) {\n const minPixelValue = image.minPixelValue || 0;\n const maxPixelValue = image.maxPixelValue || 255;\n\n image.restore = getRestoreImageMethod(image);\n\n const lookupTable = colormap.createLookupTable();\n\n lookupTable.setTableRange(minPixelValue, maxPixelValue);\n\n // Update the pixel data and render the new image\n pixelDataToFalseColorData(image, lookupTable);\n\n // Update min and max pixel values\n const pixelValues = getPixelValues(image.getPixelData());\n\n image.minPixelValue = pixelValues.minPixelValue;\n image.maxPixelValue = pixelValues.maxPixelValue;\n\n image.windowWidth = 255;\n image.windowCenter = 128;\n\n // Cache the last colormapId used for performance\n // Then it doesn't need to be re-rendered on next\n // Time if the user hasn't updated it\n image.colormapId = colormapId;\n }\n\n // Return `true` to tell the caller that the image has got updated\n return true;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {HTMLElement} element The Cornerstone element\n * @param {*} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {void}\n */\nfunction convertToFalseColorImage (element, colormap) {\n const enabledElement = getEnabledElement(element);\n\n\n return convertImageToFalseColorImage(enabledElement.image, colormap);\n}\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage };\n\n\n\n// WEBPACK FOOTER //\n// ./falseColorMapping.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 550c4504c5dd61a5347c","webpack:///./enabledElements.js","webpack:///./internal/now.js","webpack:///./triggerEvent.js","webpack:///./setToPixelCoordinateSystem.js","webpack:///./updateImage.js","webpack:///./internal/drawImage.js","webpack:///./internal/getDefaultViewport.js","webpack:///./colors/index.js","webpack:///./rendering/renderColorImage.js","webpack:///./internal/getTransform.js","webpack:///./rendering/initializeRenderCanvas.js","webpack:///./rendering/saveLastRendered.js","webpack:///./rendering/doesImageNeedToBeRendered.js","webpack:///./webgl/index.js","webpack:///./events.js","webpack:///./rendering/renderGrayscaleImage.js","webpack:///./internal/generateLut.js","webpack:///./internal/requestAnimationFrame.js","webpack:///./internal/storedPixelDataToCanvasImageData.js","webpack:///./internal/storedColorPixelDataToCanvasImageData.js","webpack:///./internal/storedPixelDataToCanvasImageDataColorLUT.js","webpack:///./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","webpack:///./internal/calculateTransform.js","webpack:///./rendering/renderLabelMapImage.js","webpack:///./rendering/renderPseudoColorImage.js","webpack:///./layers.js","webpack:///./internal/getModalityLUT.js","webpack:///./internal/getVOILut.js","webpack:///./colors/colormap.js","webpack:///./colors/lookupTable.js","webpack:///./internal/storedPixelDataToCanvasImageDataRGBA.js","webpack:///./internal/transform.js","webpack:///./rendering/getLut.js","webpack:///./webgl/textureCache.js","webpack:///./webgl/createProgramFromString.js","webpack:///./rendering/renderWebImage.js","webpack:///./resize.js","webpack:///./fitToWindow.js","webpack:///./getStoredPixels.js","webpack:///./imageCache.js","webpack:///./pixelDataToFalseColorData.js","webpack:///./index.js","webpack:///./internal/index.js","webpack:///./rendering/lutMatches.js","webpack:///./internal/generateColorLut.js","webpack:///./internal/storedRGBAPixelDataToCanvasImageData.js","webpack:///./webgl/renderer.js","webpack:///./webgl/shaders/index.js","webpack:///./webgl/shaders/int16.js","webpack:///./webgl/shaders/int8.js","webpack:///./webgl/shaders/rgb.js","webpack:///./webgl/shaders/uint16.js","webpack:///./webgl/shaders/uint8.js","webpack:///./webgl/vertexShader.js","webpack:///./canvasToPixel.js","webpack:///./disable.js","webpack:///./displayImage.js","webpack:///./internal/guid.js","webpack:///./draw.js","webpack:///./drawInvalidated.js","webpack:///./enable.js","webpack:///./internal/drawImageSync.js","webpack:///./internal/drawCompositeImage.js","webpack:///./enabledElementData.js","webpack:///./getDefaultViewportForImage.js","webpack:///./getImage.js","webpack:///./getPixels.js","webpack:///./getViewport.js","webpack:///./imageLoader.js","webpack:///./invalidate.js","webpack:///./invalidateImageId.js","webpack:///./pageToPixel.js","webpack:///./pixelToCanvas.js","webpack:///./reset.js","webpack:///./setViewport.js","webpack:///./rendering/index.js","webpack:///./metaData.js","webpack:///./falseColorMapping.js"],"names":["getEnabledElement","addEnabledElement","getEnabledElementsByImageId","getEnabledElements","enabledElements","element","undefined","Error","i","length","enabledElement","push","imageId","ees","forEach","image","window","performance","now","Date","triggerEvent","el","type","detail","event","CustomEvent","cancelable","document","createEvent","initCustomEvent","dispatchEvent","context","scale","transform","setTransform","m","invalidated","layers","needsRedraw","invalid","canvas","translation","x","y","voi","windowWidth","windowCenter","invert","pixelReplication","rotation","hflip","vflip","modalityLUT","voiLUT","colormap","labelmap","verticalScale","height","rows","horizontalScale","width","columns","Math","min","Boolean","getColormap","getColormapsList","LookupTable","renderColorImage","addColorLayer","getLut","viewport","cachedLut","lutArray","getRenderCanvas","renderingTools","renderCanvas","createElement","getCanvas","start","colorLut","stats","lastLutGenerateTime","renderCanvasData","renderCanvasContext","rgba","data","putImageData","lastPutImageDataTime","getContext","fillStyle","fillRect","imageSmoothingEnabled","mozImageSmoothingEnabled","options","renderer","toLowerCase","render","drawImage","layer","canvasContext","getImageData","lastRenderedImageId","lastRenderedViewport","mod","createProgramFromString","initRenderer","isWebGLAvailable","textureCache","Object","defineProperty","enumerable","configurable","get","EventTarget","listeners","callback","stack","l","splice","call","defaultPrevented","events","renderGrayscaleImage","addGrayscaleLayer","useAlphaChannel","lut","maxPixelValue","minPixelValue","offset","Uint8ClampedArray","mlutfn","slope","intercept","vlutfn","storedValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","requestFrame","setTimeout","canvasImageDataData","pixelData","getPixelData","lastGetPixelDataTime","numPixels","canvasImageDataIndex","storedPixelDataIndex","Int16Array","Uint16Array","lastStoredPixelDataToCanvasImageDataTime","storedPixelDataToCanvasImageDataColorLUT","clut","Table","storedPixelDataToCanvasImageDataPseudocolorLUT","grayscaleLut","grayscale","translate","angle","rotate","PI","widthScale","heightScale","rowPixelSpacing","columnPixelSpacing","renderLabelMapImage","addLabelMapLayer","colormapId","getId","createLookupTable","renderPseudoColorImage","addPseudoColorLayer","setNumberOfColors","rescaleImage","addLayer","removeLayer","getLayer","getLayers","getVisibleLayers","setActiveLayer","setLayerImage","getActiveLayer","eventName","layerId","eventData","baseLayer","targetLayer","baseImage","targetImage","colRelative","viewportRatio","assign","syncViewports","newLayer","index","findIndex","activeLayerId","find","filter","visible","opacity","defaultViewport","generateNonLinearModalityLUT","generateLinearModalityLUT","storedPixelValue","minValue","maxValue","maxValueMapped","firstValueMapped","generateNonLinearVOILUT","generateLinearVOILUT","modalityLutValue","bitsPerEntry","max","toString","shift","COLOR_TRANSPARENT","colormapsData","hotIron","name","numOfColors","colors","pet","numColors","hotMetalBlue","pet20Step","gray","gamma","segmentedData","red","green","blue","jet","hsv","hot","cool","spring","summer","autumn","winter","bone","copper","spectral","coolwarm","blues","linspace","a","b","n","increment","vector","getRank","array","elem","left","right","mid","floor","midElem","searchSorted","inputArray","values","indexes","len","sort","makeMappingArray","N","y0","y1","xLinSpace","pow","xLinSpaceIndexes","colorPercent","colorDelta","createLinearSegmentedColormap","redLut","greenLut","blueLut","round","colormaps","keys","key","hasOwnProperty","id","aName","bName","colormapData","getColorSchemeName","setColorSchemeName","getNumberOfColors","getColor","isValidIndex","getColorRepeating","setColor","addColor","insertColor","removeColor","clearColors","buildLookupTable","setNumberOfTableValues","setTableValue","BELOW_RANGE_COLOR_INDEX","ABOVE_RANGE_COLOR_INDEX","NAN_COLOR_INDEX","HSVToRGB","hue","sat","val","rgb","hueCase","frac","lx","ly","lz","linearIndexLookupMain","v","p","dIndex","Range","MaxIndex","Shift","Scale","NumberOfColors","Ramp","TableRange","HueRange","SaturationRange","ValueRange","AlphaRange","NaNColor","BelowRangeColor","UseBelowRangeColor","AboveRangeColor","UseAboveRangeColor","InputRange","number","ramp","end","scalar","mapValue","force","maxIndex","hinc","sinc","vinc","ainc","alpha","c_rgba","cos","sqrt","buildSpecialColors","numberOfColors","belowRangeColorIndex","aboveRangeColorIndex","nanColorIndex","getIndex","Number","MAX_VALUE","isNaN","arguments","Array","prototype","slice","pixelValue","Transform","reset","matrix","m11","m12","m21","m22","dx","dy","d","m0","m1","m2","m3","m4","m5","rad","c","s","sin","sx","sy","px","py","imageCache","cachedImages","maximumSizeInBytes","cacheSizeInBytes","getCacheInfo","numberOfImagesCached","purgeCacheIfNecessary","compare","timeStamp","lastCachedImage","sizeInBytes","pop","cacheInfo","setMaximumSizeBytes","numBytes","toFixed","putImageTexture","imageTexture","cachedImage","getImageTexture","removeImageTexture","indexOf","purgeCache","removedCachedImage","gl","vertexShaderSrc","fragShaderSrc","vertexShader","compileShader","VERTEX_SHADER","fragShader","FRAGMENT_SHADER","createProgram","shaderSource","shaderType","shader","createShader","success","getShaderParameter","COMPILE_STATUS","isContextLost","infoLog","getShaderInfoLog","console","error","fragmentShader","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","renderWebImage","getImage","fitViewportToWindow","setCanvasSize","clientWidth","style","clientHeight","imageSize","getImageSize","storedPixels","row","column","spIndex","putImageLoadObject","getImageLoadObject","removeImageLoadObject","changeImageIdCacheSize","imageCacheDict","imageLoadObject","promise","cancelFn","loaded","sharedCacheKey","then","eventDetails","action","decache","imagePromise","newCacheSize","cacheEntry","cacheSizeDifference","lookupTable","color","falseColor","origPixelData","storedColorPixelData","Uint8Array","sp","mapped","build","default","getElementData","removeElementData","loadImage","loadAndCacheImage","registerImageLoader","registerUnknownImageLoader","convertImageToFalseColorImage","convertToFalseColorImage","restoreImage","generateLut","getDefaultViewport","storedPixelDataToCanvasImageData","storedPixelDataToCanvasImageDataRGBA","storedColorPixelDataToCanvasImageData","getTransform","calculateTransform","texCoordBuffer","positionBuffer","isWebGLInitialized","initShaders","attributes","uniforms","vert","frag","texCoordLocation","getAttribLocation","enableVertexAttribArray","positionLocation","resolutionLocation","getUniformLocation","initWebGL","initBuffers","updateRectangle","bufferData","ARRAY_BUFFER","Float32Array","STATIC_DRAW","handleLostContext","preventDefault","warn","handleRestoredContext","preserveDrawingBuffer","removeEventListener","addEventListener","getImageDataType","datatype","getShaderProgram","generateTexture","TEXTURE_FORMAT","uint8","LUMINANCE","int8","LUMINANCE_ALPHA","uint16","int16","RGB","TEXTURE_BYTES","imageDataType","format","texture","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","pixelStorei","UNPACK_ALIGNMENT","imageData","storedPixelDataToImageData","texImage2D","UNSIGNED_BYTE","createBuffer","bindBuffer","renderQuad","parameters","clearColor","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","useProgram","vertexAttribPointer","FLOAT","uniformLocation","uniform","value","uniform1i","uniform1f","uniform2f","activeTexture","TEXTURE0","drawArrays","TRIANGLE_STRIP","u_resolution","wc","ww","failIfMajorPerformanceCaveat","WebGLRenderingContext","e","shaders","dataUtilities","int16Shader","numberOfChannels","abs","int16DataUtilities","int8Shader","int8DataUtilities","rgbShader","numStoredPixels","numOutputPixels","storedPixelData","rgbDataUtilities","uint16Shader","uint16DataUtilities","uint8Shader","uint8DataUtilities","pt","transformPoint","removeChild","oldImage","attrname","frameRate","lastImageTimeStamp","timeSinceLastImage","newImageEventData","s4","random","substring","ee","appendChild","draw","timestamp","hasImageOrLayers","lastRenderTime","renderTimeInMs","allLayers","activeLayer","visibleLayers","resynced","lastSyncViewportsState","originalViewportScale","renderLayers","getViewportRatio","baseLayerId","targetLayerId","save","isInvalid","globalAlpha","restore","dataType","map","imageLoaders","unknownImageLoader","loadImageFromImageLoader","colonIndex","scheme","loader","errorObject","imageLoader","oldImageLoader","pageX","pageY","rect","getBoundingClientRect","clientX","pageXOffset","clientY","top","pageYOffset","MIN_WINDOW_WIDTH","MIN_VIEWPORT_SCALE","colorImage","grayscaleImage","webImage","addProvider","removeProvider","providers","provider","priority","getMetaData","result","getPixelValues","MIN_VALUE","pixel","getRestoreImageMethod","ensuresColormap","setTableRange","pixelValues"],"mappings":"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","file":"cornerstone.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstone-core\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstone-core\"] = factory();\n\telse\n\t\troot[\"cornerstone\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 41);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 550c4504c5dd61a5347c","const enabledElements = [];\n\n/**\n * A two-dimensional vector\n *\n * @typedef {Object} vec2\n * @param {Number} x - The x distance\n * @param {Number} y - The y distance\n */\n\n/**\n * VOI\n *\n * @typedef {Object} VOI\n * @param {Number} windowWidth - Window Width for display\n * @param {Number} windowCenter - Window Center for display\n */\n\n/**\n * Lookup Table Array\n *\n * @typedef {Object} LUT\n * @property {Number} firstValueMapped\n * @property {Number} numBitsPerEntry\n * @property {Array} lut\n */\n\n/**\n * Image Statistics Object\n *\n * @typedef {Object} ImageStats\n *\n * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image\n * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array\n * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context\n * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run\n * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image\n */\n\n/**\n * An Image Object in Cornerstone\n *\n * @typedef {Object} Image\n *\n * @property {string} imageId - The imageId associated with this image object\n * @property {Number} minPixelValue - the minimum stored pixel value in the image\n * @property {Number} maxPixelValue - the maximum stored pixel value in the image\n * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified\n * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified\n * @property {Number} windowCenter - the default windowCenter to apply to the image\n * @property {Number} windowWidth - the default windowWidth to apply to the image\n * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color\n * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images\n * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.\n * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats\n * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience\n * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience\n * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience\n * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience\n * @property {Boolean} color - true if pixel data is RGB, false if grayscale\n * @property {Object} lut - The Lookup Table\n * @property {Boolean} rgba - Is the color pixel data stored in RGBA?\n * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known\n * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or heigh of each pixel) in mm or undefined if not known\n * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1\n * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.\n * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping\n * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping\n * @property {ImageStats} [stats] - Statistics for the last redraw of the image\n * @property {Object} cachedLut - Cached Lookup Table for this image.\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * A Viewport Settings Object Cornerstone\n *\n * @typedef {Object} Viewport\n *\n * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x\n * @param {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.\n * @param {VOI} [voi] - an object with properties windowWidth and windowCenter.\n * @property {boolean} [invert=false] - Whether or not the image is inverted.\n * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.\n * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false\n * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false\n * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0\n * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none\n * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * An Enabled Element in Cornerstone\n *\n * @typedef {Object} EnabledElement\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement\n * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters\n * for each of the enabled element's layers\n * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean\n */\n\n/**\n * An Enabled Element Layer in Cornerstone\n *\n * @typedef {Object} EnabledElementLayer\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Object} [options] - Layer drawing options\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n */\n\n/**\n * An Image Load Object\n *\n * @typedef {Object} ImageLoadObject\n *\n * @property {Promise} promise - The Promise tracking the loading of this image\n * @property {Function|undefined} cancelFn - A function to cancel the image load request\n */\n\n/**\n * Retrieves a Cornerstone Enabled Element object\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n *\n * @returns {EnabledElement} A Cornerstone Enabled Element\n */\nexport function getEnabledElement (element) {\n if (element === undefined) {\n throw new Error('getEnabledElement: parameter element must not be undefined');\n }\n for (let i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n return enabledElements[i];\n }\n }\n\n throw new Error('element not enabled');\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object\n * @returns {void}\n */\nexport function addEnabledElement (enabledElement) {\n if (enabledElement === undefined) {\n throw new Error('getEnabledElement: enabledElement element must not be undefined');\n }\n\n enabledElements.push(enabledElement);\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {string} imageId A Cornerstone Image ID\n * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElementsByImageId (imageId) {\n const ees = [];\n\n enabledElements.forEach(function (enabledElement) {\n if (enabledElement.image && enabledElement.image.imageId === imageId) {\n ees.push(enabledElement);\n }\n });\n\n return ees;\n}\n\n/**\n * Retrieve all of the currently enabled Cornerstone elements\n *\n * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElements () {\n return enabledElements;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElements.js","/**\n * Use the performance.now() method if possible, and if not, use Date.now()\n *\n * @return {number} Time elapsed since the time origin\n */\nexport default function () {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/now.js","/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./triggerEvent.js","/**\n * This module contains a function that will set the canvas context to the pixel coordinates system\n * making it easy to draw geometry on the image\n */\n\nimport calculateTransform from './internal/calculateTransform.js';\n\n/**\n * Sets the canvas context transformation matrix to the pixel coordinate system. This allows\n * geometry to be driven using the canvas context using coordinates in the pixel coordinate system\n * @param {EnabledElement} enabledElement The\n * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas\n * @param {Number} [scale] Optional scale to apply\n * @returns {void}\n */\nexport default function (enabledElement, context, scale) {\n if (enabledElement === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');\n }\n if (context === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');\n }\n\n const transform = calculateTransform(enabledElement, scale);\n\n context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setToPixelCoordinateSystem.js","import { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the specified enabled element\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Boolean} [invalidated=false] Whether or not the image pixel data has been changed, necessitating a redraw\n *\n * @returns {void}\n */\nexport default function (element, invalidated = false) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined && !enabledElement.layers.length) {\n throw new Error('updateImage: image has not been loaded yet');\n }\n\n drawImage(enabledElement, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./updateImage.js","/**\n * Internal API function to draw an image to a given enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} [invalidated] - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated = false) {\n enabledElement.needsRedraw = true;\n if (invalidated) {\n enabledElement.invalid = true;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImage.js","/**\n * Creates a new viewport object containing default values for the image and canvas\n *\n * @param {HTMLElement} canvas A Canvas DOM element\n * @param {Image} image A Cornerstone Image Object\n * @returns {Viewport} viewport object\n */\nexport default function (canvas, image) {\n if (canvas === undefined) {\n throw new Error('getDefaultViewport: parameter canvas must not be undefined');\n }\n\n if (image === undefined) {\n return {\n scale: 1,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false\n };\n }\n\n // Fit image to window\n const verticalScale = canvas.height / image.rows;\n const horizontalScale = canvas.width / image.columns;\n const scale = Math.min(horizontalScale, verticalScale);\n\n return {\n scale,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: image.windowWidth,\n windowCenter: image.windowCenter\n },\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n voiLUT: image.voiLUT,\n colormap: image.colormap,\n labelmap: Boolean(image.labelmap)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getDefaultViewport.js","import { getColormap, getColormapsList } from './colormap.js';\nimport LookupTable from './lookupTable.js';\n\nexport default {\n getColormap,\n getColormapsList,\n LookupTable\n};\n\n\n\n// WEBPACK FOOTER //\n// ./colors/index.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport now from '../internal/now.js';\nimport generateColorLut from '../internal/generateColorLut.js';\nimport storedColorPixelDataToCanvasImageData from '../internal/storedColorPixelDataToCanvasImageData.js';\nimport storedRGBAPixelDataToCanvasImageData from '../internal/storedRGBAPixelDataToCanvasImageData.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport webGL from '../webgl/index.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getLut (image, viewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n image.cachedLut.invert === viewport.invert) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateColorLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n}\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing\n if (enabledElement.viewport.voi.windowWidth === 255 &&\n enabledElement.viewport.voi.windowCenter === 128 &&\n enabledElement.viewport.invert === false &&\n image.getCanvas &&\n image.getCanvas()\n ) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const colorLut = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n storedRGBAPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n } else {\n storedColorPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderColorImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderColorImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\nexport function addColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addColorLayer: image must be loaded before it can be drawn');\n }\n\n // All multi-layer images should include the alpha value\n image.rgba = true;\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderColorImage.js","import calculateTransform from './calculateTransform.js';\n\nexport default function (enabledElement) {\n // For now we will calculate it every time it is requested.\n // In the future, we may want to cache it in the enabled element to speed things up.\n return calculateTransform(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getTransform.js","export default function (enabledElement, image) {\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n const renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/initializeRenderCanvas.js","export default function (enabledElement) {\n const imageId = enabledElement.image.imageId;\n const viewport = enabledElement.viewport;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap\n };\n\n return enabledElement.renderingTools;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/saveLastRendered.js","export default function (enabledElement, image) {\n const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n const lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;\n\n return (\n image.imageId !== lastRenderedImageId ||\n !lastRenderedViewport ||\n lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter ||\n lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth ||\n lastRenderedViewport.invert !== enabledElement.viewport.invert ||\n lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||\n lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||\n lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||\n lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||\n lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||\n lastRenderedViewport.colormap !== enabledElement.viewport.colormap\n );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/doesImageNeedToBeRendered.js","import { render, initRenderer, getRenderCanvas, isWebGLAvailable, isWebGLInitialized } from './renderer.js';\nimport createProgramFromString from './createProgramFromString.js';\nimport textureCache from './textureCache.js';\n\nconst mod = {\n createProgramFromString,\n renderer: {\n render,\n initRenderer,\n getRenderCanvas,\n isWebGLAvailable\n },\n textureCache\n};\n\nObject.defineProperty(mod, 'isWebGLInitialized', {\n enumerable: true,\n configurable: false,\n get: () => isWebGLInitialized\n});\n\nexport default mod;\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/index.js","class EventTarget {\n constructor () {\n this.listeners = {};\n }\n\n addEventListener (type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n\n removeEventListener (type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n const stack = this.listeners[type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n\n dispatchEvent (event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n\n const stack = this.listeners[event.type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n}\n\n\nconst events = new EventTarget();\n\nexport default events;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import storedPixelDataToCanvasImageData from '../internal/storedPixelDataToCanvasImageData.js';\nimport storedPixelDataToCanvasImageDataRGBA from '../internal/storedPixelDataToCanvasImageDataRGBA.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport webGL from '../webgl/index.js';\nimport getLut from './getLut.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated, useAlphaChannel = true) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // Gray scale image - apply the lut and put the resulting image onto the render canvas\n if (useAlphaChannel) {\n storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);\n } else {\n storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderGrayscaleImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a grayscale image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.\n This does not work if this layer is not the first layer in the enabledElement.\n * @returns {void}\n */\nexport function addGrayscaleLayer (layer, invalidated, useAlphaChannel = false) {\n if (layer === undefined) {\n throw new Error('addGrayscaleLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderGrayscaleImage.js","import getModalityLUT from './getModalityLUT.js';\r\nimport getVOILUT from './getVOILut.js';\r\n\r\n/**\r\n * Creates a LUT used while rendering to convert stored pixel values to\r\n * display pixels\r\n *\r\n * @param {Image} image A Cornerstone Image Object\r\n * @param {Number} windowWidth The Window Width\r\n * @param {Number} windowCenter The Window Center\r\n * @param {Boolean} invert A boolean describing whether or not the image has been inverted\r\n * @param {Array} [modalityLUT] A modality Lookup Table\r\n * @param {Array} [voiLUT] A Volume of Interest Lookup Table\r\n *\r\n * @returns {Uint8ClampedArray} A lookup table to apply to the image\r\n */\r\nexport default function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {\r\n const maxPixelValue = image.maxPixelValue;\r\n const minPixelValue = image.minPixelValue;\r\n const offset = Math.min(minPixelValue, 0);\r\n\r\n if (image.cachedLut === undefined) {\r\n const length = maxPixelValue - offset + 1;\r\n\r\n image.cachedLut = {};\r\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\r\n }\r\n\r\n const lut = image.cachedLut.lutArray;\r\n const mlutfn = getModalityLUT(image.slope, image.intercept, modalityLUT);\r\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\r\n\r\n if (invert === true) {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = 255 - vlutfn(mlutfn(storedValue));\r\n }\r\n } else {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = vlutfn(mlutfn(storedValue));\r\n }\r\n }\r\n\r\n return lut;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/generateLut.js","function requestFrame (callback) {\n window.setTimeout(callback, 1000 / 60);\n}\n\n/**\n * Polyfills requestAnimationFrame for older browsers.\n *\n * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.\n *\n * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.\n */\nexport default function (callback) {\n return window.requestAnimationFrame(callback) ||\n window.webkitRequestAnimationFrame(callback) ||\n window.mozRequestAnimationFrame(callback) ||\n window.oRequestAnimationFrame(callback) ||\n window.msRequestAnimationFrame(callback) ||\n requestFrame(callback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/requestAnimationFrame.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageData.js","import now from './now.js';\n\n/**\n * Converts stored color pixel values to display pixel values using a LUT.\n *\n * Note: Skips alpha value for any input image pixel data.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + (-minPixelValue)]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedColorPixelDataToCanvasImageData.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataColorLUT (image, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataColorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataColorLUT.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT (image, grayscaleLut, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","import { Transform } from './transform.js';\n\n/**\n * Calculate the transform for a Cornerstone enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {Number} [scale] The viewport scale\n * @return {Transform} The current transform\n */\nexport default function (enabledElement, scale) {\n\n const transform = new Transform();\n\n transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2);\n\n // Apply the rotation before scaling for non square pixels\n const angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n // Apply the scale\n let widthScale = enabledElement.viewport.scale;\n let heightScale = enabledElement.viewport.scale;\n\n if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {\n widthScale *= (enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing);\n } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {\n heightScale *= (enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing);\n }\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate(-angle * Math.PI / 180);\n }\n\n // Apply the pan offset\n transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y);\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Translate the origin back to the corner of the image so the event handlers can draw in image coordinate system\n transform.translate(-enabledElement.image.width / 2, -enabledElement.image.height / 2);\n\n return transform;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/calculateTransform.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataColorLUT from '../internal/storedPixelDataToCanvasImageDataColorLUT.js';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderLabelMapImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataColorLUT(image, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a label map image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderLabelMapImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for label map pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addLabelMapLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addLabelMapLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderLabelMapImage.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport getLut from './getLut.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from '../internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataPseudocolorLUT(image, lut, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderPseudoColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addPseudoColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addPseudoColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderPseudoColorImage.js","import guid from './internal/guid.js';\nimport { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport triggerCustomEvent from './triggerEvent.js';\n\n/**\n * Helper function to trigger an event on a Cornerstone element with\n * a specific layerId\n *\n * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)\n * @param {EnabledElement} enabledElement The Cornerstone enabled element\n * @param {String} layerId The layer's unique identifier\n * @returns {void}\n */\nfunction triggerEvent (eventName, enabledElement, layerId) {\n const element = enabledElement.element;\n const eventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n enabledElement,\n layerId\n };\n\n triggerCustomEvent(element, eventName, eventData);\n}\n\n/**\n * Rescale the target layer to the base layer based on the\n * relative size of each image and their pixel dimensions.\n *\n * This function will update the Viewport parameters of the\n * target layer to a new scale.\n *\n * @param {EnabledElementLayer} baseLayer The base layer\n * @param {EnabledElementLayer} targetLayer The target layer to rescale\n * @returns {void}\n */\nexport function rescaleImage (baseLayer, targetLayer) {\n if (baseLayer.layerId === targetLayer.layerId) {\n throw new Error('rescaleImage: both arguments represent the same layer');\n }\n\n const baseImage = baseLayer.image;\n const targetImage = targetLayer.image;\n\n // Return if these images don't have an imageId (e.g. for dynamic images)\n if (!baseImage.imageId || !targetImage.imageId) {\n return;\n }\n\n // Column pixel spacing need to be considered when calculating the\n // ratio between the layer added and base layer images\n const colRelative = (targetImage.columnPixelSpacing * targetImage.width) /\n (baseImage.columnPixelSpacing * baseImage.width);\n const viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;\n\n targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;\n}\n\n/**\n * Add a layer to a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image object to add as a new layer\n * @param {Object} options Options for the layer\n *\n * @returns {String} layerId The new layer's unique identifier\n */\nexport function addLayer (element, image, options) {\n const layerId = guid();\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n let viewport;\n\n if (image) {\n viewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (options && options.viewport) {\n viewport = Object.assign(viewport, options.viewport);\n }\n }\n\n // Set syncViewports to true by default when a new layer is added\n if (enabledElement.syncViewports !== false) {\n enabledElement.syncViewports = true;\n }\n\n const newLayer = {\n image,\n layerId,\n viewport,\n options: options || {},\n renderingTools: {}\n };\n\n // Rescale the new layer based on the base layer to make sure\n // they will have a proportional size (pixel spacing)\n if (layers.length && image) {\n rescaleImage(layers[0], newLayer);\n }\n\n layers.push(newLayer);\n\n triggerEvent('cornerstonelayeradded', enabledElement, layerId);\n\n // Set the layer as active if it's the first layer added\n if (layers.length === 1 && image) {\n setActiveLayer(element, layerId);\n }\n\n return layerId;\n}\n\n/**\n * Remove a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function removeLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index !== -1) {\n layers.splice(index, 1);\n\n // If the current layer is active, and we have other layers,\n // switch to the first layer that remains in the array\n if (layerId === enabledElement.activeLayerId && layers.length) {\n setActiveLayer(element, layers[0].layerId);\n }\n\n triggerEvent('cornerstonelayerremoved', enabledElement, layerId);\n }\n}\n\n/**\n * Retrieve a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @return {EnabledElementLayer} The layer\n */\nexport function getLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === layerId);\n}\n\n/**\n * Retrieve all layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers;\n}\n\n/**\n * Retrieve all visible layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getVisibleLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.layers.filter((layer) => layer.options &&\n layer.options.visible !== false &&\n layer.options.opacity !== 0);\n}\n\n/**\n * Set the active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function setActiveLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n // Stop here if this layer is already active\n if (enabledElement.activeLayerId === layerId) {\n return;\n }\n\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index === -1) {\n throw new Error('setActiveLayer: layer not found in layers array');\n }\n\n const layer = enabledElement.layers[index];\n\n if (!layer.image) {\n throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');\n }\n\n enabledElement.activeLayerId = layerId;\n enabledElement.image = layer.image;\n enabledElement.viewport = layer.viewport;\n\n updateImage(element);\n triggerEvent('cornerstoneactivelayerchanged', enabledElement, layerId);\n}\n\n/**\n * Set a new image for a specific layerId\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image The image to be displayed in this layer\n * @param {String} [layerId] The unique identifier for the layer\n * @returns {void}\n */\nexport function setLayerImage (element, image, layerId) {\n const enabledElement = getEnabledElement(element);\n const baseLayer = enabledElement.layers[0];\n\n let layer;\n\n if (layerId) {\n layer = getLayer(element, layerId);\n } else {\n layer = getActiveLayer(element);\n }\n\n if (!layer) {\n throw new Error('setLayerImage: Layer not found');\n }\n\n layer.image = image;\n\n if (!image) {\n layer.viewport = undefined;\n\n return;\n }\n\n if (!layer.viewport) {\n const defaultViewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (layer.options && layer.options.viewport) {\n layer.viewport = Object.assign(defaultViewport, layer.options.viewport);\n }\n\n if (baseLayer.layerId !== layerId) {\n rescaleImage(baseLayer, layer);\n }\n }\n}\n\n/**\n * Retrieve the currently active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @return {EnabledElementLayer} The currently active layer\n */\nexport function getActiveLayer (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === enabledElement.activeLayerId);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./layers.js","/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n */\nfunction generateLinearModalityLUT (slope, intercept) {\n return (storedPixelValue) => storedPixelValue * slope + intercept;\n}\n\nfunction generateNonLinearModalityLUT (modalityLUT) {\n const minValue = modalityLUT.lut[0];\n const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return (storedPixelValue) => {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n */\nexport default function (slope, intercept, modalityLUT) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getModalityLUT.js","/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n */\n\n/**\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateLinearVOILUT (windowWidth, windowCenter) {\n return function (modalityLutValue) {\n return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateNonLinearVOILUT (voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;\n const shift = bitsPerEntry - 8;\n const minValue = voiLUT.lut[0] >> shift;\n const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n */\nexport default function (windowWidth, windowCenter, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getVOILut.js","import LookupTable from './lookupTable.js';\n\nconst COLOR_TRANSPARENT = [0, 0, 0, 0];\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palattes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nconst colormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [\n [0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255],\n [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255],\n [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255],\n [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255],\n [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255],\n [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255],\n [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255],\n [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255],\n [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255],\n [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255],\n [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255],\n [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255],\n [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255],\n [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255],\n [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255],\n [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255],\n [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255],\n [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255],\n [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255],\n [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255],\n [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255],\n [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255],\n [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255],\n [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255],\n [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255],\n [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255],\n [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255],\n [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255],\n [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255],\n [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255],\n [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255],\n [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255],\n [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255],\n [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255],\n [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255],\n [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255],\n [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255],\n [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255],\n [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255],\n [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255],\n [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255],\n [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255],\n [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255],\n [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255],\n [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255],\n [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255],\n [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255],\n [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255],\n [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255],\n [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255],\n [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255],\n [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255],\n [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255],\n [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255],\n [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255],\n [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255],\n [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255],\n [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255],\n [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255],\n [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255],\n [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255],\n [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255],\n [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255],\n [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255],\n [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255],\n [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255],\n [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255],\n [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255],\n [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255],\n [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255],\n [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255],\n [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255],\n [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255],\n [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255],\n [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255],\n [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255],\n [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255],\n [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255],\n [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255],\n [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255],\n [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255],\n [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255],\n [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255],\n [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255],\n [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255],\n [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255],\n [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255],\n [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255],\n [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255],\n [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255],\n [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255],\n [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255],\n [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255],\n [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255],\n [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255],\n [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255],\n [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255],\n [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255],\n [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255],\n [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255],\n [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255],\n [255, 255, 255, 255]\n ]\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255],\n [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255],\n [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255],\n [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255],\n [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255],\n [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255],\n [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255],\n [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255],\n [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255],\n [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255],\n [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255],\n [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255],\n [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255],\n [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255],\n [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255],\n [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255],\n [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255],\n [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255],\n [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255],\n [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255],\n [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255],\n [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255],\n [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255],\n [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255],\n [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255],\n [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255],\n [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255],\n [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255],\n [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255],\n [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255],\n [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255],\n [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255],\n [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255],\n [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255],\n [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255],\n [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255],\n [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255],\n [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255],\n [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255],\n [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255],\n [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255],\n [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255],\n [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255],\n [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255],\n [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255],\n [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255],\n [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255],\n [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255],\n [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255],\n [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255],\n [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255]\n ]\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 1, 1]]\n }\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],\n green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],\n blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]\n }\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750],\n [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0],\n [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750],\n [0.857143, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1],\n [0.507937, 1, 1], [0.666667, 0.062500, 0.062500],\n [0.682540, 0, 0], [1, 0, 0]],\n blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500],\n [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500],\n [1, 0.09375, 0.09375]]\n }\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],\n blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]\n }\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 1, 1], [1, 0, 0]],\n blue: [[0, 1, 1], [1, 1, 1]]\n }\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0, 0]]\n }\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0.5, 0.5], [1, 1, 1]],\n blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]\n }\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 0, 0]]\n }\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 0, 0]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0.5, 0.5]]\n }\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],\n blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]\n }\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 0.7812, 0.7812]],\n blue: [[0, 0, 0], [1, 0.4975, 0.4975]]\n }\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0],\n [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0],\n [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1],\n [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80],\n [1, 0.80, 0.80]],\n green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000],\n [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000],\n [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1],\n [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000],\n [0.80, 0.6000, 0.6000], [0.85, 0, 0],\n [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],\n blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667],\n [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667],\n [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0],\n [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0],\n [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]\n }\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388],\n [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478],\n [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608],\n [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204],\n [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162],\n [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281],\n [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949],\n [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556],\n [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179],\n [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518],\n [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803],\n [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177],\n [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866],\n [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617],\n [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542],\n [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934],\n [1, 0.705673158, 0.705673158]],\n green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838],\n [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618],\n [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092],\n [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772],\n [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107],\n [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712],\n [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879],\n [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984],\n [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047],\n [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443],\n [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809],\n [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156],\n [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968],\n [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467],\n [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446],\n [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067],\n [1, 0.01555616, 0.01555616]],\n blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763],\n [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899],\n [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588],\n [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814],\n [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203],\n [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227],\n [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269],\n [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838],\n [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546],\n [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146],\n [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763],\n [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762],\n [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684],\n [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596],\n [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199],\n [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123],\n [1, 0.150232812, 0.150232812]]\n }\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991],\n [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429],\n [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256],\n [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502],\n [1, 0.031372550874948502, 0.031372550874948502]],\n green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449],\n [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144],\n [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698],\n [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169],\n [1, 0.18823529779911041, 0.18823529779911041]],\n blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359],\n [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171],\n [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162],\n [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]\n }\n }\n};\n\n// Generate linearly spaced vectors\n// http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\nfunction linspace (a, b, n) {\n n = n === null ? 100 : n;\n\n const increment = (b - a) / (n - 1);\n const vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n// Return the number of elements smaller than \"elem\" (binary search)\nfunction getRank (array, elem) {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = left + Math.floor((right - left) / 2);\n const midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n// Find the indices into a sorted array a such that, if the corresponding elements\n// In v were inserted before the indices, the order of a would be preserved.\n// http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\nfunction searchSorted (inputArray, values) {\n let i;\n const indexes = [];\n const len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n// Create an *N* -element 1-d lookup table\n//\n// *Data* represented by a list of x,y0,y1 mapping correspondences. Each element in this\n// List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n// A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n// Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n// The value of y for values of x <= to that given, and y1 is the value to be used for x >\n// Than that given). The list must start with x=0, end with x=1, and all values of x must be\n// In increasing order. Values between the given mapping points are determined by simple linear\n// Interpolation.\n//\n// The function returns an array \"result\" where result[x*(N-1)] gives the closest value for\n// Values of x between 0 and 1.\nfunction makeMappingArray (N, data, gamma) {\n let i;\n const x = [];\n const y0 = [];\n const y1 = [];\n const lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n const element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n const xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n const xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n const index = xLinSpaceIndexes[i];\n const colorPercent = ((xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]));\n const colorDelta = (y0[index] - y1[index - 1]);\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n// Colormap based on lookup tables using linear segments.\n//\n// The lookup table is generated using linear interpolation for each\n// Primary color, with the 0-1 domain divided into any number of\n// Segments.\n//\n// https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\nfunction createLinearSegmentedColormap (segmentedData, N, gamma) {\n let i;\n const lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n const redLut = makeMappingArray(N, segmentedData.red, gamma);\n const greenLut = makeMappingArray(N, segmentedData.green, gamma);\n const blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n const red = Math.round(redLut[i] * 255);\n const green = Math.round(greenLut[i] * 255);\n const blue = Math.round(blueLut[i] * 255);\n const rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/*\n* Return all colormaps (id and name) available\n*/\nexport function getColormapsList () {\n const colormaps = [];\n const keys = Object.keys(colormapsData);\n\n keys.forEach(function (key) {\n if (colormapsData.hasOwnProperty(key)) {\n const colormap = colormapsData[key];\n\n colormaps.push({\n id: key,\n name: colormap.name\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n *\n * @returns {*} The Colormap Object\n */\nexport function getColormap (id, colormapData) {\n let colormap = colormapsData[id];\n\n if (!colormap) {\n colormap = colormapsData[id] = colormapData || {\n name: '',\n colors: []\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);\n }\n\n return {\n getId () {\n return id;\n },\n\n getColorSchemeName () {\n return colormap.name;\n },\n\n setColorSchemeName (name) {\n colormap.name = name;\n },\n\n getNumberOfColors () {\n return colormap.colors.length;\n },\n\n setNumberOfColors (numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n\n getColor (index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n\n getColorRepeating (index) {\n const numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n\n setColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n\n addColor (rgba) {\n colormap.colors.push(rgba);\n },\n\n insertColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n\n removeColor (index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n\n clearColors () {\n colormap.colors = [];\n },\n\n buildLookupTable (lut) {\n if (!lut) {\n return;\n }\n\n const numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (let i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n\n createLookupTable () {\n const lut = new LookupTable();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n\n isValidIndex (index) {\n return (index >= 0) && (index < colormap.colors.length);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./colors/colormap.js","// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nconst BELOW_RANGE_COLOR_INDEX = 0;\nconst ABOVE_RANGE_COLOR_INDEX = 1;\nconst NAN_COLOR_INDEX = 2;\n\nfunction HSVToRGB (hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n const rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n const hueCase = Math.floor(hue * 6);\n const frac = 6 * hue - hueCase;\n const lx = val * (1 - sat);\n const ly = val * (1 - sat * frac);\n const lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\nclass LookupTable {\n constructor () {\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n setNumberOfTableValues (number) {\n this.NumberOfColors = number;\n }\n\n setRamp (ramp) {\n this.Ramp = ramp;\n }\n\n setTableRange (start, end) {\n // Set/Get the minimum/maximum scalar values for scalar mapping.\n // Scalar values less than minimum range value are clamped to minimum range value.\n // Scalar values greater than maximum range value are clamped to maximum range value.\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n\n setHueRange (start, end) {\n // Set the range in hue (using automatic generation). Hue ranges between [0,1].\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n\n setSaturationRange (start, end) {\n // Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n\n setValueRange (start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n\n setRange (start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n\n setAlphaRange (start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n\n getColor (scalar) {\n // Map one value through the lookup table and return the color as an\n // RGB array of doubles between 0 and 1.\n return this.mapValue(scalar);\n }\n\n build (force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n const maxIndex = this.NumberOfColors - 1;\n\n let hinc, sinc, vinc, ainc;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (let i = 0; i <= maxIndex; i++) {\n const hue = this.HueRange[0] + i * hinc;\n const sat = this.SaturationRange[0] + i * sinc;\n const val = this.ValueRange[0] + i * vinc;\n const alpha = this.AlphaRange[0] + i * ainc;\n\n const rgb = HSVToRGB(hue, sat, val);\n const c_rgba = [];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));\n c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));\n c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error(`Invalid Ramp value (${this.Ramp})`);\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n\n buildSpecialColors () {\n const numberOfColors = this.NumberOfColors;\n const belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n const aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n const nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n // Given a scalar value v, return an rgba color value from lookup table.\n mapValue (v) {\n const index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n\n getIndex (v) {\n const p = {};\n\n p.Range = [];\n p.MaxIndex = this.NumberOfColors - 1;\n\n // This was LookupShiftAndScale\n p.Shift = -this.TableRange[0];\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n let index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n\n setTableValue (index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error(`Can't set the table value for negative index (${index})`);\n }\n\n if (index >= this.NumberOfColors) {\n new Error(`Index ${index} is greater than the number of colors ${this.NumberOfColors}`);\n }\n\n this.Table[index] = rgba;\n\n if ((index === 0) || (index === this.NumberOfColors - 1)) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n}\n\nexport default LookupTable;\n\n\n\n// WEBPACK FOOTER //\n// ./colors/lookupTable.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let pixelValue;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataRGBA.js","// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nexport class Transform {\n constructor () {\n this.reset();\n }\n\n reset () {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n\n clone () {\n const transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n\n multiply (matrix) {\n const m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n const m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n const m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n const m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n const dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n const dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n\n invert () {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n\n rotate (rad) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n\n translate (x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n\n scale (sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n\n transformPoint (px, py) {\n const x = px;\n const y = py;\n\n px = x * this.m[0] + y * this.m[2] + this.m[4];\n py = x * this.m[1] + y * this.m[3] + this.m[5];\n\n return {\n x: px,\n y: py\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/transform.js","import lutMatches from './lutMatches.js';\nimport generateLut from '../internal/generateLut.js';\n\nexport default function (image, viewport, invalidated) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&\n lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&\n image.cachedLut.invert === viewport.invert &&\n invalidated !== true) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/getLut.js","import events from '../events.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * This module deals with caching image textures in VRAM for WebGL\r\n */\r\n\r\nconst imageCache = {};\r\n\r\nconst cachedImages = [];\r\n\r\nlet maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB\r\nlet cacheSizeInBytes = 0;\r\n\r\nfunction getCacheInfo () {\r\n return {\r\n maximumSizeInBytes,\r\n cacheSizeInBytes,\r\n numberOfImagesCached: cachedImages.length\r\n };\r\n}\r\n\r\nfunction purgeCacheIfNecessary () {\r\n // If max cache size has not been exceeded, do nothing\r\n if (cacheSizeInBytes <= maximumSizeInBytes) {\r\n return;\r\n }\r\n\r\n // Cache size has been exceeded, create list of images sorted by timeStamp\r\n // So we can purge the least recently used image\r\n function compare (a, b) {\r\n if (a.timeStamp > b.timeStamp) {\r\n return -1;\r\n }\r\n if (a.timeStamp < b.timeStamp) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n cachedImages.sort(compare);\r\n\r\n // Remove images as necessary\r\n while (cacheSizeInBytes > maximumSizeInBytes) {\r\n const lastCachedImage = cachedImages[cachedImages.length - 1];\r\n\r\n cacheSizeInBytes -= lastCachedImage.sizeInBytes;\r\n delete imageCache[lastCachedImage.imageId];\r\n cachedImages.pop();\r\n\r\n triggerEvent(events, 'cornerstonewebgltextureremoved', { imageId: lastCachedImage.imageId });\r\n }\r\n\r\n const cacheInfo = getCacheInfo();\r\n\r\n triggerEvent(events, 'cornerstonewebgltexturecachefull', cacheInfo);\r\n}\r\n\r\nfunction setMaximumSizeBytes (numBytes) {\r\n if (numBytes === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\r\n }\r\n if (numBytes.toFixed === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\r\n }\r\n\r\n maximumSizeInBytes = numBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction putImageTexture (image, imageTexture) {\r\n const imageId = image.imageId;\r\n\r\n if (image === undefined) {\r\n throw new Error('putImageTexture: image must not be undefined');\r\n }\r\n\r\n if (imageId === undefined) {\r\n throw new Error('putImageTexture: imageId must not be undefined');\r\n }\r\n\r\n if (imageTexture === undefined) {\r\n throw new Error('putImageTexture: imageTexture must not be undefined');\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {\r\n throw new Error('putImageTexture: imageId already in cache');\r\n }\r\n\r\n const cachedImage = {\r\n imageId,\r\n imageTexture,\r\n timeStamp: new Date(),\r\n sizeInBytes: imageTexture.sizeInBytes\r\n };\r\n\r\n imageCache[imageId] = cachedImage;\r\n cachedImages.push(cachedImage);\r\n\r\n if (imageTexture.sizeInBytes === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');\r\n }\r\n if (imageTexture.sizeInBytes.toFixed === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');\r\n }\r\n cacheSizeInBytes += cachedImage.sizeInBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction getImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('getImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n return;\r\n }\r\n\r\n // Bump time stamp for cached image\r\n cachedImage.timeStamp = new Date();\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction removeImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\r\n cacheSizeInBytes -= cachedImage.sizeInBytes;\r\n delete imageCache[imageId];\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction purgeCache () {\r\n while (cachedImages.length > 0) {\r\n const removedCachedImage = cachedImages.pop();\r\n\r\n delete imageCache[removedCachedImage.imageId];\r\n }\r\n cacheSizeInBytes = 0;\r\n}\r\n\r\nexport default {\r\n purgeCache,\r\n getImageTexture,\r\n putImageTexture,\r\n removeImageTexture,\r\n setMaximumSizeBytes\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/textureCache.js","/**\n * Creates and compiles a shader.\n *\n * @param {!WebGLRenderingContext} gl The WebGL Context.\n * @param {string} shaderSource The GLSL source code for the shader.\n * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.\n *\n * @return {!WebGLShader} The shader.\n */\nfunction compileShader (gl, shaderSource, shaderType) {\n\n // Create the shader object\n const shader = gl.createShader(shaderType);\n\n // Set the shader source code.\n gl.shaderSource(shader, shaderSource);\n\n // Compile the shader\n gl.compileShader(shader);\n\n // Check if it compiled\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong during compilation; get the error\n const infoLog = gl.getShaderInfoLog(shader);\n\n console.error(`Could not compile shader:\\n${infoLog}`);\n }\n\n return shader;\n}\n\n/**\n * Creates a program from 2 shaders.\n *\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShader A vertex shader.\n * @param {!WebGLShader} fragmentShader A fragment shader.\n * @return {!WebGLProgram} A program.\n */\nfunction createProgram (gl, vertexShader, fragmentShader) {\n\n // Create a program.\n const program = gl.createProgram();\n\n // Attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n // Link the program.\n gl.linkProgram(program);\n\n // Check if it linked.\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong with the link\n const infoLog = gl.getProgramInfoLog(program);\n\n console.error(`WebGL program filed to link:\\n${infoLog}`);\n }\n\n return program;\n}\n\n/**\n * Creates a program from 2 shaders source (Strings)\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShaderSrc Vertex shader string\n * @param {!WebGLShader} fragShaderSrc Fragment shader string\n * @return {!WebGLProgram} A program\n */\nexport default function (gl, vertexShaderSrc, fragShaderSrc) {\n const vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);\n const fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);\n\n\n return createProgram(gl, vertexShader, fragShader);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/createProgramFromString.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport { renderColorImage } from './renderColorImage.js';\n\n/**\n * API function to draw a standard web image (PNG, JPG) to an enabledImage\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderWebImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderWebImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderWebImage: image must be loaded before it can be drawn');\n }\n\n // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image\n // Directly. If any of those are changed, we call renderColorImage() to apply the lut\n if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth &&\n enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter &&\n enabledElement.viewport.invert === false) {\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n context.drawImage(image.getImage(), 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n } else {\n renderColorImage(enabledElement, invalidated);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderWebImage.js","import { getEnabledElement } from './enabledElements.js';\r\nimport fitToWindow from './fitToWindow.js';\r\nimport updateImage from './updateImage.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nfunction setCanvasSize (element, canvas) {\r\n // The device pixel ratio is 1.0 for normal displays and > 1.0\r\n // For high DPI displays like Retina\r\n /*\r\n\r\n This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas\r\n is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to\r\n a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel\r\n produces incorrect results. I couldn't find any way to determine when the DPI changed other than\r\n by polling which is not very clean. If anyone has any ideas here, please let me know, but for now\r\n we will disable this functionality. We may want\r\n to add a mechanism to optionally enable this functionality if we can determine it is safe to do\r\n so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing\r\n to be cautious here since I would rather not have bug reports or safety issues related to this\r\n scenario.\r\n\r\n var devicePixelRatio = window.devicePixelRatio;\r\n if(devicePixelRatio === undefined) {\r\n devicePixelRatio = 1.0;\r\n }\r\n */\r\n\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.width !== element.clientWidth) {\r\n canvas.width = element.clientWidth;\r\n canvas.style.width = `${element.clientWidth}px`;\r\n }\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.height !== element.clientHeight) {\r\n canvas.height = element.clientHeight;\r\n canvas.style.height = `${element.clientHeight}px`;\r\n }\r\n}\r\n\r\n/**\r\n * Resizes an enabled element and optionally fits the image to window\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {Boolean} fitViewportToWindow true to refit, false to leave viewport parameters as they are\r\n * @returns {void}\r\n */\r\nexport default function (element, fitViewportToWindow) {\r\n\r\n const enabledElement = getEnabledElement(element);\r\n\r\n setCanvasSize(element, enabledElement.canvas);\r\n\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'cornerstoneelementresized', eventData);\r\n\r\n if (enabledElement.image === undefined) {\r\n return;\r\n }\r\n\r\n if (fitViewportToWindow === true) {\r\n fitToWindow(element);\r\n } else {\r\n updateImage(element);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./resize.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @return {{width, height}} The Image dimensions\n */\nfunction getImageSize (enabledElement) {\n if (enabledElement.viewport.rotation === 0 || enabledElement.viewport.rotation === 180) {\n return {\n width: enabledElement.image.width,\n height: enabledElement.image.height\n };\n }\n\n return {\n width: enabledElement.image.height,\n height: enabledElement.image.width\n };\n\n}\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param {HTMLElement} element The Cornerstone element to update\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const imageSize = getImageSize(enabledElement);\n\n const verticalScale = enabledElement.canvas.height / imageSize.height;\n const horizontalScale = enabledElement.canvas.width / imageSize.width;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = Math.min(horizontalScale, verticalScale);\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./fitToWindow.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves an array of stored pixel values from a rectangular region of an image\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The stored pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n if (element === undefined) {\n throw new Error('getStoredPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = getEnabledElement(element);\n const storedPixels = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < width; column++) {\n const spIndex = ((row + y) * enabledElement.image.columns) + (column + x);\n\n storedPixels[index++] = pixelData[spIndex];\n }\n }\n\n return storedPixels;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getStoredPixels.js","import events from './events.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * This module deals with caching images\n */\nlet maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB\nlet cacheSizeInBytes = 0;\n\n// Dictionary of imageId to cachedImage objects\nconst imageCacheDict = {};\n\n// Array of cachedImage objects\nexport const cachedImages = [];\n\nexport function setMaximumSizeBytes (numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n\n triggerEvent(events, 'cornerstoneimagecachemaximumsizechanged');\n\n purgeCacheIfNecessary();\n}\n\nfunction purgeCacheIfNecessary () {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare (a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary)\n while (cacheSizeInBytes > maximumSizeInBytes) {\n const lastCachedImage = cachedImages[cachedImages.length - 1];\n const imageId = lastCachedImage.imageId;\n\n removeImageLoadObject(imageId);\n\n triggerEvent(events, 'cornerstoneimagecachepromiseremoved', { imageId });\n }\n\n const cacheInfo = getCacheInfo();\n\n triggerEvent(events, 'cornerstoneimagecachefull', cacheInfo);\n}\n\nexport function putImageLoadObject (imageId, imageLoadObject) {\n if (imageId === undefined) {\n throw new Error('putImageLoadObject: imageId must not be undefined');\n }\n if (imageLoadObject.promise === undefined) {\n throw new Error('putImageLoadObject: imageLoadObject.promise must not be undefined');\n }\n if (imageCacheDict.hasOwnProperty(imageId) === true) {\n throw new Error('putImageLoadObject: imageId already in cache');\n }\n if (imageLoadObject.cancelFn && typeof imageLoadObject.cancelFn !== 'function') {\n throw new Error('putImageLoadObject: imageLoadObject.cancelFn must be a function');\n }\n\n const cachedImage = {\n loaded: false,\n imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imageLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0\n };\n\n imageCacheDict[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n imageLoadObject.promise.then(function (image) {\n if (cachedImages.indexOf(cachedImage) === -1) {\n // If the image has been purged before being loaded, we stop here.\n return;\n }\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n\n if (image.sizeInBytes === undefined) {\n throw new Error('putImageLoadObject: image.sizeInBytes must not be undefined');\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error('putImageLoadObject: image.sizeInBytes is not a number');\n }\n\n cachedImage.sizeInBytes = image.sizeInBytes;\n cacheSizeInBytes += cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'addImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'cornerstoneimagecachechanged', eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n\n purgeCacheIfNecessary();\n }, () => {\n const cachedImage = imageCacheDict[imageId];\n\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n delete imageCacheDict[imageId];\n });\n}\n\nexport function getImageLoadObject (imageId) {\n if (imageId === undefined) {\n throw new Error('getImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imageLoadObject;\n}\n\nexport function removeImageLoadObject (imageId) {\n if (imageId === undefined) {\n throw new Error('removeImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImageLoadObject: imageId was not present in imageCache');\n }\n\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'deleteImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'cornerstoneimagecachechanged', eventDetails);\n decache(cachedImage.imageLoadObject.promise);\n\n delete imageCacheDict[imageId];\n}\n\nexport function getCacheInfo () {\n return {\n maximumSizeInBytes,\n cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\n// This method should only be called by `removeImageLoadObject` because it's\n// The one that knows how to deal with shared cache keys and cache size.\nfunction decache (imagePromise) {\n imagePromise.then(function (image) {\n if (image.decache) {\n image.decache();\n }\n });\n}\n\nexport function purgeCache () {\n while (cachedImages.length > 0) {\n const removedCachedImage = cachedImages[0];\n\n removeImageLoadObject(removedCachedImage.imageId);\n }\n}\n\nexport function changeImageIdCacheSize (imageId, newCacheSize) {\n const cacheEntry = imageCacheDict[imageId];\n\n if (cacheEntry) {\n cacheEntry.imageLoadObject.promise.then(function (image) {\n const cacheSizeDifference = newCacheSize - image.sizeInBytes;\n\n image.sizeInBytes = newCacheSize;\n cacheEntry.sizeInBytes = newCacheSize;\n cacheSizeInBytes += cacheSizeDifference;\n\n const eventDetails = {\n action: 'changeImageSize',\n image\n };\n\n triggerEvent(events, 'cornerstoneimagecachechanged', eventDetails);\n });\n }\n}\n\nexport default {\n imageCache: imageCacheDict,\n cachedImages,\n setMaximumSizeBytes,\n putImageLoadObject,\n getImageLoadObject,\n removeImageLoadObject,\n getCacheInfo,\n purgeCache,\n changeImageIdCacheSize\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageCache.js","import colors from './colors/index.js';\n\n/**\n * Converts the image pixel data into a false color data\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Object} lookupTable A lookup table Object\n *\n * @returns {void}\n */\nexport default function (image, lookupTable) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = image.width * image.height;\n const origPixelData = image.origPixelData || image.getPixelData();\n const storedColorPixelData = new Uint8Array(numPixels * 4);\n let sp;\n let mapped;\n\n image.color = true;\n image.falseColor = true;\n image.origPixelData = origPixelData;\n\n if (lookupTable instanceof colors.LookupTable) {\n lookupTable.build();\n\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n mapped = lookupTable.mapValue(sp);\n storedColorPixelData[canvasImageDataIndex++] = mapped[0];\n storedColorPixelData[canvasImageDataIndex++] = mapped[1];\n storedColorPixelData[canvasImageDataIndex++] = mapped[2];\n storedColorPixelData[canvasImageDataIndex++] = mapped[3];\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][3]; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha\n }\n }\n\n image.rgba = true;\n image.cachedLut = undefined;\n image.render = undefined;\n image.slope = 1;\n image.intercept = 0;\n image.minPixelValue = 0;\n image.maxPixelValue = 255;\n image.windowWidth = 255;\n image.windowCenter = 128;\n image.getPixelData = () => storedColorPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelDataToFalseColorData.js","// Internal (some of these are from old internal/legacy expose)\nexport { default as drawImage } from './internal/drawImage.js';\nexport { default as generateLut } from './internal/generateLut.js';\nexport { default as getDefaultViewport } from './internal/getDefaultViewport.js';\nexport { default as requestAnimationFrame } from './internal/requestAnimationFrame.js';\nexport { default as storedPixelDataToCanvasImageData } from './internal/storedPixelDataToCanvasImageData.js';\nexport { default as storedColorPixelDataToCanvasImageData } from './internal/storedColorPixelDataToCanvasImageData.js';\nexport { default as storedPixelDataToCanvasImageDataColorLUT } from './internal/storedPixelDataToCanvasImageDataColorLUT.js';\nexport { default as storedPixelDataToCanvasImageDataPseudocolorLUT } from './internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js';\n\nexport { default as internal } from './internal/index.js';\n\n// Rendering\nexport { renderLabelMapImage } from './rendering/renderLabelMapImage.js';\nexport { renderPseudoColorImage } from './rendering/renderPseudoColorImage.js';\nexport { renderColorImage } from './rendering/renderColorImage.js';\nexport { renderGrayscaleImage } from './rendering/renderGrayscaleImage.js';\nexport { renderWebImage } from './rendering/renderWebImage.js';\n\nexport { default as canvasToPixel } from './canvasToPixel.js';\nexport { default as disable } from './disable.js';\nexport { default as displayImage } from './displayImage.js';\nexport { default as draw } from './draw.js';\nexport { default as drawInvalidated } from './drawInvalidated.js';\nexport { default as enable } from './enable.js';\nexport { getElementData, removeElementData } from './enabledElementData.js';\nexport {\n getEnabledElement,\n addEnabledElement,\n getEnabledElementsByImageId,\n getEnabledElements\n} from './enabledElements.js';\n\nexport {\n addLayer,\n removeLayer,\n getLayer,\n getLayers,\n getVisibleLayers,\n setActiveLayer,\n getActiveLayer,\n setLayerImage\n} from './layers.js';\n\nexport { default as fitToWindow } from './fitToWindow.js';\nexport { default as getDefaultViewportForImage } from './getDefaultViewportForImage.js';\nexport { default as getImage } from './getImage.js';\nexport { default as getPixels } from './getPixels.js';\nexport { default as getStoredPixels } from './getStoredPixels.js';\nexport { default as getViewport } from './getViewport.js';\nexport {\n loadImage,\n loadAndCacheImage,\n registerImageLoader,\n registerUnknownImageLoader\n} from './imageLoader.js';\n\nexport { default as invalidate } from './invalidate.js';\nexport { default as invalidateImageId } from './invalidateImageId.js';\nexport { default as pageToPixel } from './pageToPixel.js';\nexport { default as pixelToCanvas } from './pixelToCanvas.js';\nexport { default as reset } from './reset.js';\nexport { default as resize } from './resize.js';\nexport { default as setToPixelCoordinateSystem } from './setToPixelCoordinateSystem.js';\nexport { default as setViewport } from './setViewport.js';\nexport { default as updateImage } from './updateImage.js';\nexport { default as pixelDataToFalseColorData } from './pixelDataToFalseColorData.js';\n\nexport { default as rendering } from './rendering/index.js';\nexport { default as imageCache } from './imageCache.js';\nexport { default as metaData } from './metaData.js';\nexport { default as webGL } from './webgl/index.js';\nexport { default as colors } from './colors/index.js';\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage } from './falseColorMapping.js';\n\nexport { default as events } from './events.js';\nexport { default as triggerEvent } from './triggerEvent.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import drawImage from './drawImage.js';\r\nimport generateLut from './generateLut.js';\r\nimport getDefaultViewport from './getDefaultViewport.js';\r\nimport requestAnimationFrame from './requestAnimationFrame.js';\r\nimport storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA.js';\r\nimport storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataColorLUT from './storedPixelDataToCanvasImageDataColorLUT.js';\r\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from './storedPixelDataToCanvasImageDataPseudocolorLUT.js';\r\nimport getTransform from './getTransform.js';\r\nimport calculateTransform from './calculateTransform.js';\r\nimport { Transform } from './transform.js';\r\n\r\nexport default {\r\n drawImage,\r\n generateLut,\r\n getDefaultViewport,\r\n requestAnimationFrame,\r\n storedPixelDataToCanvasImageData,\r\n storedPixelDataToCanvasImageDataRGBA,\r\n storedPixelDataToCanvasImageDataColorLUT,\r\n storedPixelDataToCanvasImageDataPseudocolorLUT,\r\n storedColorPixelDataToCanvasImageData,\r\n getTransform,\r\n calculateTransform,\r\n Transform\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/index.js","/**\n * Check if two lookup tables match\n *\n * @param {LUT} a A lookup table function\n * @param {LUT} b Another lookup table function\n * @return {boolean} Whether or not they match\n */\nexport default function (a, b) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return (a.id === b.id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/lutMatches.js","import getVOILUT from './getVOILut.js';\n\n/**\n * Creates a LUT used while rendering to convert stored pixel values to\n * display pixels\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Number} windowWidth The Window Width\n * @param {Number} windowCenter The Window Center\n * @param {Boolean} invert A boolean describing whether or not the image has been inverted\n * @param {Array} [voiLUT] A Volume of Interest Lookup Table\n *\n * @returns {Uint8ClampedArray} A lookup table to apply to the image\n */\nexport default function (image, windowWidth, windowCenter, invert, voiLUT) {\n const maxPixelValue = image.maxPixelValue;\n const minPixelValue = image.minPixelValue;\n const offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n const length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n const lut = image.cachedLut.lutArray;\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\n\n if (invert === true) {\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + (-offset)] = 255 - vlutfn(storedValue);\n }\n } else {\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + (-offset)] = vlutfn(storedValue);\n }\n }\n\n return lut;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/generateColorLut.js","import now from './now.js';\n\n/**\n * Converts stored RGBA color pixel values to display pixel values using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedRGBAPixelDataToCanvasImageData.js","/* eslint no-bitwise: 0 */\n\nimport { shaders, dataUtilities } from './shaders/index.js';\nimport { vertexShader } from './vertexShader.js';\nimport textureCache from './textureCache.js';\nimport createProgramFromString from './createProgramFromString.js';\n\nconst renderCanvas = document.createElement('canvas');\nlet gl;\nlet texCoordBuffer;\nlet positionBuffer;\nlet isWebGLInitialized = false;\n\nexport { isWebGLInitialized };\n\nexport function getRenderCanvas () {\n return renderCanvas;\n}\n\nfunction initShaders () {\n for (const id in shaders) {\n // Console.log(\"WEBGL: Loading shader\", id);\n const shader = shaders[id];\n\n shader.attributes = {};\n shader.uniforms = {};\n shader.vert = vertexShader;\n\n shader.program = createProgramFromString(gl, shader.vert, shader.frag);\n\n shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');\n gl.enableVertexAttribArray(shader.attributes.texCoordLocation);\n\n shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');\n gl.enableVertexAttribArray(shader.attributes.positionLocation);\n\n shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');\n }\n}\n\nexport function initRenderer () {\n if (isWebGLInitialized === true) {\n // Console.log(\"WEBGL Renderer already initialized\");\n return;\n }\n\n if (initWebGL(renderCanvas)) {\n initBuffers();\n initShaders();\n // Console.log(\"WEBGL Renderer initialized!\");\n isWebGLInitialized = true;\n }\n}\n\nfunction updateRectangle (gl, width, height) {\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n width, height,\n 0, height,\n width, 0,\n 0, 0]), gl.STATIC_DRAW);\n}\n\nfunction handleLostContext (event) {\n event.preventDefault();\n console.warn('WebGL Context Lost!');\n}\n\nfunction handleRestoredContext (event) {\n event.preventDefault();\n isWebGLInitialized = false;\n textureCache.purgeCache();\n initRenderer();\n // Console.log('WebGL Context Restored.');\n}\n\nfunction initWebGL (canvas) {\n\n gl = null;\n try {\n // Try to grab the standard context. If it fails, fallback to experimental.\n const options = {\n preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element\n };\n\n // ---------------- Testing purposes -------------\n // If (debug === true && WebGLDebugUtils) {\n // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);\n // }\n // ---------------- Testing purposes -------------\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n // Set up event listeners for context lost / context restored\n canvas.removeEventListener('webglcontextlost', handleLostContext, false);\n canvas.addEventListener('webglcontextlost', handleLostContext, false);\n\n canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);\n canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);\n\n } catch (error) {\n throw new Error('Error creating WebGL context');\n }\n\n // If we don't have a GL context, give up now\n if (!gl) {\n console.error('Unable to initialize WebGL. Your browser may not support it.');\n gl = null;\n }\n\n return gl;\n}\n\nfunction getImageDataType (image) {\n if (image.color) {\n return 'rgb';\n }\n\n let datatype = 'int';\n\n if (image.minPixelValue >= 0) {\n datatype = `u${datatype}`;\n }\n\n if (image.maxPixelValue > 255) {\n datatype += '16';\n } else {\n datatype += '8';\n }\n\n return datatype;\n}\n\nfunction getShaderProgram (image) {\n\n const datatype = getImageDataType(image);\n // We need a mechanism for\n // Choosing the shader based on the image datatype\n // Console.log(\"Datatype: \" + datatype);\n\n if (shaders.hasOwnProperty(datatype)) {\n return shaders[datatype];\n }\n\n return shaders.rgb;\n}\n\nfunction generateTexture (image) {\n const TEXTURE_FORMAT = {\n uint8: gl.LUMINANCE,\n int8: gl.LUMINANCE_ALPHA,\n uint16: gl.LUMINANCE_ALPHA,\n int16: gl.RGB,\n rgb: gl.RGB\n };\n\n const TEXTURE_BYTES = {\n int8: 1, // Luminance\n uint16: 2, // Luminance + Alpha\n int16: 3, // RGB\n rgb: 3 // RGB\n };\n\n const imageDataType = getImageDataType(image);\n const format = TEXTURE_FORMAT[imageDataType];\n\n // GL texture configuration\n const texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n const imageData = dataUtilities[imageDataType].storedPixelDataToImageData(image, image.width, image.height);\n\n gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData);\n\n // Calculate the size in bytes of this image in memory\n const sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];\n\n return {\n texture,\n sizeInBytes\n };\n}\n\nfunction getImageTexture (image) {\n let imageTexture = textureCache.getImageTexture(image.imageId);\n\n if (!imageTexture) {\n // Console.log(\"Generating texture for imageid: \", image.imageId);\n imageTexture = generateTexture(image);\n textureCache.putImageTexture(image, imageTexture);\n }\n\n return imageTexture.texture;\n}\n\nfunction initBuffers () {\n positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1, 1,\n 0, 1,\n 1, 0,\n 0, 0\n ]), gl.STATIC_DRAW);\n\n\n texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1.0, 1.0,\n 0.0, 1.0,\n 1.0, 0.0,\n 0.0, 0.0\n ]), gl.STATIC_DRAW);\n}\n\nfunction renderQuad (shader, parameters, texture, width, height) {\n gl.clearColor(1.0, 0.0, 0.0, 1.0);\n gl.viewport(0, 0, width, height);\n\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(shader.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n for (const key in parameters) {\n const uniformLocation = gl.getUniformLocation(shader.program, key);\n\n if (!uniformLocation) {\n continue;\n\n // Disabling this error for now since RGB requires minPixelValue\n // but the other shaders do not.\n // throw `Could not access location for uniform: ${key}`;\n }\n\n const uniform = parameters[key];\n\n const type = uniform.type;\n const value = uniform.value;\n\n if (type === 'i') {\n gl.uniform1i(uniformLocation, value);\n } else if (type === 'f') {\n gl.uniform1f(uniformLocation, value);\n } else if (type === '2f') {\n gl.uniform2f(uniformLocation, value[0], value[1]);\n }\n }\n\n updateRectangle(gl, width, height);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n}\n\nexport function render (enabledElement) {\n // Resize the canvas\n const image = enabledElement.image;\n\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const viewport = enabledElement.viewport;\n\n // Render the current image\n const shader = getShaderProgram(image);\n const texture = getImageTexture(image);\n const parameters = {\n u_resolution: { type: '2f',\n value: [image.width, image.height] },\n wc: { type: 'f',\n value: viewport.voi.windowCenter },\n ww: { type: 'f',\n value: viewport.voi.windowWidth },\n slope: { type: 'f',\n value: image.slope },\n intercept: { type: 'f',\n value: image.intercept },\n minPixelValue: { type: 'f',\n value: image.minPixelValue },\n invert: { type: 'i',\n value: viewport.invert ? 1 : 0 }\n };\n\n renderQuad(shader, parameters, texture, image.width, image.height);\n\n return renderCanvas;\n}\n\nexport function isWebGLAvailable () {\n // Adapted from\n // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas\n\n const options = {\n failIfMajorPerformanceCaveat: true\n };\n\n try {\n const canvas = document.createElement('canvas');\n\n\n return Boolean(window.WebGLRenderingContext) &&\n (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));\n } catch (e) {\n return false;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/renderer.js","import { int16Shader, int16DataUtilities } from './int16.js';\nimport { int8Shader, int8DataUtilities } from './int8.js';\nimport { rgbShader, rgbDataUtilities } from './rgb.js';\nimport { uint16Shader, uint16DataUtilities } from './uint16.js';\nimport { uint8Shader, uint8DataUtilities } from './uint8.js';\n\nconst shaders = {\n int16: int16Shader,\n int8: int8Shader,\n rgb: rgbShader,\n uint16: uint16Shader,\n uint8: uint8Shader\n};\n\nconst dataUtilities = {\n int16: int16DataUtilities,\n int8: int8DataUtilities,\n rgb: rgbDataUtilities,\n uint16: uint16DataUtilities,\n uint8: uint8DataUtilities\n};\n\nexport { shaders, dataUtilities };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/index.js","/* eslint no-bitwise: 0 */\n\nconst int16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack int16 into three uint8 channels (r, g, b)\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack int16 into three uint8 channels (r, g, b)\n const pixelData = image.getPixelData();\n const numberOfChannels = 3;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = Math.abs(pixelData[i]);\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int16DataUtilities = {\n storedPixelDataToImageData\n};\n\nint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.g*65536.0;' +\n\n 'if (color.b == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int16.js","const int8Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Store data in Uint8Array\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n // Store data in Uint8Array\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n data[offset++] = pixelData[i];\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int8DataUtilities = {\n storedPixelDataToImageData\n};\n\nint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.;' +\n\n 'if (color.a == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int8.js","const rgbShader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack RGB images into a 3-channel RGB texture\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n // Only 3 channels, since we use WebGL's RGB texture format\n const numStoredPixels = image.width * image.height * 4;\n const numOutputPixels = image.width * image.height * 3;\n const storedPixelData = image.getPixelData();\n const data = new Uint8Array(numOutputPixels);\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n } else {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n }\n\n return data;\n}\n\nexport const rgbDataUtilities = {\n storedPixelDataToImageData\n};\n\nrgbShader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform float minPixelValue;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n\n // Get texture\n 'vec3 color = texture2D(u_image, v_texCoord).xyz;' +\n\n // Rescale based on slope and intercept\n 'color = color * 256.0 * slope + intercept;' +\n\n // Apply window settings\n 'float center0 = wc - 0.5 - minPixelValue;' +\n 'float width0 = max(ww, 1.0);' +\n 'color = (color - center0) / width0 + 0.5;' +\n\n // RGBA output\n 'gl_FragColor = vec4(color, 1);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' +\n '}';\n\nexport { rgbShader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/rgb.js","/* eslint no-bitwise: 0 */\n\nconst uint16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * For uint16 pack uint16 into two uint8 channels (r and a).\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack uint16 into two uint8 channels (r and a)\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = pixelData[i];\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n }\n\n return data;\n}\n\nexport const uint16DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.a*65536.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint16.js","const uint8Shader = {};\n\n/**\n * Convert stored pixel data to image data. Here we will store\n * all data in the alpha channel.\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n return image.getPixelData();\n}\n\nexport const uint8DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint8.js","export const vertexShader = 'attribute vec2 a_position;' +\n 'attribute vec2 a_texCoord;' +\n 'uniform vec2 u_resolution;' +\n 'varying vec2 v_texCoord;' +\n 'void main() {' +\n 'vec2 zeroToOne = a_position / u_resolution;' +\n 'vec2 zeroToTwo = zeroToOne * 2.0;' +\n 'vec2 clipSpace = zeroToTwo - 1.0;' +\n 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +\n 'v_texCoord = a_texCoord;' +\n '}';\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/vertexShader.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the canvas coordinate system to the pixel coordinate system\n * system. This can be used to reset tools' image coordinates after modifications\n * have been made in canvas space (e.g. moving a tool by a few cm, independent of\n * image resolution).\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {{x: Number, y: Number}} pt The input point in the canvas coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./canvasToPixel.js","import { getEnabledElements } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n\r\n/**\r\n * Disable an HTML element for further use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n if (element === undefined) {\r\n throw new Error('disable: element must not be undefined');\r\n }\r\n\r\n // Search for this element in this list of enabled elements\r\n const enabledElements = getEnabledElements();\r\n\r\n for (let i = 0; i < enabledElements.length; i++) {\r\n if (enabledElements[i].element === element) {\r\n // We found it!\r\n\r\n // Fire an event so dependencies can cleanup\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'cornerstoneelementdisabled', eventData);\r\n\r\n // Remove the child DOM elements that we created (e.g.canvas)\r\n enabledElements[i].element.removeChild(enabledElements[i].canvas);\r\n enabledElements[i].canvas = undefined;\r\n\r\n // Remove this element from the list of enabled elements\r\n enabledElements.splice(i, 1);\r\n\r\n break;\r\n }\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./disable.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport now from './internal/now.js';\nimport { setLayerImage } from './layers.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * Sets a new image object for a given element.\n *\n * Will also apply an optional viewport setting.\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Object} image An Image loaded by a Cornerstone Image Loader\n * @param {Object} [viewport] A set of Cornerstone viewport parameters\n * @returns {void}\n */\nexport default function (element, image, viewport) {\n if (element === undefined) {\n throw new Error('displayImage: parameter element must not be undefined');\n }\n if (image === undefined) {\n throw new Error('displayImage: parameter image must not be undefined');\n }\n\n const enabledElement = getEnabledElement(element);\n const oldImage = enabledElement.image;\n\n enabledElement.image = image;\n\n if (enabledElement.layers && enabledElement.layers.length) {\n setLayerImage(element, image);\n }\n\n if (enabledElement.viewport === undefined) {\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, image);\n }\n\n // Merge viewport\n if (viewport) {\n for (const attrname in viewport) {\n if (viewport[attrname] !== null) {\n enabledElement.viewport[attrname] = viewport[attrname];\n }\n }\n }\n\n let frameRate;\n\n if (enabledElement.lastImageTimeStamp !== undefined) {\n const timeSinceLastImage = now() - enabledElement.lastImageTimeStamp;\n\n frameRate = (1000 / timeSinceLastImage).toFixed();\n }\n\n enabledElement.lastImageTimeStamp = now();\n\n const newImageEventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n oldImage,\n enabledElement,\n frameRate\n };\n\n triggerEvent(enabledElement.element, 'cornerstonenewimage', newImageEventData);\n\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./displayImage.js","function s4 () {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).\n substring(1);\n}\n\n/**\n * Generate a unique identifier\n *\n * @return {string} A unique identifier\n */\nexport default function () {\n return `${s4() + s4()}-${s4()}-${s4()}-${\n s4()}-${s4()}${s4()}${s4()}`;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/guid.js","/**\n * This module is responsible for immediately drawing an enabled element\n */\n\nimport { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Immediately draws the enabled element\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('draw: image has not been loaded yet');\n }\n\n drawImage(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./draw.js","/**\n * This module is responsible for drawing invalidated enabled elements\n */\n\nimport { getEnabledElements } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Draws all invalidated enabled elements and clears the invalid flag after drawing it\n *\n * @returns {void}\n */\nexport default function () {\n const enabledElements = getEnabledElements();\n\n for (let i = 0; i < enabledElements.length; i++) {\n const ee = enabledElements[i];\n\n if (ee.invalid === true) {\n drawImage(ee, true);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./drawInvalidated.js","import { addEnabledElement } from './enabledElements.js';\r\nimport resize from './resize.js';\r\nimport drawImageSync from './internal/drawImageSync.js';\r\nimport requestAnimationFrame from './internal/requestAnimationFrame.js';\r\nimport webGL from './webgl/index.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n */\r\n\r\nfunction hasImageOrLayers (enabledElement) {\r\n return enabledElement.image !== undefined || enabledElement.layers.length;\r\n}\r\n\r\n\r\n/**\r\n * Enable an HTML Element for use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @param {Object} options Options for the enabledElement\r\n *\r\n * @return {void}\r\n */\r\nexport default function (element, options) {\r\n if (element === undefined) {\r\n throw new Error('enable: parameter element cannot be undefined');\r\n }\r\n\r\n // If this enabled element has the option set for WebGL, we should\r\n // Check if this device actually supports it\r\n if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {\r\n if (webGL.renderer.isWebGLAvailable()) {\r\n // If WebGL is available on the device, initialize the renderer\r\n // And return the renderCanvas from the WebGL rendering path\r\n webGL.renderer.initRenderer();\r\n options.renderer = 'webgl';\r\n } else {\r\n // If WebGL is not available on this device, we will fall back\r\n // To using the Canvas renderer\r\n console.error('WebGL not available, falling back to Canvas renderer');\r\n delete options.renderer;\r\n }\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n\r\n element.appendChild(canvas);\r\n\r\n const enabledElement = {\r\n element,\r\n canvas,\r\n image: undefined, // Will be set once image is loaded\r\n invalid: false, // True if image needs to be drawn, false if not\r\n needsRedraw: true,\r\n options,\r\n layers: [],\r\n data: {},\r\n renderingTools: {}\r\n };\r\n\r\n addEnabledElement(enabledElement);\r\n\r\n resize(element, true);\r\n\r\n /**\r\n * Draw the image immediately\r\n *\r\n * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks\r\n * @returns {void}\r\n */\r\n function draw (timestamp) {\r\n if (enabledElement.canvas === undefined) {\r\n return;\r\n }\r\n\r\n const eventDetails = {\r\n enabledElement,\r\n timestamp\r\n };\r\n\r\n triggerEvent(enabledElement.element, 'cornerstoneprerender', eventDetails);\r\n\r\n if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {\r\n drawImageSync(enabledElement, enabledElement.invalid);\r\n }\r\n\r\n requestAnimationFrame(draw);\r\n }\r\n\r\n draw();\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./enable.js","import now from './now.js';\r\nimport drawCompositeImage from './drawCompositeImage.js';\r\nimport { renderColorImage } from '../rendering/renderColorImage.js';\r\nimport { renderGrayscaleImage } from '../rendering/renderGrayscaleImage.js';\r\nimport { renderPseudoColorImage } from '../rendering/renderPseudoColorImage.js';\r\nimport { renderLabelMapImage } from '../rendering/renderLabelMapImage.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * Draw an image to a given enabled element synchronously\r\n *\r\n * @param {EnabledElement} enabledElement An enabled element to draw into\r\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\r\n * @returns {void}\r\n */\r\nexport default function (enabledElement, invalidated) {\r\n const image = enabledElement.image;\r\n const element = enabledElement.element;\r\n const layers = enabledElement.layers || [];\r\n\r\n // Check if enabledElement can be redrawn\r\n if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {\r\n return;\r\n }\r\n\r\n // Start measuring the time needed to draw the image/layers\r\n const start = now();\r\n\r\n image.stats = {\r\n lastGetPixelDataTime: -1.0,\r\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\r\n lastPutImageDataTime: -1.0,\r\n lastRenderTime: -1.0,\r\n lastLutGenerateTime: -1.0\r\n };\r\n\r\n if (layers && layers.length) {\r\n drawCompositeImage(enabledElement, invalidated);\r\n } else if (image) {\r\n let render = image.render;\r\n\r\n if (!render) {\r\n if (enabledElement.viewport.colormap &&\r\n enabledElement.viewport.colormap !== '' &&\r\n enabledElement.image.labelmap === true) {\r\n render = renderLabelMapImage;\r\n } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {\r\n render = renderPseudoColorImage;\r\n } else if (image.color) {\r\n render = renderColorImage;\r\n } else {\r\n render = renderGrayscaleImage;\r\n }\r\n }\r\n\r\n render(enabledElement, invalidated);\r\n }\r\n\r\n // Calculate how long it took to draw the image/layers\r\n const renderTimeInMs = now() - start;\r\n\r\n const eventData = {\r\n viewport: enabledElement.viewport,\r\n element,\r\n image,\r\n enabledElement,\r\n canvasContext: enabledElement.canvas.getContext('2d'),\r\n renderTimeInMs\r\n };\r\n\r\n image.stats.lastRenderTime = renderTimeInMs;\r\n\r\n enabledElement.invalid = false;\r\n enabledElement.needsRedraw = false;\r\n\r\n triggerEvent(element, 'cornerstoneimagerendered', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImageSync.js","import { getLayers, getActiveLayer, getVisibleLayers } from '../layers.js';\nimport { addGrayscaleLayer } from '../rendering/renderGrayscaleImage.js';\nimport { addColorLayer } from '../rendering/renderColorImage.js';\nimport { addPseudoColorLayer } from '../rendering/renderPseudoColorImage.js';\nimport { addLabelMapLayer } from '../rendering/renderLabelMapImage.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\n\n// This is used to keep each of the layers' viewports in sync with the active layer\nconst originalViewportScale = {};\n\nfunction getViewportRatio (baseLayerId, targetLayerId) {\n return originalViewportScale[targetLayerId] / originalViewportScale[baseLayerId];\n}\n\n// Sync all viewports based on active layer's viewport\nfunction syncViewports (layers, activeLayer) {\n // If we intend to keep the viewport's scale, translation and rotation in sync,\n // loop through the layers\n layers.forEach((layer) => {\n // Don't do anything to the active layer\n // Don't do anything if this layer has no viewport\n if (layer === activeLayer ||\n !layer.viewport ||\n !activeLayer.viewport) {\n return;\n }\n\n if (!originalViewportScale[layer.layerId]) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n\n const viewportRatio = getViewportRatio(activeLayer.layerId, layer.layerId);\n\n // Update the layer's translation and scale to keep them in sync with the first image\n // based on the ratios between the images\n layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;\n layer.viewport.rotation = activeLayer.viewport.rotation;\n layer.viewport.translation = {\n x: (activeLayer.viewport.translation.x / viewportRatio),\n y: (activeLayer.viewport.translation.y / viewportRatio)\n };\n layer.viewport.hflip = activeLayer.viewport.hflip;\n layer.viewport.vflip = activeLayer.viewport.vflip;\n });\n}\n\n/**\n * Internal function to render all layers for a Cornerstone enabled element\n *\n * @param {CanvasRenderingContext2D} context Canvas context to draw upon\n * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element\n * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn\n * @returns {void}\n */\nfunction renderLayers (context, layers, invalidated) {\n // Loop through each layer and draw it to the canvas\n layers.forEach((layer, index) => {\n if (!layer.image) {\n return;\n }\n\n context.save();\n\n // Set the layer's canvas to the pixel coordinate system\n layer.canvas = context.canvas;\n setToPixelCoordinateSystem(layer, context);\n\n // Render into the layer's canvas\n const colormap = layer.viewport.colormap || layer.options.colormap;\n const labelmap = layer.viewport.labelmap;\n const isInvalid = layer.invalid || invalidated;\n\n if (colormap && colormap !== '' && labelmap === true) {\n addLabelMapLayer(layer, isInvalid);\n } else if (colormap && colormap !== '') {\n addPseudoColorLayer(layer, isInvalid);\n } else if (layer.image.color === true) {\n addColorLayer(layer, isInvalid);\n } else {\n // If this is the base layer, use the alpha channel for rendering of the grayscale image\n const useAlphaChannel = (index === 0);\n\n addGrayscaleLayer(layer, isInvalid, useAlphaChannel);\n }\n\n // Apply any global opacity settings that have been defined for this layer\n if (layer.options && layer.options.opacity) {\n context.globalAlpha = layer.options.opacity;\n } else {\n context.globalAlpha = 1;\n }\n\n if (layer.options && layer.options.fillStyle) {\n context.fillStyle = layer.options.fillStyle;\n }\n\n // Set the pixelReplication property before drawing from the layer into the\n // composite canvas\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Draw from the current layer's canvas onto the enabled element's canvas\n const { width, height } = layer.image;\n\n context.drawImage(layer.canvas, 0, 0, width, height, 0, 0, width, height);\n context.restore();\n\n layer.invalid = false;\n });\n}\n\n/**\n * Internal API function to draw a composite image to a given enabled element\n *\n * @param {EnabledElement} enabledElement An enabled element to draw into\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated) {\n const element = enabledElement.element;\n const allLayers = getLayers(element);\n const activeLayer = getActiveLayer(element);\n const visibleLayers = getVisibleLayers(element);\n const resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports;\n\n // This state will help us to determine if the user has re-synced the\n // layers allowing us to make a new copy of the viewports\n enabledElement.lastSyncViewportsState = enabledElement.syncViewports;\n\n // Stores a copy of all viewports if the user has just synced them then we can use the\n // copies to calculate anything later (ratio, translation offset, rotation offset, etc)\n if (resynced) {\n allLayers.forEach(function (layer) {\n if (layer.viewport) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n });\n }\n\n // Sync all viewports in case it's activated\n if (enabledElement.syncViewports === true) {\n syncViewports(visibleLayers, activeLayer);\n }\n\n // Get the enabled element's canvas so we can draw to it\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Render all visible layers\n renderLayers(context, visibleLayers, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawCompositeImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n * @returns {*} Whatever data is stored for this enabled element\n */\nexport function getElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n if (ee.data.hasOwnProperty(dataType) === false) {\n ee.data[dataType] = {};\n }\n\n return ee.data[dataType];\n}\n\n/**\n * Clears any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n *\n * @returns {void}\n */\nexport function removeElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n delete ee.data[dataType];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElementData.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\n\n/**\n * Returns a default viewport for display the specified image on the specified\n * enabled element. The default viewport is fit to window\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image Object\n *\n * @returns {Viewport} The default viewport for the image\n */\nexport default function (element, image) {\n const enabledElement = getEnabledElement(element);\n\n return getDefaultViewport(enabledElement.canvas, image);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getDefaultViewportForImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Returns the currently displayed image for an element or undefined if no image has\n * been displayed yet\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Image} The Cornerstone Image Object displayed in this element\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.image;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getImage.js","import { getEnabledElement } from './enabledElements.js';\nimport getStoredPixels from './getStoredPixels.js';\nimport getModalityLUT from './internal/getModalityLUT.js';\n\n/**\n * Retrieves an array of pixels from a rectangular region with modality LUT transformation applied\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The modality pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n const storedPixels = getStoredPixels(element, x, y, width, height);\n const ee = getEnabledElement(element);\n const mlutfn = getModalityLUT(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);\n\n return storedPixels.map(mlutfn);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getPixels.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves the viewport for the specified enabled element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Viewport|undefined} The Cornerstone Viewport settings for this element, if they exist. Otherwise, undefined\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const viewport = enabledElement.viewport;\n\n if (viewport === undefined) {\n return;\n }\n\n // Return a copy of the viewport\n return Object.assign({}, viewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getViewport.js","import { getImageLoadObject, putImageLoadObject } from './imageCache.js';\r\nimport events from './events.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module deals with ImageLoaders, loading images and caching images\r\n */\r\n\r\n\r\nconst imageLoaders = {};\r\n\r\nlet unknownImageLoader;\r\n\r\n/**\r\n * Load an image using a registered Cornerstone Image Loader.\r\n *\r\n * The image loader that is used will be\r\n * determined by the image loader scheme matching against the imageId.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails\r\n */\r\nfunction loadImageFromImageLoader (imageId, options) {\r\n const colonIndex = imageId.indexOf(':');\r\n const scheme = imageId.substring(0, colonIndex);\r\n const loader = imageLoaders[scheme];\r\n\r\n if (loader === undefined || loader === null) {\r\n if (unknownImageLoader !== undefined) {\r\n return unknownImageLoader(imageId);\r\n }\r\n\r\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\r\n }\r\n\r\n const imageLoadObject = loader(imageId, options);\r\n\r\n // Broadcast an image loaded event once the image is loaded\r\n imageLoadObject.promise.then(function (image) {\r\n triggerEvent(events, 'cornerstoneimageloaded', { image });\r\n }, function (error) {\r\n const errorObject = {\r\n imageId,\r\n error\r\n };\r\n\r\n triggerEvent(events, 'cornerstoneimageloadfailed', errorObject);\r\n });\r\n\r\n return imageLoadObject;\r\n}\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails\r\n */\r\nexport function loadImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadImage: parameter imageId must not be undefined');\r\n }\r\n\r\n const imageLoadObject = getImageLoadObject(imageId);\r\n\r\n if (imageLoadObject !== undefined) {\r\n return imageLoadObject.promise;\r\n }\r\n\r\n return loadImageFromImageLoader(imageId, options).promise;\r\n}\r\n\r\n//\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Object} Image Loader Object (TODO: define a JSDoc type for this)\r\n */\r\nexport function loadAndCacheImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadAndCacheImage: parameter imageId must not be undefined');\r\n }\r\n\r\n let imageLoadObject = getImageLoadObject(imageId);\r\n\r\n if (imageLoadObject !== undefined) {\r\n return imageLoadObject.promise;\r\n }\r\n\r\n imageLoadObject = loadImageFromImageLoader(imageId, options);\r\n\r\n putImageLoadObject(imageId, imageLoadObject);\r\n\r\n return imageLoadObject.promise;\r\n}\r\n\r\n/**\r\n * Registers an imageLoader plugin with cornerstone for the specified scheme\r\n *\r\n * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\r\n * @param {Function} imageLoader A Cornerstone Image Loader function\r\n * @returns {void}\r\n */\r\nexport function registerImageLoader (scheme, imageLoader) {\r\n imageLoaders[scheme] = imageLoader;\r\n}\r\n\r\n/**\r\n * Registers a new unknownImageLoader and returns the previous one\r\n *\r\n * @param {Function} imageLoader A Cornerstone Image Loader\r\n *\r\n * @returns {Function|Undefined} The previous Unknown Image Loader\r\n */\r\nexport function registerUnknownImageLoader (imageLoader) {\r\n const oldImageLoader = unknownImageLoader;\r\n\r\n unknownImageLoader = imageLoader;\r\n\r\n return oldImageLoader;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./imageLoader.js","import { getEnabledElement } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module contains a function to make an image is invalid\r\n */\r\n\r\n/**\r\n * Sets the invalid flag on the enabled element and fire an event\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n const enabledElement = getEnabledElement(element);\r\n\r\n enabledElement.invalid = true;\r\n enabledElement.needsRedraw = true;\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'cornerstoneinvalidated', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./invalidate.js","/**\n * This module contains a function to immediately invalidate an image\n */\n\nimport { getEnabledElementsByImageId } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the all enabled elements\n * displaying the specified imageId\n *\n * @param {string} imageId The imageId of the Cornerstone Image Object to redraw\n * @returns {void}\n */\nexport default function (imageId) {\n\n const enabledElements = getEnabledElementsByImageId(imageId);\n\n enabledElements.forEach(function (enabledElement) {\n drawImage(enabledElement, true);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./invalidateImageId.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the page coordinate system to the pixel coordinate\n * system\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {Number} pageX The x value in the page coordinate system\n * @param {Number} pageY The y value in the page coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pageX, pageY) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('image has not been loaded yet');\n }\n\n // Convert the pageX and pageY to the canvas client coordinates\n const rect = element.getBoundingClientRect();\n const clientX = pageX - rect.left - window.pageXOffset;\n const clientY = pageY - rect.top - window.pageYOffset;\n\n const pt = { x: clientX,\n y: clientY };\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pageToPixel.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the pixel coordinate system to the canvas coordinate system\n * system. This can be used to render using canvas context without having the weird\n * side effects that come from scaling and non square pixels\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system\n *\n * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelToCanvas.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Resets the viewport to the default settings\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, enabledElement.image);\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./reset.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\nconst MIN_WINDOW_WIDTH = 0.000001;\nconst MIN_VIEWPORT_SCALE = 0.0001;\n\n/**\n * Sets the viewport for an element and corrects invalid values\n *\n * @param {HTMLElement} element - DOM element of the enabled element\n * @param {Viewport} viewport - Object containing the viewport properties\n * @returns {void}\n */\nexport default function (element, viewport) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport.translation.x = viewport.translation.x;\n enabledElement.viewport.translation.y = viewport.translation.y;\n enabledElement.viewport.voi.windowCenter = viewport.voi.windowCenter;\n enabledElement.viewport.invert = viewport.invert;\n enabledElement.viewport.pixelReplication = viewport.pixelReplication;\n enabledElement.viewport.rotation = viewport.rotation;\n enabledElement.viewport.hflip = viewport.hflip;\n enabledElement.viewport.vflip = viewport.vflip;\n enabledElement.viewport.modalityLUT = viewport.modalityLUT;\n enabledElement.viewport.voiLUT = viewport.voiLUT;\n enabledElement.viewport.colormap = viewport.colormap;\n enabledElement.viewport.labelmap = viewport.labelmap;\n\n // Prevent window width from being too small (note that values close to zero are valid and can occur with\n // PET images in particular)\n enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);\n\n // Prevent scale from getting too small\n enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);\n\n // Normalize the rotation value to a positive rotation in degrees\n enabledElement.viewport.rotation %= 360;\n if (enabledElement.viewport.rotation < 0) {\n enabledElement.viewport.rotation += 360;\n }\n\n // Force the image to be updated since the viewport has been modified\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setViewport.js","import { renderColorImage } from './renderColorImage.js';\nimport { renderGrayscaleImage } from './renderGrayscaleImage.js';\nimport { renderWebImage } from './renderWebImage.js';\n\nexport default {\n colorImage: renderColorImage,\n grayscaleImage: renderGrayscaleImage,\n webImage: renderWebImage\n};\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/index.js","// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nconst providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param {Function} provider Metadata provider function\n * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @returns {void}\n */\nexport function addProvider (provider, priority = 0) {\n let i;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority,\n provider\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param {Function} provider Metadata provider function\n *\n * @returns {void}\n */\nexport function removeProvider (provider) {\n for (let i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param {String} type The type of metadata requested from the metadata store\n * @param {String} imageId The Cornerstone Image Object's imageId\n *\n * @returns {*} The metadata retrieved from the metadata store\n */\nfunction getMetaData (type, imageId) {\n // Invoke each provider in priority order until one returns something\n for (let i = 0; i < providers.length; i++) {\n const result = providers[i].provider(type, imageId);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexport default {\n addProvider,\n removeProvider,\n get: getMetaData\n};\n\n\n\n// WEBPACK FOOTER //\n// ./metaData.js","import { getEnabledElement } from './enabledElements.js';\nimport pixelDataToFalseColorData from './pixelDataToFalseColorData.js';\nimport { getColormap } from './colors/colormap.js';\n\n/**\n * Retrieves the minimum and maximum pixel values from an Array of pixel data\n *\n * @param {Array} pixelData The input pixel data array\n *\n * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array\n */\nfunction getPixelValues (pixelData) {\n let minPixelValue = Number.MAX_VALUE;\n let maxPixelValue = Number.MIN_VALUE;\n const len = pixelData.length;\n let pixel;\n\n for (let i = 0; i < len; i++) {\n pixel = pixelData[i];\n minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;\n maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;\n }\n\n return {\n minPixelValue,\n maxPixelValue\n };\n}\n\n/**\n * Retrieve a function that will allow an image object to be reset to its original form\n * after a false color mapping transformation\n *\n * @param {Image} image A Cornerstone Image Object\n *\n * @return {Function} A function for resetting an Image Object to its original form\n */\nfunction getRestoreImageMethod (image) {\n if (image.restore) {\n return image.restore;\n }\n\n const color = image.color;\n const rgba = image.rgba;\n const cachedLut = image.cachedLut;\n const slope = image.slope;\n const windowWidth = image.windowWidth;\n const windowCenter = image.windowCenter;\n const minPixelValue = image.minPixelValue;\n const maxPixelValue = image.maxPixelValue;\n\n return function () {\n image.color = color;\n image.rgba = rgba;\n image.cachedLut = cachedLut;\n image.slope = slope;\n image.windowWidth = windowWidth;\n image.windowCenter = windowCenter;\n image.minPixelValue = minPixelValue;\n image.maxPixelValue = maxPixelValue;\n\n if (image.origPixelData) {\n const pixelData = image.origPixelData;\n\n image.getPixelData = () => pixelData;\n }\n\n // Remove some attributes added by false color mapping\n image.origPixelData = undefined;\n image.colormapId = undefined;\n image.falseColor = undefined;\n };\n}\n\n//\n// Then we need to make sure it will be converted into a colormap object if it's as string.\n\n/**\n * User can pass a colormap or its id as string to some of these public functions.\n * Then we need to make sure it will be converted into a colormap object if it's a string.\n *\n * @param {*} colormap A colormap ID or Object\n * @return {*} The colormap\n */\nfunction ensuresColormap (colormap) {\n if (colormap && (typeof colormap === 'string')) {\n colormap = getColormap(colormap);\n }\n\n return colormap;\n}\n\n/**\n * Restores a false color image to its original version\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.\n */\nfunction restoreImage (image) {\n if (image.restore && (typeof image.restore === 'function')) {\n image.restore();\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Convert an image to a false color image\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {Boolean} - Whether or not the image has been converted to a false color image\n */\nfunction convertImageToFalseColorImage (image, colormap) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n // User can pass a colormap id or a colormap object\n colormap = ensuresColormap(colormap);\n\n const colormapId = colormap.getId();\n\n // Doesn't do anything if colormapId hasn't changed\n if (image.colormapId === colormapId) {\n // It has already being converted into a false color image\n // Using the colormapId passed as parameter\n return false;\n }\n\n // Restore the image attributes updated when converting to a false color image\n restoreImage(image);\n\n // Convert the image to a false color image\n if (colormapId) {\n const minPixelValue = image.minPixelValue || 0;\n const maxPixelValue = image.maxPixelValue || 255;\n\n image.restore = getRestoreImageMethod(image);\n\n const lookupTable = colormap.createLookupTable();\n\n lookupTable.setTableRange(minPixelValue, maxPixelValue);\n\n // Update the pixel data and render the new image\n pixelDataToFalseColorData(image, lookupTable);\n\n // Update min and max pixel values\n const pixelValues = getPixelValues(image.getPixelData());\n\n image.minPixelValue = pixelValues.minPixelValue;\n image.maxPixelValue = pixelValues.maxPixelValue;\n\n image.windowWidth = 255;\n image.windowCenter = 128;\n\n // Cache the last colormapId used for performance\n // Then it doesn't need to be re-rendered on next\n // Time if the user hasn't updated it\n image.colormapId = colormapId;\n }\n\n // Return `true` to tell the caller that the image has got updated\n return true;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {HTMLElement} element The Cornerstone element\n * @param {*} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {void}\n */\nfunction convertToFalseColorImage (element, colormap) {\n const enabledElement = getEnabledElement(element);\n\n\n return convertImageToFalseColorImage(enabledElement.image, colormap);\n}\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage };\n\n\n\n// WEBPACK FOOTER //\n// ./falseColorMapping.js"],"sourceRoot":""} \ No newline at end of file diff --git a/examples/cornerstone.min.js b/examples/cornerstone.min.js index c1ad89eb7..4c278681e 100755 --- a/examples/cornerstone.min.js +++ b/examples/cornerstone.min.js @@ -1,3 +1,3 @@ -/*! cornerstone-core - 1.1.3 - 2017-11-17 | (c) 2016 Chris Hafey | https://github.com/chafey/cornerstone */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstone-core",[],t):"object"==typeof exports?exports["cornerstone-core"]=t():e.cornerstone=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=41)}([function(e,t,r){"use strict";function n(e){if(void 0===e)throw new Error("getEnabledElement: parameter element must not be undefined");for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:null,n=void 0;"function"==typeof window.CustomEvent?n=new CustomEvent(t.toLocaleLowerCase(),{detail:r}):(n=document.createEvent("CustomEvent"),n.initCustomEvent(t.toLocaleLowerCase(),!0,!0,r)),a.external.$(e).trigger(t,r),e.dispatchEvent(n)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n;var a=r(33)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){if(void 0===e)throw new Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw new Error("setToPixelCoordinateSystem: parameter context must not be undefined");var n=(0,a.default)(e,r);t.setTransform(n.m[0],n.m[1],n.m[2],n.m[3],n.m[4],n.m[5])};var n=r(22),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=(0,n.getEnabledElement)(e);if(void 0===r.image&&!r.layers.length)throw new Error("updateImage: image has not been loaded yet");(0,o.default)(r,t)};var n=r(0),a=r(5),o=function(e){return e&&e.__esModule?e:{default:e}}(a)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e.needsRedraw=!0,t&&(e.invalid=!0)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(void 0===e)throw new Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return{scale:1,translation:{x:0,y:0},voi:{windowWidth:void 0,windowCenter:void 0},invert:!1,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:void 0,voiLUT:void 0,colormap:void 0,labelmap:!1};var r=e.height/t.rows,n=e.width/t.columns;return{scale:Math.min(n,r),translation:{x:0,y:0},voi:{windowWidth:t.windowWidth,windowCenter:t.windowCenter},invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,voiLUT:t.voiLUT,colormap:t.colormap,labelmap:Boolean(t.labelmap)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(27),a=r(28),o=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default={getColormap:n.getColormap,getColormapsList:n.getColormapsList,LookupTable:o.default}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&e.cachedLut.invert===t.invert?e.cachedLut.lutArray:((0,f.default)(e,t.voi.windowWidth,t.voi.windowCenter,t.invert),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.lutArray)}function o(e,t,r){e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=document.createElement("canvas"));var n=e.renderingTools.renderCanvas;if(255===e.viewport.voi.windowWidth&&128===e.viewport.voi.windowCenter&&!1===e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!1===(0,I.default)(e,t)&&!0!==r)return n;n.width===t.width&&n.height===t.height||(0,P.default)(e,t);var o=(0,d.default)(),i=a(t,e.viewport);t.stats=t.stats||{},t.stats.lastLutGenerateTime=(0,d.default)()-o;var l=e.renderingTools.renderCanvasData,u=e.renderingTools.renderCanvasContext;return t.rgba?(0,v.default)(t,i,l.data):(0,m.default)(t,i,l.data),o=(0,d.default)(),u.putImageData(l,0,0),t.stats.lastPutImageDataTime=(0,d.default)()-o,n}function i(e,t){if(void 0===e)throw new Error("renderColorImage: enabledElement parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("renderColorImage: image must be loaded before it can be drawn");var n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,(0,p.default)(e,n);var a=void 0;a=e.options&&e.options.renderer&&"webgl"===e.options.renderer.toLowerCase()?w.default.renderer.render(e):o(e,r,t),n.drawImage(a,0,0,r.width,r.height,0,0,r.width,r.height),e.renderingTools=(0,E.default)(e)}function l(e,t){if(void 0===e)throw new Error("addColorLayer: layer parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("addColorLayer: image must be loaded before it can be drawn");r.rgba=!0,e.canvas=o(e,r,t);var n=e.canvas.getContext("2d");n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,e.renderingTools=(0,E.default)(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderColorImage=i,t.addColorLayer=l;var u=r(1),d=n(u),s=r(9),f=n(s),c=r(19),m=n(c),g=r(45),v=n(g),h=r(3),p=n(h),b=r(14),w=n(b),y=r(13),I=n(y),_=r(11),P=n(_),C=r(12),E=n(C)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,n,a,i){var u=e.maxPixelValue,d=e.minPixelValue,s=Math.min(d,0);if(void 0===e.cachedLut){var f=u-s+1;e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(f)}var c=e.cachedLut.lutArray,m=(0,o.default)(e.slope,e.intercept,a),g=(0,l.default)(t,r,i);if(!0===n)for(var v=d;v<=u;v++)c[v+-s]=255-g(m(v));else for(var h=d;h<=u;h++)c[h+-s]=g(m(h));return c};var a=r(26),o=n(a),i=r(42),l=n(i)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,a.default)(e)};var n=r(22),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;var n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);var a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.image.imageId,r=e.viewport;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=r(46),o=r(34),i=n(o),l=r(32),u=n(l),d={createProgramFromString:i.default,renderer:{render:a.render,initRenderer:a.initRenderer,getRenderCanvas:a.getRenderCanvas,isWebGLAvailable:a.isWebGLAvailable},textureCache:u.default};Object.defineProperty(d,"isWebGLInitialized",{enumerable:!0,configurable:!1,get:function(){return a.isWebGLInitialized}}),t.default=d},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3])||arguments[3];e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=document.createElement("canvas"));var a=e.renderingTools.renderCanvas;if(!1===(0,y.default)(e,t)&&!0!==r)return a;a.width===t.width&&a.height===t.height||(0,_.default)(e,t);var o=(0,g.default)(),i=(0,b.default)(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=(0,g.default)()-o;var l=e.renderingTools.renderCanvasData,d=e.renderingTools.renderCanvasContext;return n?(0,u.default)(t,i,l.data):(0,s.default)(t,i,l.data),o=(0,g.default)(),d.putImageData(l,0,0),t.stats.lastPutImageDataTime=(0,g.default)()-o,a}function o(e,t){if(void 0===e)throw new Error("drawImage: enabledElement parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("drawImage: image must be loaded before it can be drawn");var n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,(0,c.default)(e,n);var o=void 0;o=e.options&&e.options.renderer&&"webgl"===e.options.renderer.toLowerCase()?h.default.renderer.render(e):a(e,r,t),n.drawImage(o,0,0,r.width,r.height,0,0,r.width,r.height),e.renderingTools=(0,C.default)(e)}function i(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(void 0===e)throw new Error("addGrayscaleLayer: layer parameter must not be undefined");var n=e.image;if(void 0===n)throw new Error("addGrayscaleLayer: image must be loaded before it can be drawn");e.canvas=a(e,n,t,r);var o=e.canvas.getContext("2d");o.imageSmoothingEnabled=!e.viewport.pixelReplication,o.mozImageSmoothingEnabled=o.imageSmoothingEnabled,e.renderingTools=(0,C.default)(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderGrayscaleImage=o,t.addGrayscaleLayer=i;var l=r(18),u=n(l),d=r(29),s=n(d),f=r(3),c=n(f),m=r(1),g=n(m),v=r(14),h=n(v),p=r(31),b=n(p),w=r(13),y=n(w),I=r(11),_=n(I),P=r(12),C=n(P)},function(e,t,r){"use strict";function n(e){window.setTimeout(e,1e3/60)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return window.requestAnimationFrame(e)||window.webkitRequestAnimationFrame(e)||window.mozRequestAnimationFrame(e)||window.oRequestAnimationFrame(e)||window.msRequestAnimationFrame(e)||n(e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){var n=(0,a.default)(),o=e.getPixelData();e.stats.lastGetPixelDataTime=(0,a.default)()-n;var i=o.length,l=e.minPixelValue,u=3,d=0;if(n=(0,a.default)(),o instanceof Int16Array)if(l<0)for(;d=n?r:e.lut[a]}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return r?a(r):n(e,t)}},function(e,t,r){"use strict";function n(e,t,r){r=null===r?100:r;for(var n=(t-e)/(r-1),a=[];r-- >0;)a.push(e),e+=n;return a[a.length-1]=t,a}function a(e,t){for(var r=0,n=e.length-1;r<=n;){var a=r+Math.floor((n-r)/2),o=e[a];if(o===t)return a;t=0&&e1)throw new Error("HSVToRGB expects hue < 1");var n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;var a=Math.floor(6*e),o=6*e-a,i=r*(1-t),l=r*(1-t*o),u=r*(1-t*(1-o));switch(a){case 0:case 6:n[0]=r,n[1]=u,n[2]=i;break;case 1:n[0]=l,n[1]=r,n[2]=i;break;case 2:n[0]=i,n[1]=r,n[2]=u;break;case 3:n[0]=i,n[1]=l,n[2]=r;break;case 4:n[0]=u,n[1]=i,n[2]=r;break;case 5:n[0]=r,n[1]=i,n[2]=l}return n}function o(e,t){var r=void 0;return r=et.Range[1]?t.MaxIndex+u+1.5:(e+t.Shift)*t.Scale,Math.floor(r)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r1)||e){this.Table=[];var t=this.NumberOfColors-1,r=void 0,n=void 0,o=void 0,i=void 0;t?(r=(this.HueRange[1]-this.HueRange[0])/t,n=(this.SaturationRange[1]-this.SaturationRange[0])/t,o=(this.ValueRange[1]-this.ValueRange[0])/t,i=(this.AlphaRange[1]-this.AlphaRange[0])/t):r=n=o=i=0;for(var l=0;l<=t;l++){var u=this.HueRange[0]+l*r,d=this.SaturationRange[0]+l*n,s=this.ValueRange[0]+l*o,f=this.AlphaRange[0]+l*i,c=a(u,d,s),m=[];switch(this.Ramp){case"scurve":m[0]=Math.floor(127.5*(1+Math.cos((1-c[0])*Math.PI))),m[1]=Math.floor(127.5*(1+Math.cos((1-c[1])*Math.PI))),m[2]=Math.floor(127.5*(1+Math.cos((1-c[2])*Math.PI))),m[3]=Math.floor(255*f);break;case"linear":m[0]=Math.floor(255*c[0]+.5),m[1]=Math.floor(255*c[1]+.5),m[2]=Math.floor(255*c[2]+.5),m[3]=Math.floor(255*f+.5);break;case"sqrt":m[0]=Math.floor(255*Math.sqrt(c[0])+.5),m[1]=Math.floor(255*Math.sqrt(c[1])+.5),m[2]=Math.floor(255*Math.sqrt(c[2])+.5),m[3]=Math.floor(255*Math.sqrt(f)+.5);break;default:throw new Error("Invalid Ramp value ("+this.Ramp+")")}this.Table.push(m)}this.buildSpecialColors()}}},{key:"buildSpecialColors",value:function(){var e=this.NumberOfColors,t=e+l,r=e+u,n=e+2;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[n]=this.NaNColor}},{key:"mapValue",value:function(e){var t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&ethis.TableRange[1])return this.AboveRangeColor;return this.Table[t]}},{key:"getIndex",value:function(e){var t={};if(t.Range=[],t.MaxIndex=this.NumberOfColors-1,t.Shift=-this.TableRange[0],this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return-1;var r=o(e,t);return r===this.NumberOfColors+l?r=0:r===this.NumberOfColors+u&&(r=this.NumberOfColors-1),r}},{key:"setTableValue",value:function(e,t){if(5===arguments.length&&(t=Array.prototype.slice.call(arguments,1)),e<0)throw new Error("Can't set the table value for negative index ("+e+")");e>=this.NumberOfColors&&new Error("Index "+e+" is greater than the number of colors "+this.NumberOfColors),this.Table[e]=t,0!==e&&e!==this.NumberOfColors-1||this.buildSpecialColors()}}]),e}();t.default=d},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){var n=(0,a.default)(),o=e.getPixelData();e.stats.lastGetPixelDataTime=(0,a.default)()-n;var i=o.length,l=e.minPixelValue,u=0,d=0,s=void 0;if(n=(0,a.default)(),o instanceof Int16Array)if(l<0)for(;dt.timeStamp?-1:e.timeStampp;){var t=h[h.length-1];b-=t.sizeInBytes,delete v[t.imageId],h.pop(),(0,g.default)(c.default,"CornerstoneWebGLTextureRemoved",{imageId:t.imageId})}var r=a();(0,g.default)(c.default,"CornerstoneWebGLTextureCacheFull",r)}}function i(e){if(void 0===e)throw new Error("setMaximumSizeBytes: parameter numBytes must not be undefined");if(void 0===e.toFixed)throw new Error("setMaximumSizeBytes: parameter numBytes must be a number");p=e,o()}function l(e,t){var r=e.imageId;if(void 0===e)throw new Error("putImageTexture: image must not be undefined");if(void 0===r)throw new Error("putImageTexture: imageId must not be undefined");if(void 0===t)throw new Error("putImageTexture: imageTexture must not be undefined");if(!0===Object.prototype.hasOwnProperty.call(v,r))throw new Error("putImageTexture: imageId already in cache");var n={imageId:r,imageTexture:t,timeStamp:new Date,sizeInBytes:t.sizeInBytes};if(v[r]=n,h.push(n),void 0===t.sizeInBytes)throw new Error("putImageTexture: imageTexture.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw new Error("putImageTexture: imageTexture.sizeInBytes is not a number");b+=n.sizeInBytes,o()}function u(e){if(void 0===e)throw new Error("getImageTexture: imageId must not be undefined");var t=v[e];if(void 0!==t)return t.timeStamp=new Date,t.imageTexture}function d(e){if(void 0===e)throw new Error("removeImageTexture: imageId must not be undefined");var t=v[e];if(void 0===t)throw new Error("removeImageTexture: imageId must not be undefined");return h.splice(h.indexOf(t),1),b-=t.sizeInBytes,delete v[e],t.imageTexture}function s(){for(;h.length>0;){var e=h.pop();delete v[e.imageId]}b=0}Object.defineProperty(t,"__esModule",{value:!0});var f=r(15),c=n(f),m=r(2),g=n(m),v={},h=[],p=268435456,b=0;t.default={purgeCache:s,getImageTexture:u,putImageTexture:l,removeImageTexture:d,setMaximumSizeBytes:i}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=window.$,a={set $(e){n=e},get $(){return n}};t.external=a},function(e,t,r){"use strict";function n(e,t,r){var n=e.createShader(r);if(e.shaderSource(n,t),e.compileShader(n),!e.getShaderParameter(n,e.COMPILE_STATUS)&&!e.isContextLost()){var a=e.getShaderInfoLog(n);console.error("Could not compile shader:\n"+a)}return n}function a(e,t,r){var n=e.createProgram();if(e.attachShader(n,t),e.attachShader(n,r),e.linkProgram(n),!e.getProgramParameter(n,e.LINK_STATUS)&&!e.isContextLost()){var a=e.getProgramInfoLog(n);console.error("WebGL program filed to link:\n"+a)}return n}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return a(e,n(e,t,e.VERTEX_SHADER),n(e,r,e.FRAGMENT_SHADER))}},function(e,t,r){"use strict";function n(e,t){if(void 0===e)throw new Error("renderWebImage: enabledElement parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("renderWebImage: image must be loaded before it can be drawn");if(e.viewport.voi.windowWidth===e.image.windowWidth&&e.viewport.voi.windowCenter===e.image.windowCenter&&!1===e.viewport.invert){var n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,(0,o.default)(e,n),n.drawImage(r.getImage(),0,0,r.width,r.height,0,0,r.width,r.height)}else(0,i.renderColorImage)(e,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderWebImage=n;var a=r(3),o=function(e){return e&&e.__esModule?e:{default:e}}(a),i=r(8)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){t.width!==e.clientWidth&&(t.width=e.clientWidth,t.style.width=e.clientWidth+"px"),t.height!==e.clientHeight&&(t.height=e.clientHeight,t.style.height=e.clientHeight+"px")}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=(0,o.getEnabledElement)(e);a(e,r.canvas);var n={element:e};(0,f.default)(e,"CornerstoneElementResized",n),void 0!==r.image&&(!0===t?(0,l.default)(e):(0,d.default)(e))};var o=r(0),i=r(37),l=n(i),u=r(4),d=n(u),s=r(2),f=n(s)},function(e,t,r){"use strict";function n(e){return 0===e.viewport.rotation||180===e.viewport.rotation?{width:e.image.width,height:e.image.height}:{width:e.image.height,height:e.image.width}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=(0,a.getEnabledElement)(e),r=n(t),o=t.canvas.height/r.height,l=t.canvas.width/r.width;t.viewport.scale=Math.min(l,o),t.viewport.translation.x=0,t.viewport.translation.y=0,(0,i.default)(e)};var a=r(0),o=r(4),i=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,a,o){if(void 0===e)throw new Error("getStoredPixels: parameter element must not be undefined");t=Math.round(t),r=Math.round(r);for(var i=(0,n.getEnabledElement)(e),l=[],u=0,d=i.image.getPixelData(),s=0;st.timeStamp?-1:e.timeStampp;){var t=y[y.length-1],r=t.imageId;u(r),(0,h.default)(g.default,"CornerstoneImageCachePromiseRemoved",{imageId:r})}var n=d();(0,h.default)(g.default,"CornerstoneImageCacheFull",n)}}function i(e,t){if(void 0===e)throw new Error("putImagePromise: imageId must not be undefined");if(void 0===t)throw new Error("putImagePromise: imagePromise must not be undefined");if(!0===w.hasOwnProperty(e))throw new Error("putImagePromise: imageId already in cache");var r={loaded:!1,imageId:e,sharedCacheKey:void 0,imagePromise:t,timeStamp:Date.now(),sizeInBytes:0};w[e]=r,y.push(r),t.then(function(e){if(-1!==y.indexOf(r)){if(r.loaded=!0,r.image=e,void 0===e.sizeInBytes)throw new Error("putImagePromise: sizeInBytes must not be undefined");if(void 0===e.sizeInBytes.toFixed)throw new Error("putImagePromise: image.sizeInBytes is not a number");r.sizeInBytes=e.sizeInBytes,b+=r.sizeInBytes;var t={action:"addImage",image:r};(0,h.default)(g.default,"CornerstoneImageCacheChanged",t),r.sharedCacheKey=e.sharedCacheKey,o()}})}function l(e){if(void 0===e)throw new Error("getImagePromise: imageId must not be undefined");var t=w[e];if(void 0!==t)return t.timeStamp=Date.now(),t.imagePromise}function u(e){if(void 0===e)throw new Error("removeImagePromise: imageId must not be undefined");var t=w[e];if(void 0===t)throw new Error("removeImagePromise: imageId was not present in imageCache");t.imagePromise.reject(),y.splice(y.indexOf(t),1),b-=t.sizeInBytes;var r={action:"deleteImage",image:t};(0,h.default)(g.default,"CornerstoneImageCacheChanged",r),s(t.imagePromise),delete w[e]}function d(){return{maximumSizeInBytes:p,cacheSizeInBytes:b,numberOfImagesCached:y.length}}function s(e){e.then(function(e){e.decache&&e.decache()})}function f(){for(;y.length>0;){u(y[0].imageId)}}function c(e,t){var r=w[e];r&&r.imagePromise.then(function(e){var n=t-e.sizeInBytes;e.sizeInBytes=t,r.sizeInBytes=t,b+=n;var a={action:"changeImageSize",image:e};(0,h.default)(g.default,"CornerstoneImageCacheChanged",a)})}Object.defineProperty(t,"__esModule",{value:!0}),t.cachedImages=void 0,t.setMaximumSizeBytes=a,t.putImagePromise=i,t.getImagePromise=l,t.removeImagePromise=u,t.getCacheInfo=d,t.purgeCache=f,t.changeImageIdCacheSize=c;var m=r(15),g=n(m),v=r(2),h=n(v),p=1073741824,b=0,w={},y=t.cachedImages=[];t.default={imageCache:w,cachedImages:y,setMaximumSizeBytes:a,putImagePromise:i,getImagePromise:l,removeImagePromise:u,getCacheInfo:d,purgeCache:f,changeImageIdCacheSize:c}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e.color&&!e.falseColor)throw new Error("Color transforms are not implemented yet");var r=e.minPixelValue,n=0,o=0,i=e.width*e.height,l=e.origPixelData||e.getPixelData(),u=new Uint8Array(4*i),d=void 0,s=void 0;if(e.color=!0,e.falseColor=!0,e.origPixelData=l,t instanceof a.default.LookupTable)for(t.build();o>r,o=e.lut[e.lut.length-1]>>r,i=e.firstValueMapped+e.lut.length-1;return function(t){return t=i?o:e.lut[t-e.firstValueMapped]>>r}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return r?o(r):a(e,t)}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=r(5),o=n(a),i=r(9),l=n(i),u=r(6),d=n(u),s=r(17),f=n(s),c=r(18),m=n(c),g=r(29),v=n(g),h=r(19),p=n(h),b=r(20),w=n(b),y=r(21),I=n(y),_=r(10),P=n(_),C=r(22),E=n(C),T=r(30);t.default={drawImage:o.default,generateLut:l.default,getDefaultViewport:d.default,requestAnimationFrame:f.default,storedPixelDataToCanvasImageData:m.default,storedPixelDataToCanvasImageDataRGBA:v.default,storedPixelDataToCanvasImageDataColorLUT:w.default,storedPixelDataToCanvasImageDataPseudocolorLUT:I.default,storedColorPixelDataToCanvasImageData:p.default,getTransform:P.default,calculateTransform:E.default,Transform:T.Transform}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return!e&&!t||!(!e||!t)&&e.id===t.id}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){var n=(0,a.default)(),o=e.getPixelData();e.stats.lastGetPixelDataTime=(0,a.default)()-n;var i=e.minPixelValue,l=0,u=0,d=o.length;if(n=(0,a.default)(),i<0)for(;u=0&&(t="u"+t),e.maxPixelValue>255?t+="16":t+="8",t}function c(e){var t=f(e);return w.shaders.hasOwnProperty(t)?w.shaders[t]:w.shaders.rgb}function m(e){var t={uint8:T.LUMINANCE,int8:T.LUMINANCE_ALPHA,uint16:T.LUMINANCE_ALPHA,int16:T.RGB,rgb:T.RGB},r={int8:1,uint16:2,int16:3,rgb:3},n=f(e),a=t[n],o=T.createTexture();T.bindTexture(T.TEXTURE_2D,o),T.texParameteri(T.TEXTURE_2D,T.TEXTURE_MIN_FILTER,T.NEAREST),T.texParameteri(T.TEXTURE_2D,T.TEXTURE_MAG_FILTER,T.NEAREST),T.texParameteri(T.TEXTURE_2D,T.TEXTURE_WRAP_S,T.CLAMP_TO_EDGE),T.texParameteri(T.TEXTURE_2D,T.TEXTURE_WRAP_T,T.CLAMP_TO_EDGE),T.pixelStorei(T.UNPACK_ALIGNMENT,1);var i=w.dataUtilities[n].storedPixelDataToImageData(e,e.width,e.height);return T.texImage2D(T.TEXTURE_2D,0,a,e.width,e.height,0,a,T.UNSIGNED_BYTE,i),{texture:o,sizeInBytes:e.width*e.height*r[n]}}function g(e){var t=_.default.getImageTexture(e.imageId);return t||(t=m(e),_.default.putImageTexture(e,t)),t.texture}function v(){L=T.createBuffer(),T.bindBuffer(T.ARRAY_BUFFER,L),T.bufferData(T.ARRAY_BUFFER,new Float32Array([1,1,0,1,1,0,0,0]),T.STATIC_DRAW),x=T.createBuffer(),T.bindBuffer(T.ARRAY_BUFFER,x),T.bufferData(T.ARRAY_BUFFER,new Float32Array([1,1,0,1,1,0,0,0]),T.STATIC_DRAW)}function h(e,t,r,n,a){T.clearColor(1,0,0,1),T.viewport(0,0,n,a),T.clear(T.COLOR_BUFFER_BIT|T.DEPTH_BUFFER_BIT),T.useProgram(e.program),T.bindBuffer(T.ARRAY_BUFFER,x),T.vertexAttribPointer(e.attributes.texCoordLocation,2,T.FLOAT,!1,0,0),T.bindBuffer(T.ARRAY_BUFFER,L),T.vertexAttribPointer(e.attributes.positionLocation,2,T.FLOAT,!1,0,0);for(var o in t){var i=T.getUniformLocation(e.program,o);if(i){var u=t[o],d=u.type,s=u.value;"i"===d?T.uniform1i(i,s):"f"===d?T.uniform1f(i,s):"2f"===d&&T.uniform2f(i,s[0],s[1])}}l(T,n,a),T.activeTexture(T.TEXTURE0),T.bindTexture(T.TEXTURE_2D,r),T.drawArrays(T.TRIANGLE_STRIP,0,4)}function p(e){var t=e.image;E.width=t.width,E.height=t.height;var r=e.viewport,n=c(t),a=g(t);return h(n,{u_resolution:{type:"2f",value:[t.width,t.height]},wc:{type:"f",value:r.voi.windowCenter},ww:{type:"f",value:r.voi.windowWidth},slope:{type:"f",value:t.slope},intercept:{type:"f",value:t.intercept},minPixelValue:{type:"f",value:t.minPixelValue},invert:{type:"i",value:r.invert?1:0}},a,t.width,t.height),E}function b(){var e={failIfMajorPerformanceCaveat:!0};try{var t=document.createElement("canvas");return Boolean(window.WebGLRenderingContext)&&(t.getContext("webgl",e)||t.getContext("experimental-webgl",e))}catch(e){return!1}}Object.defineProperty(t,"__esModule",{value:!0}),t.isWebGLInitialized=void 0,t.getRenderCanvas=a,t.initRenderer=i,t.render=p,t.isWebGLAvailable=b;var w=r(47),y=r(53),I=r(32),_=n(I),P=r(34),C=n(P),E=document.createElement("canvas"),T=void 0,x=void 0,L=void 0,M=!1;t.isWebGLInitialized=M},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dataUtilities=t.shaders=void 0;var n=r(48),a=r(49),o=r(50),i=r(51),l=r(52),u={int16:n.int16Shader,int8:a.int8Shader,rgb:o.rgbShader,uint16:i.uint16Shader,uint8:l.uint8Shader},d={int16:n.int16DataUtilities,int8:a.int8DataUtilities,rgb:o.rgbDataUtilities,uint16:i.uint16DataUtilities,uint8:l.uint8DataUtilities};t.shaders=u,t.dataUtilities=d},function(e,t,r){"use strict";function n(e){for(var t=e.getPixelData(),r=new Uint8Array(e.width*e.height*3),n=0,a=0;a>8,r[n++]=t[a]<0?0:1}return r}Object.defineProperty(t,"__esModule",{value:!0});var a={};t.int16DataUtilities={storedPixelDataToImageData:n};a.frag="precision mediump float;uniform sampler2D u_image;uniform float ww;uniform float wc;uniform float slope;uniform float intercept;uniform int invert;varying vec2 v_texCoord;void main() {vec4 color = texture2D(u_image, v_texCoord);float intensity = color.r*256.0 + color.g*65536.0;if (color.b == 0.0)intensity = -intensity;intensity = intensity * slope + intercept;float center0 = wc - 0.5;float width0 = max(ww, 1.0);intensity = (intensity - center0) / width0 + 0.5;intensity = clamp(intensity, 0.0, 1.0);gl_FragColor = vec4(intensity, intensity, intensity, 1.0);if (invert == 1)gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;}",t.int16Shader=a},function(e,t,r){"use strict";function n(e){for(var t=e.getPixelData(),r=new Uint8Array(e.width*e.height*2),n=0,a=0;a>8}return r}Object.defineProperty(t,"__esModule",{value:!0});var a={};t.uint16DataUtilities={storedPixelDataToImageData:n};a.frag="precision mediump float;uniform sampler2D u_image;uniform float ww;uniform float wc;uniform float slope;uniform float intercept;uniform int invert;varying vec2 v_texCoord;void main() {vec4 color = texture2D(u_image, v_texCoord);float intensity = color.r*256.0 + color.a*65536.0;intensity = intensity * slope + intercept;float center0 = wc - 0.5;float width0 = max(ww, 1.0);intensity = (intensity - center0) / width0 + 0.5;intensity = clamp(intensity, 0.0, 1.0);gl_FragColor = vec4(intensity, intensity, intensity, 1.0);if (invert == 1)gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;}",t.uint16Shader=a},function(e,t,r){"use strict";function n(e){return e.getPixelData()}Object.defineProperty(t,"__esModule",{value:!0});var a={};t.uint8DataUtilities={storedPixelDataToImageData:n};a.frag="precision mediump float;uniform sampler2D u_image;uniform float ww;uniform float wc;uniform float slope;uniform float intercept;uniform int invert;varying vec2 v_texCoord;void main() {vec4 color = texture2D(u_image, v_texCoord);float intensity = color.r*256.0;intensity = intensity * slope + intercept;float center0 = wc - 0.5;float width0 = max(ww, 1.0);intensity = (intensity - center0) / width0 + 0.5;intensity = clamp(intensity, 0.0, 1.0);gl_FragColor = vec4(intensity, intensity, intensity, 1.0);if (invert == 1)gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;}",t.uint8Shader=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.vertexShader="attribute vec2 a_position;attribute vec2 a_texCoord;uniform vec2 u_resolution;varying vec2 v_texCoord;void main() {vec2 zeroToOne = a_position / u_resolution;vec2 zeroToTwo = zeroToOne * 2.0;vec2 clipSpace = zeroToTwo - 1.0;gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);v_texCoord = a_texCoord;}"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=(0,n.getEnabledElement)(e),a=(0,o.default)(r);return a.invert(),a.transformPoint(t.x,t.y)};var n=r(0),a=r(10),o=function(e){return e&&e.__esModule?e:{default:e}}(a)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(void 0===e)throw new Error("disable: element must not be undefined");for(var t=(0,n.getEnabledElements)(),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,r=void 0;for(r=0;ra?r:a;return{minPixelValue:t,maxPixelValue:r}}function a(e){if(e.restore)return e.restore;var t=e.color,r=e.rgba,n=e.cachedLut,a=e.slope,o=e.windowWidth,i=e.windowCenter,l=e.minPixelValue,u=e.maxPixelValue;return function(){if(e.color=t,e.rgba=r,e.cachedLut=n,e.slope=a,e.windowWidth=o,e.windowCenter=i,e.minPixelValue=l,e.maxPixelValue=u,e.origPixelData){var d=e.origPixelData;e.getPixelData=function(){return d}}e.origPixelData=void 0,e.colormapId=void 0,e.falseColor=void 0}}function o(e){return e&&"string"==typeof e&&(e=(0,c.getColormap)(e)),e}function i(e){return!(!e.restore||"function"!=typeof e.restore)&&(e.restore(),!0)}function l(e,t){if(e.color&&!e.falseColor)throw new Error("Color transforms are not implemented yet");t=o(t);var r=t.getId();if(e.colormapId===r)return!1;if(i(e),r){var l=e.minPixelValue||0,u=e.maxPixelValue||255;e.restore=a(e);var d=t.createLookupTable();d.setTableRange(l,u),(0,f.default)(e,d);var s=n(e.getPixelData());e.minPixelValue=s.minPixelValue,e.maxPixelValue=s.maxPixelValue,e.windowWidth=255,e.windowCenter=128,e.colormapId=r}return!0}function u(e,t){return l((0,d.getEnabledElement)(e).image,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.restoreImage=t.convertToFalseColorImage=t.convertImageToFalseColorImage=void 0;var d=r(0),s=r(40),f=function(e){return e&&e.__esModule?e:{default:e}}(s),c=r(27);t.convertImageToFalseColorImage=l,t.convertToFalseColorImage=u,t.restoreImage=i}])}); +/*! cornerstone-core - 2.0.0 - 2017-12-08 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstone */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstone-core",[],t):"object"==typeof exports?exports["cornerstone-core"]=t():e.cornerstone=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=41)}([function(e,t,r){"use strict";function n(e){if(void 0===e)throw new Error("getEnabledElement: parameter element must not be undefined");for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:null,n=void 0;return"function"==typeof window.CustomEvent?n=new CustomEvent(t,{detail:r,cancelable:!0}):(n=document.createEvent("CustomEvent"),n.initCustomEvent(t,!0,!0,r)),e.dispatchEvent(n)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){if(void 0===e)throw new Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw new Error("setToPixelCoordinateSystem: parameter context must not be undefined");var n=(0,a.default)(e,r);t.setTransform(n.m[0],n.m[1],n.m[2],n.m[3],n.m[4],n.m[5])};var n=r(22),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=(0,n.getEnabledElement)(e);if(void 0===r.image&&!r.layers.length)throw new Error("updateImage: image has not been loaded yet");(0,o.default)(r,t)};var n=r(0),a=r(5),o=function(e){return e&&e.__esModule?e:{default:e}}(a)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e.needsRedraw=!0,t&&(e.invalid=!0)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(void 0===e)throw new Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return{scale:1,translation:{x:0,y:0},voi:{windowWidth:void 0,windowCenter:void 0},invert:!1,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:void 0,voiLUT:void 0,colormap:void 0,labelmap:!1};var r=e.height/t.rows,n=e.width/t.columns;return{scale:Math.min(n,r),translation:{x:0,y:0},voi:{windowWidth:t.windowWidth,windowCenter:t.windowCenter},invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,voiLUT:t.voiLUT,colormap:t.colormap,labelmap:Boolean(t.labelmap)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(28),a=r(29),o=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default={getColormap:n.getColormap,getColormapsList:n.getColormapsList,LookupTable:o.default}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&e.cachedLut.invert===t.invert?e.cachedLut.lutArray:((0,f.default)(e,t.voi.windowWidth,t.voi.windowCenter,t.invert),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.lutArray)}function o(e,t,r){e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=document.createElement("canvas"));var n=e.renderingTools.renderCanvas;if(255===e.viewport.voi.windowWidth&&128===e.viewport.voi.windowCenter&&!1===e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!1===(0,I.default)(e,t)&&!0!==r)return n;n.width===t.width&&n.height===t.height||(0,P.default)(e,t);var o=(0,d.default)(),i=a(t,e.viewport);t.stats=t.stats||{},t.stats.lastLutGenerateTime=(0,d.default)()-o;var l=e.renderingTools.renderCanvasData,u=e.renderingTools.renderCanvasContext;return t.rgba?(0,v.default)(t,i,l.data):(0,m.default)(t,i,l.data),o=(0,d.default)(),u.putImageData(l,0,0),t.stats.lastPutImageDataTime=(0,d.default)()-o,n}function i(e,t){if(void 0===e)throw new Error("renderColorImage: enabledElement parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("renderColorImage: image must be loaded before it can be drawn");var n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,(0,p.default)(e,n);var a=void 0;a=e.options&&e.options.renderer&&"webgl"===e.options.renderer.toLowerCase()?w.default.renderer.render(e):o(e,r,t),n.drawImage(a,0,0,r.width,r.height,0,0,r.width,r.height),e.renderingTools=(0,E.default)(e)}function l(e,t){if(void 0===e)throw new Error("addColorLayer: layer parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("addColorLayer: image must be loaded before it can be drawn");r.rgba=!0,e.canvas=o(e,r,t);var n=e.canvas.getContext("2d");n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,e.renderingTools=(0,E.default)(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderColorImage=i,t.addColorLayer=l;var u=r(1),d=n(u),s=r(44),f=n(s),c=r(19),m=n(c),g=r(45),v=n(g),h=r(3),p=n(h),b=r(13),w=n(b),y=r(12),I=n(y),_=r(10),P=n(_),C=r(11),E=n(C)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,a.default)(e)};var n=r(22),a=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;var n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);var a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.image.imageId,r=e.viewport;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=r(46),o=r(34),i=n(o),l=r(33),u=n(l),d={createProgramFromString:i.default,renderer:{render:a.render,initRenderer:a.initRenderer,getRenderCanvas:a.getRenderCanvas,isWebGLAvailable:a.isWebGLAvailable},textureCache:u.default};Object.defineProperty(d,"isWebGLInitialized",{enumerable:!0,configurable:!1,get:function(){return a.isWebGLInitialized}}),t.default=d},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var r=0;r3&&void 0!==arguments[3])||arguments[3];e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=document.createElement("canvas"));var a=e.renderingTools.renderCanvas;if(!1===(0,y.default)(e,t)&&!0!==r)return a;a.width===t.width&&a.height===t.height||(0,_.default)(e,t);var o=(0,g.default)(),i=(0,b.default)(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=(0,g.default)()-o;var l=e.renderingTools.renderCanvasData,d=e.renderingTools.renderCanvasContext;return n?(0,u.default)(t,i,l.data):(0,s.default)(t,i,l.data),o=(0,g.default)(),d.putImageData(l,0,0),t.stats.lastPutImageDataTime=(0,g.default)()-o,a}function o(e,t){if(void 0===e)throw new Error("drawImage: enabledElement parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("drawImage: image must be loaded before it can be drawn");var n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,(0,c.default)(e,n);var o=void 0;o=e.options&&e.options.renderer&&"webgl"===e.options.renderer.toLowerCase()?h.default.renderer.render(e):a(e,r,t),n.drawImage(o,0,0,r.width,r.height,0,0,r.width,r.height),e.renderingTools=(0,C.default)(e)}function i(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(void 0===e)throw new Error("addGrayscaleLayer: layer parameter must not be undefined");var n=e.image;if(void 0===n)throw new Error("addGrayscaleLayer: image must be loaded before it can be drawn");e.canvas=a(e,n,t,r);var o=e.canvas.getContext("2d");o.imageSmoothingEnabled=!e.viewport.pixelReplication,o.mozImageSmoothingEnabled=o.imageSmoothingEnabled,e.renderingTools=(0,C.default)(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderGrayscaleImage=o,t.addGrayscaleLayer=i;var l=r(18),u=n(l),d=r(30),s=n(d),f=r(3),c=n(f),m=r(1),g=n(m),v=r(13),h=n(v),p=r(32),b=n(p),w=r(12),y=n(w),I=r(10),_=n(I),P=r(11),C=n(P)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,n,a,i){var u=e.maxPixelValue,d=e.minPixelValue,s=Math.min(d,0);if(void 0===e.cachedLut){var f=u-s+1;e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(f)}var c=e.cachedLut.lutArray,m=(0,o.default)(e.slope,e.intercept,a),g=(0,l.default)(t,r,i);if(!0===n)for(var v=d;v<=u;v++)c[v+-s]=255-g(m(v));else for(var h=d;h<=u;h++)c[h+-s]=g(m(h));return c};var a=r(26),o=n(a),i=r(27),l=n(i)},function(e,t,r){"use strict";function n(e){window.setTimeout(e,1e3/60)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return window.requestAnimationFrame(e)||window.webkitRequestAnimationFrame(e)||window.mozRequestAnimationFrame(e)||window.oRequestAnimationFrame(e)||window.msRequestAnimationFrame(e)||n(e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){var n=(0,a.default)(),o=e.getPixelData();e.stats.lastGetPixelDataTime=(0,a.default)()-n;var i=o.length,l=e.minPixelValue,u=3,d=0;if(n=(0,a.default)(),o instanceof Int16Array)if(l<0)for(;d=n?r:e.lut[a]}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return r?a(r):n(e,t)}},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t>r,o=e.lut[e.lut.length-1]>>r,i=e.firstValueMapped+e.lut.length-1;return function(t){return t=i?o:e.lut[t-e.firstValueMapped]>>r}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return r?o(r):a(e,t)}},function(e,t,r){"use strict";function n(e,t,r){r=null===r?100:r;for(var n=(t-e)/(r-1),a=[];r-- >0;)a.push(e),e+=n;return a[a.length-1]=t,a}function a(e,t){for(var r=0,n=e.length-1;r<=n;){var a=r+Math.floor((n-r)/2),o=e[a];if(o===t)return a;t=0&&e1)throw new Error("HSVToRGB expects hue < 1");var n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;var a=Math.floor(6*e),o=6*e-a,i=r*(1-t),l=r*(1-t*o),u=r*(1-t*(1-o));switch(a){case 0:case 6:n[0]=r,n[1]=u,n[2]=i;break;case 1:n[0]=l,n[1]=r,n[2]=i;break;case 2:n[0]=i,n[1]=r,n[2]=u;break;case 3:n[0]=i,n[1]=l,n[2]=r;break;case 4:n[0]=u,n[1]=i,n[2]=r;break;case 5:n[0]=r,n[1]=i,n[2]=l}return n}function o(e,t){var r=void 0;return r=et.Range[1]?t.MaxIndex+u+1.5:(e+t.Shift)*t.Scale,Math.floor(r)}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r1)||e){this.Table=[];var t=this.NumberOfColors-1,r=void 0,n=void 0,o=void 0,i=void 0;t?(r=(this.HueRange[1]-this.HueRange[0])/t,n=(this.SaturationRange[1]-this.SaturationRange[0])/t,o=(this.ValueRange[1]-this.ValueRange[0])/t,i=(this.AlphaRange[1]-this.AlphaRange[0])/t):r=n=o=i=0;for(var l=0;l<=t;l++){var u=this.HueRange[0]+l*r,d=this.SaturationRange[0]+l*n,s=this.ValueRange[0]+l*o,f=this.AlphaRange[0]+l*i,c=a(u,d,s),m=[];switch(this.Ramp){case"scurve":m[0]=Math.floor(127.5*(1+Math.cos((1-c[0])*Math.PI))),m[1]=Math.floor(127.5*(1+Math.cos((1-c[1])*Math.PI))),m[2]=Math.floor(127.5*(1+Math.cos((1-c[2])*Math.PI))),m[3]=Math.floor(255*f);break;case"linear":m[0]=Math.floor(255*c[0]+.5),m[1]=Math.floor(255*c[1]+.5),m[2]=Math.floor(255*c[2]+.5),m[3]=Math.floor(255*f+.5);break;case"sqrt":m[0]=Math.floor(255*Math.sqrt(c[0])+.5),m[1]=Math.floor(255*Math.sqrt(c[1])+.5),m[2]=Math.floor(255*Math.sqrt(c[2])+.5),m[3]=Math.floor(255*Math.sqrt(f)+.5);break;default:throw new Error("Invalid Ramp value ("+this.Ramp+")")}this.Table.push(m)}this.buildSpecialColors()}}},{key:"buildSpecialColors",value:function(){var e=this.NumberOfColors,t=e+l,r=e+u,n=e+2;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[n]=this.NaNColor}},{key:"mapValue",value:function(e){var t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&ethis.TableRange[1])return this.AboveRangeColor;return this.Table[t]}},{key:"getIndex",value:function(e){var t={};if(t.Range=[],t.MaxIndex=this.NumberOfColors-1,t.Shift=-this.TableRange[0],this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return-1;var r=o(e,t);return r===this.NumberOfColors+l?r=0:r===this.NumberOfColors+u&&(r=this.NumberOfColors-1),r}},{key:"setTableValue",value:function(e,t){if(5===arguments.length&&(t=Array.prototype.slice.call(arguments,1)),e<0)throw new Error("Can't set the table value for negative index ("+e+")");e>=this.NumberOfColors&&new Error("Index "+e+" is greater than the number of colors "+this.NumberOfColors),this.Table[e]=t,0!==e&&e!==this.NumberOfColors-1||this.buildSpecialColors()}}]),e}();t.default=d},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){var n=(0,a.default)(),o=e.getPixelData();e.stats.lastGetPixelDataTime=(0,a.default)()-n;var i=o.length,l=e.minPixelValue,u=0,d=0,s=void 0;if(n=(0,a.default)(),o instanceof Int16Array)if(l<0)for(;dt.timeStamp?-1:e.timeStampp;){var t=h[h.length-1];b-=t.sizeInBytes,delete v[t.imageId],h.pop(),(0,g.default)(c.default,"cornerstonewebgltextureremoved",{imageId:t.imageId})}var r=a();(0,g.default)(c.default,"cornerstonewebgltexturecachefull",r)}}function i(e){if(void 0===e)throw new Error("setMaximumSizeBytes: parameter numBytes must not be undefined");if(void 0===e.toFixed)throw new Error("setMaximumSizeBytes: parameter numBytes must be a number");p=e,o()}function l(e,t){var r=e.imageId;if(void 0===e)throw new Error("putImageTexture: image must not be undefined");if(void 0===r)throw new Error("putImageTexture: imageId must not be undefined");if(void 0===t)throw new Error("putImageTexture: imageTexture must not be undefined");if(!0===Object.prototype.hasOwnProperty.call(v,r))throw new Error("putImageTexture: imageId already in cache");var n={imageId:r,imageTexture:t,timeStamp:new Date,sizeInBytes:t.sizeInBytes};if(v[r]=n,h.push(n),void 0===t.sizeInBytes)throw new Error("putImageTexture: imageTexture.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw new Error("putImageTexture: imageTexture.sizeInBytes is not a number");b+=n.sizeInBytes,o()}function u(e){if(void 0===e)throw new Error("getImageTexture: imageId must not be undefined");var t=v[e];if(void 0!==t)return t.timeStamp=new Date,t.imageTexture}function d(e){if(void 0===e)throw new Error("removeImageTexture: imageId must not be undefined");var t=v[e];if(void 0===t)throw new Error("removeImageTexture: imageId must not be undefined");return h.splice(h.indexOf(t),1),b-=t.sizeInBytes,delete v[e],t.imageTexture}function s(){for(;h.length>0;){var e=h.pop();delete v[e.imageId]}b=0}Object.defineProperty(t,"__esModule",{value:!0});var f=r(14),c=n(f),m=r(2),g=n(m),v={},h=[],p=268435456,b=0;t.default={purgeCache:s,getImageTexture:u,putImageTexture:l,removeImageTexture:d,setMaximumSizeBytes:i}},function(e,t,r){"use strict";function n(e,t,r){var n=e.createShader(r);if(e.shaderSource(n,t),e.compileShader(n),!e.getShaderParameter(n,e.COMPILE_STATUS)&&!e.isContextLost()){var a=e.getShaderInfoLog(n);console.error("Could not compile shader:\n"+a)}return n}function a(e,t,r){var n=e.createProgram();if(e.attachShader(n,t),e.attachShader(n,r),e.linkProgram(n),!e.getProgramParameter(n,e.LINK_STATUS)&&!e.isContextLost()){var a=e.getProgramInfoLog(n);console.error("WebGL program filed to link:\n"+a)}return n}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return a(e,n(e,t,e.VERTEX_SHADER),n(e,r,e.FRAGMENT_SHADER))}},function(e,t,r){"use strict";function n(e,t){if(void 0===e)throw new Error("renderWebImage: enabledElement parameter must not be undefined");var r=e.image;if(void 0===r)throw new Error("renderWebImage: image must be loaded before it can be drawn");if(e.viewport.voi.windowWidth===e.image.windowWidth&&e.viewport.voi.windowCenter===e.image.windowCenter&&!1===e.viewport.invert){var n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,n.mozImageSmoothingEnabled=n.imageSmoothingEnabled,(0,o.default)(e,n),n.drawImage(r.getImage(),0,0,r.width,r.height,0,0,r.width,r.height)}else(0,i.renderColorImage)(e,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderWebImage=n;var a=r(3),o=function(e){return e&&e.__esModule?e:{default:e}}(a),i=r(8)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e,t){t.width!==e.clientWidth&&(t.width=e.clientWidth,t.style.width=e.clientWidth+"px"),t.height!==e.clientHeight&&(t.height=e.clientHeight,t.style.height=e.clientHeight+"px")}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=(0,o.getEnabledElement)(e);a(e,r.canvas);var n={element:e};(0,f.default)(e,"cornerstoneelementresized",n),void 0!==r.image&&(!0===t?(0,l.default)(e):(0,d.default)(e))};var o=r(0),i=r(37),l=n(i),u=r(4),d=n(u),s=r(2),f=n(s)},function(e,t,r){"use strict";function n(e){return 0===e.viewport.rotation||180===e.viewport.rotation?{width:e.image.width,height:e.image.height}:{width:e.image.height,height:e.image.width}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=(0,a.getEnabledElement)(e),r=n(t),o=t.canvas.height/r.height,l=t.canvas.width/r.width;t.viewport.scale=Math.min(l,o),t.viewport.translation.x=0,t.viewport.translation.y=0,(0,i.default)(e)};var a=r(0),o=r(4),i=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,a,o){if(void 0===e)throw new Error("getStoredPixels: parameter element must not be undefined");t=Math.round(t),r=Math.round(r);for(var i=(0,n.getEnabledElement)(e),l=[],u=0,d=i.image.getPixelData(),s=0;st.timeStamp?-1:e.timeStampp;){var t=y[y.length-1],r=t.imageId;u(r),(0,h.default)(g.default,"cornerstoneimagecachepromiseremoved",{imageId:r})}var n=d();(0,h.default)(g.default,"cornerstoneimagecachefull",n)}}function i(e,t){if(void 0===e)throw new Error("putImageLoadObject: imageId must not be undefined");if(void 0===t.promise)throw new Error("putImageLoadObject: imageLoadObject.promise must not be undefined");if(!0===w.hasOwnProperty(e))throw new Error("putImageLoadObject: imageId already in cache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw new Error("putImageLoadObject: imageLoadObject.cancelFn must be a function");var r={loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};w[e]=r,y.push(r),t.promise.then(function(e){if(-1!==y.indexOf(r)){if(r.loaded=!0,r.image=e,void 0===e.sizeInBytes)throw new Error("putImageLoadObject: image.sizeInBytes must not be undefined");if(void 0===e.sizeInBytes.toFixed)throw new Error("putImageLoadObject: image.sizeInBytes is not a number");r.sizeInBytes=e.sizeInBytes,b+=r.sizeInBytes;var t={action:"addImage",image:r};(0,h.default)(g.default,"cornerstoneimagecachechanged",t),r.sharedCacheKey=e.sharedCacheKey,o()}},function(){var t=w[e];y.splice(y.indexOf(t),1),delete w[e]})}function l(e){if(void 0===e)throw new Error("getImageLoadObject: imageId must not be undefined");var t=w[e];if(void 0!==t)return t.timeStamp=Date.now(),t.imageLoadObject}function u(e){if(void 0===e)throw new Error("removeImageLoadObject: imageId must not be undefined");var t=w[e];if(void 0===t)throw new Error("removeImageLoadObject: imageId was not present in imageCache");y.splice(y.indexOf(t),1),b-=t.sizeInBytes;var r={action:"deleteImage",image:t};(0,h.default)(g.default,"cornerstoneimagecachechanged",r),s(t.imageLoadObject.promise),delete w[e]}function d(){return{maximumSizeInBytes:p,cacheSizeInBytes:b,numberOfImagesCached:y.length}}function s(e){e.then(function(e){e.decache&&e.decache()})}function f(){for(;y.length>0;){u(y[0].imageId)}}function c(e,t){var r=w[e];r&&r.imageLoadObject.promise.then(function(e){var n=t-e.sizeInBytes;e.sizeInBytes=t,r.sizeInBytes=t,b+=n;var a={action:"changeImageSize",image:e};(0,h.default)(g.default,"cornerstoneimagecachechanged",a)})}Object.defineProperty(t,"__esModule",{value:!0}),t.cachedImages=void 0,t.setMaximumSizeBytes=a,t.putImageLoadObject=i,t.getImageLoadObject=l,t.removeImageLoadObject=u,t.getCacheInfo=d,t.purgeCache=f,t.changeImageIdCacheSize=c;var m=r(14),g=n(m),v=r(2),h=n(v),p=1073741824,b=0,w={},y=t.cachedImages=[];t.default={imageCache:w,cachedImages:y,setMaximumSizeBytes:a,putImageLoadObject:i,getImageLoadObject:l,removeImageLoadObject:u,getCacheInfo:d,purgeCache:f,changeImageIdCacheSize:c}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e.color&&!e.falseColor)throw new Error("Color transforms are not implemented yet");var r=e.minPixelValue,n=0,o=0,i=e.width*e.height,l=e.origPixelData||e.getPixelData(),u=new Uint8Array(4*i),d=void 0,s=void 0;if(e.color=!0,e.falseColor=!0,e.origPixelData=l,t instanceof a.default.LookupTable)for(t.build();o=0&&(t="u"+t),e.maxPixelValue>255?t+="16":t+="8",t}function c(e){var t=f(e);return w.shaders.hasOwnProperty(t)?w.shaders[t]:w.shaders.rgb}function m(e){var t={uint8:x.LUMINANCE,int8:x.LUMINANCE_ALPHA,uint16:x.LUMINANCE_ALPHA,int16:x.RGB,rgb:x.RGB},r={int8:1,uint16:2,int16:3,rgb:3},n=f(e),a=t[n],o=x.createTexture();x.bindTexture(x.TEXTURE_2D,o),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_MIN_FILTER,x.NEAREST),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_MAG_FILTER,x.NEAREST),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_WRAP_S,x.CLAMP_TO_EDGE),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_WRAP_T,x.CLAMP_TO_EDGE),x.pixelStorei(x.UNPACK_ALIGNMENT,1);var i=w.dataUtilities[n].storedPixelDataToImageData(e,e.width,e.height);return x.texImage2D(x.TEXTURE_2D,0,a,e.width,e.height,0,a,x.UNSIGNED_BYTE,i),{texture:o,sizeInBytes:e.width*e.height*r[n]}}function g(e){var t=_.default.getImageTexture(e.imageId);return t||(t=m(e),_.default.putImageTexture(e,t)),t.texture}function v(){L=x.createBuffer(),x.bindBuffer(x.ARRAY_BUFFER,L),x.bufferData(x.ARRAY_BUFFER,new Float32Array([1,1,0,1,1,0,0,0]),x.STATIC_DRAW),T=x.createBuffer(),x.bindBuffer(x.ARRAY_BUFFER,T),x.bufferData(x.ARRAY_BUFFER,new Float32Array([1,1,0,1,1,0,0,0]),x.STATIC_DRAW)}function h(e,t,r,n,a){x.clearColor(1,0,0,1),x.viewport(0,0,n,a),x.clear(x.COLOR_BUFFER_BIT|x.DEPTH_BUFFER_BIT),x.useProgram(e.program),x.bindBuffer(x.ARRAY_BUFFER,T),x.vertexAttribPointer(e.attributes.texCoordLocation,2,x.FLOAT,!1,0,0),x.bindBuffer(x.ARRAY_BUFFER,L),x.vertexAttribPointer(e.attributes.positionLocation,2,x.FLOAT,!1,0,0);for(var o in t){var i=x.getUniformLocation(e.program,o);if(i){var u=t[o],d=u.type,s=u.value;"i"===d?x.uniform1i(i,s):"f"===d?x.uniform1f(i,s):"2f"===d&&x.uniform2f(i,s[0],s[1])}}l(x,n,a),x.activeTexture(x.TEXTURE0),x.bindTexture(x.TEXTURE_2D,r),x.drawArrays(x.TRIANGLE_STRIP,0,4)}function p(e){var t=e.image;E.width=t.width,E.height=t.height;var r=e.viewport,n=c(t),a=g(t);return h(n,{u_resolution:{type:"2f",value:[t.width,t.height]},wc:{type:"f",value:r.voi.windowCenter},ww:{type:"f",value:r.voi.windowWidth},slope:{type:"f",value:t.slope},intercept:{type:"f",value:t.intercept},minPixelValue:{type:"f",value:t.minPixelValue},invert:{type:"i",value:r.invert?1:0}},a,t.width,t.height),E}function b(){var e={failIfMajorPerformanceCaveat:!0};try{var t=document.createElement("canvas");return Boolean(window.WebGLRenderingContext)&&(t.getContext("webgl",e)||t.getContext("experimental-webgl",e))}catch(e){return!1}}Object.defineProperty(t,"__esModule",{value:!0}),t.isWebGLInitialized=void 0,t.getRenderCanvas=a,t.initRenderer=i,t.render=p,t.isWebGLAvailable=b;var w=r(47),y=r(53),I=r(33),_=n(I),P=r(34),C=n(P),E=document.createElement("canvas"),x=void 0,T=void 0,L=void 0,O=!1;t.isWebGLInitialized=O},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dataUtilities=t.shaders=void 0;var n=r(48),a=r(49),o=r(50),i=r(51),l=r(52),u={int16:n.int16Shader,int8:a.int8Shader,rgb:o.rgbShader,uint16:i.uint16Shader,uint8:l.uint8Shader},d={int16:n.int16DataUtilities,int8:a.int8DataUtilities,rgb:o.rgbDataUtilities,uint16:i.uint16DataUtilities,uint8:l.uint8DataUtilities};t.shaders=u,t.dataUtilities=d},function(e,t,r){"use strict";function n(e){for(var t=e.getPixelData(),r=new Uint8Array(e.width*e.height*3),n=0,a=0;a>8,r[n++]=t[a]<0?0:1}return r}Object.defineProperty(t,"__esModule",{value:!0});var a={};t.int16DataUtilities={storedPixelDataToImageData:n};a.frag="precision mediump float;uniform sampler2D u_image;uniform float ww;uniform float wc;uniform float slope;uniform float intercept;uniform int invert;varying vec2 v_texCoord;void main() {vec4 color = texture2D(u_image, v_texCoord);float intensity = color.r*256.0 + color.g*65536.0;if (color.b == 0.0)intensity = -intensity;intensity = intensity * slope + intercept;float center0 = wc - 0.5;float width0 = max(ww, 1.0);intensity = (intensity - center0) / width0 + 0.5;intensity = clamp(intensity, 0.0, 1.0);gl_FragColor = vec4(intensity, intensity, intensity, 1.0);if (invert == 1)gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;}",t.int16Shader=a},function(e,t,r){"use strict";function n(e){for(var t=e.getPixelData(),r=new Uint8Array(e.width*e.height*2),n=0,a=0;a>8}return r}Object.defineProperty(t,"__esModule",{value:!0});var a={};t.uint16DataUtilities={storedPixelDataToImageData:n};a.frag="precision mediump float;uniform sampler2D u_image;uniform float ww;uniform float wc;uniform float slope;uniform float intercept;uniform int invert;varying vec2 v_texCoord;void main() {vec4 color = texture2D(u_image, v_texCoord);float intensity = color.r*256.0 + color.a*65536.0;intensity = intensity * slope + intercept;float center0 = wc - 0.5;float width0 = max(ww, 1.0);intensity = (intensity - center0) / width0 + 0.5;intensity = clamp(intensity, 0.0, 1.0);gl_FragColor = vec4(intensity, intensity, intensity, 1.0);if (invert == 1)gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;}",t.uint16Shader=a},function(e,t,r){"use strict";function n(e){return e.getPixelData()}Object.defineProperty(t,"__esModule",{value:!0});var a={};t.uint8DataUtilities={storedPixelDataToImageData:n};a.frag="precision mediump float;uniform sampler2D u_image;uniform float ww;uniform float wc;uniform float slope;uniform float intercept;uniform int invert;varying vec2 v_texCoord;void main() {vec4 color = texture2D(u_image, v_texCoord);float intensity = color.r*256.0;intensity = intensity * slope + intercept;float center0 = wc - 0.5;float width0 = max(ww, 1.0);intensity = (intensity - center0) / width0 + 0.5;intensity = clamp(intensity, 0.0, 1.0);gl_FragColor = vec4(intensity, intensity, intensity, 1.0);if (invert == 1)gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;}",t.uint8Shader=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.vertexShader="attribute vec2 a_position;attribute vec2 a_texCoord;uniform vec2 u_resolution;varying vec2 v_texCoord;void main() {vec2 zeroToOne = a_position / u_resolution;vec2 zeroToTwo = zeroToOne * 2.0;vec2 clipSpace = zeroToTwo - 1.0;gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);v_texCoord = a_texCoord;}"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=(0,n.getEnabledElement)(e),a=(0,o.default)(r);return a.invert(),a.transformPoint(t.x,t.y)};var n=r(0),a=r(9),o=function(e){return e&&e.__esModule?e:{default:e}}(a)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(void 0===e)throw new Error("disable: element must not be undefined");for(var t=(0,n.getEnabledElements)(),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,r=void 0;for(r=0;ra?r:a;return{minPixelValue:t,maxPixelValue:r}}function a(e){if(e.restore)return e.restore;var t=e.color,r=e.rgba,n=e.cachedLut,a=e.slope,o=e.windowWidth,i=e.windowCenter,l=e.minPixelValue,u=e.maxPixelValue;return function(){if(e.color=t,e.rgba=r,e.cachedLut=n,e.slope=a,e.windowWidth=o,e.windowCenter=i,e.minPixelValue=l,e.maxPixelValue=u,e.origPixelData){var d=e.origPixelData;e.getPixelData=function(){return d}}e.origPixelData=void 0,e.colormapId=void 0,e.falseColor=void 0}}function o(e){return e&&"string"==typeof e&&(e=(0,c.getColormap)(e)),e}function i(e){return!(!e.restore||"function"!=typeof e.restore)&&(e.restore(),!0)}function l(e,t){if(e.color&&!e.falseColor)throw new Error("Color transforms are not implemented yet");t=o(t);var r=t.getId();if(e.colormapId===r)return!1;if(i(e),r){var l=e.minPixelValue||0,u=e.maxPixelValue||255;e.restore=a(e);var d=t.createLookupTable();d.setTableRange(l,u),(0,f.default)(e,d);var s=n(e.getPixelData());e.minPixelValue=s.minPixelValue,e.maxPixelValue=s.maxPixelValue,e.windowWidth=255,e.windowCenter=128,e.colormapId=r}return!0}function u(e,t){return l((0,d.getEnabledElement)(e).image,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.restoreImage=t.convertToFalseColorImage=t.convertImageToFalseColorImage=void 0;var d=r(0),s=r(40),f=function(e){return e&&e.__esModule?e:{default:e}}(s),c=r(28);t.convertImageToFalseColorImage=l,t.convertToFalseColorImage=u,t.restoreImage=i}])}); //# sourceMappingURL=cornerstone.min.js.map \ No newline at end of file diff --git a/examples/cornerstone.min.js.map b/examples/cornerstone.min.js.map index c60abbcc0..ea02d5268 100644 --- a/examples/cornerstone.min.js.map +++ b/examples/cornerstone.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///cornerstone.min.js","webpack:///webpack/bootstrap a7065d67f6c3f57512c2","webpack:///./enabledElements.js","webpack:///./internal/now.js","webpack:///./triggerEvent.js","webpack:///./setToPixelCoordinateSystem.js","webpack:///./updateImage.js","webpack:///./internal/drawImage.js","webpack:///./internal/getDefaultViewport.js","webpack:///./colors/index.js","webpack:///./rendering/renderColorImage.js","webpack:///./internal/generateLut.js","webpack:///./internal/getTransform.js","webpack:///./rendering/initializeRenderCanvas.js","webpack:///./rendering/saveLastRendered.js","webpack:///./rendering/doesImageNeedToBeRendered.js","webpack:///./webgl/index.js","webpack:///./events.js","webpack:///./rendering/renderGrayscaleImage.js","webpack:///./internal/requestAnimationFrame.js","webpack:///./internal/storedPixelDataToCanvasImageData.js","webpack:///./internal/storedColorPixelDataToCanvasImageData.js","webpack:///./internal/storedPixelDataToCanvasImageDataColorLUT.js","webpack:///./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","webpack:///./internal/calculateTransform.js","webpack:///./rendering/renderLabelMapImage.js","webpack:///./rendering/renderPseudoColorImage.js","webpack:///./layers.js","webpack:///./internal/getModalityLUT.js","webpack:///./colors/colormap.js","webpack:///./colors/lookupTable.js","webpack:///./internal/storedPixelDataToCanvasImageDataRGBA.js","webpack:///./internal/transform.js","webpack:///./rendering/getLut.js","webpack:///./webgl/textureCache.js","webpack:///./externalModules.js","webpack:///./webgl/createProgramFromString.js","webpack:///./rendering/renderWebImage.js","webpack:///./resize.js","webpack:///./fitToWindow.js","webpack:///./getStoredPixels.js","webpack:///./imageCache.js","webpack:///./pixelDataToFalseColorData.js","webpack:///./index.js","webpack:///./internal/getVOILut.js","webpack:///./internal/index.js","webpack:///./rendering/lutMatches.js","webpack:///./internal/storedRGBAPixelDataToCanvasImageData.js","webpack:///./webgl/renderer.js","webpack:///./webgl/shaders/index.js","webpack:///./webgl/shaders/int16.js","webpack:///./webgl/shaders/int8.js","webpack:///./webgl/shaders/rgb.js","webpack:///./webgl/shaders/uint16.js","webpack:///./webgl/shaders/uint8.js","webpack:///./webgl/vertexShader.js","webpack:///./canvasToPixel.js","webpack:///./disable.js","webpack:///./displayImage.js","webpack:///./internal/guid.js","webpack:///./draw.js","webpack:///./drawInvalidated.js","webpack:///./enable.js","webpack:///./internal/drawImageSync.js","webpack:///./internal/drawCompositeImage.js","webpack:///./enabledElementData.js","webpack:///./getDefaultViewportForImage.js","webpack:///./getImage.js","webpack:///./getPixels.js","webpack:///./getViewport.js","webpack:///./imageLoader.js","webpack:///./invalidate.js","webpack:///./invalidateImageId.js","webpack:///./pageToPixel.js","webpack:///./pixelToCanvas.js","webpack:///./reset.js","webpack:///./setViewport.js","webpack:///./rendering/index.js","webpack:///./metaData.js","webpack:///./falseColorMapping.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","getEnabledElement","element","undefined","Error","enabledElements","length","addEnabledElement","enabledElement","push","getEnabledElementsByImageId","imageId","ees","forEach","image","getEnabledElements","value","default","window","performance","now","Date","triggerEvent","el","type","detail","arguments","event","CustomEvent","toLocaleLowerCase","document","createEvent","initCustomEvent","_externalModules","external","$","trigger","dispatchEvent","context","scale","transform","_calculateTransform2","setTransform","_calculateTransform","obj","invalidated","_enabledElements","layers","_drawImage2","_drawImage","needsRedraw","invalid","canvas","translation","x","y","voi","windowWidth","windowCenter","invert","pixelReplication","rotation","hflip","vflip","modalityLUT","voiLUT","colormap","labelmap","verticalScale","height","rows","horizontalScale","width","columns","Math","min","Boolean","_colormap","_lookupTable","_lookupTable2","getColormap","getColormapsList","LookupTable","_interopRequireDefault","getLut","viewport","cachedLut","lutArray","_generateLut2","getRenderCanvas","renderingTools","renderCanvas","createElement","getCanvas","_doesImageNeedToBeRendered2","_initializeRenderCanvas2","start","_now2","colorLut","stats","lastLutGenerateTime","renderCanvasData","renderCanvasContext","rgba","_storedRGBAPixelDataToCanvasImageData2","data","_storedColorPixelDataToCanvasImageData2","putImageData","lastPutImageDataTime","renderColorImage","getContext","fillStyle","fillRect","imageSmoothingEnabled","mozImageSmoothingEnabled","_setToPixelCoordinateSystem2","options","renderer","toLowerCase","_index2","render","drawImage","_saveLastRendered2","addColorLayer","layer","_now","_generateLut","_storedColorPixelDataToCanvasImageData","_storedRGBAPixelDataToCanvasImageData","_setToPixelCoordinateSystem","_index","_doesImageNeedToBeRendered","_initializeRenderCanvas","_saveLastRendered","maxPixelValue","minPixelValue","offset","Uint8ClampedArray","lut","mlutfn","_getModalityLUT2","slope","intercept","vlutfn","_getVOILut2","storedValue","_getModalityLUT","_getVOILut","canvasContext","getImageData","lastRenderedImageId","lastRenderedViewport","_renderer","_createProgramFromString","_createProgramFromString2","_textureCache","_textureCache2","mod","createProgramFromString","initRenderer","isWebGLAvailable","textureCache","isWebGLInitialized","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","descriptor","writable","key","protoProps","staticProps","EventTarget","listeners","callback","stack","splice","defaultPrevented","events","useAlphaChannel","_getLut2","_storedPixelDataToCanvasImageData2","_storedPixelDataToCanvasImageDataRGBA2","renderGrayscaleImage","addGrayscaleLayer","_storedPixelDataToCanvasImageData","_storedPixelDataToCanvasImageDataRGBA","_getLut","requestFrame","setTimeout","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","canvasImageDataData","pixelData","getPixelData","lastGetPixelDataTime","numPixels","canvasImageDataIndex","storedPixelDataIndex","Int16Array","Uint16Array","lastStoredPixelDataToCanvasImageDataTime","storedPixelDataToCanvasImageDataColorLUT","clut","Table","storedPixelDataToCanvasImageDataPseudocolorLUT","grayscaleLut","grayscale","_transform","Transform","translate","angle","rotate","PI","widthScale","heightScale","rowPixelSpacing","columnPixelSpacing","colormapId","getId","createLookupTable","_storedPixelDataToCanvasImageDataColorLUT2","renderLabelMapImage","addLabelMapLayer","_storedPixelDataToCanvasImageDataColorLUT","setNumberOfColors","_storedPixelDataToCanvasImageDataPseudocolorLUT2","renderPseudoColorImage","addPseudoColorLayer","_storedPixelDataToCanvasImageDataPseudocolorLUT","eventName","layerId","eventData","_triggerEvent2","rescaleImage","baseLayer","targetLayer","baseImage","targetImage","colRelative","viewportRatio","addLayer","_guid2","_getDefaultViewport2","assign","syncViewports","newLayer","setActiveLayer","removeLayer","index","findIndex","activeLayerId","getLayer","find","getLayers","getVisibleLayers","filter","visible","opacity","_updateImage2","setLayerImage","getActiveLayer","defaultViewport","_guid","_getDefaultViewport","_updateImage","_triggerEvent","generateLinearModalityLUT","storedPixelValue","generateNonLinearModalityLUT","minValue","maxValue","maxValueMapped","firstValueMapped","linspace","a","b","increment","vector","getRank","array","elem","left","right","mid","floor","midElem","searchSorted","inputArray","values","indexes","len","sort","makeMappingArray","N","gamma","y0","y1","xLinSpace","pow","xLinSpaceIndexes","colorPercent","colorDelta","createLinearSegmentedColormap","segmentedData","redLut","red","greenLut","green","blueLut","blue","round","colormaps","keys","colormapsData","id","aName","bName","colormapData","colors","numColors","getColorSchemeName","setColorSchemeName","getNumberOfColors","COLOR_TRANSPARENT","getColor","isValidIndex","getColorRepeating","setColor","addColor","insertColor","removeColor","clearColors","buildLookupTable","setNumberOfTableValues","setTableValue","hotIron","numOfColors","pet","hotMetalBlue","pet20Step","gray","jet","hsv","hot","cool","spring","summer","autumn","winter","bone","copper","spectral","coolwarm","blues","HSVToRGB","hue","sat","val","rgb","hueCase","frac","lx","ly","lz","linearIndexLookupMain","v","dIndex","Range","MaxIndex","BELOW_RANGE_COLOR_INDEX","ABOVE_RANGE_COLOR_INDEX","Shift","Scale","NumberOfColors","Ramp","TableRange","HueRange","SaturationRange","ValueRange","AlphaRange","NaNColor","BelowRangeColor","UseBelowRangeColor","AboveRangeColor","UseAboveRangeColor","InputRange","number","ramp","end","scalar","mapValue","force","maxIndex","hinc","sinc","vinc","ainc","alpha","c_rgba","cos","sqrt","buildSpecialColors","numberOfColors","belowRangeColorIndex","aboveRangeColorIndex","nanColorIndex","getIndex","Number","MAX_VALUE","isNaN","Array","slice","pixelValue","reset","matrix","m11","m12","m21","m22","dx","dy","m0","m1","m2","m3","m4","m5","rad","sin","sx","sy","px","py","_lutMatches2","_lutMatches","getCacheInfo","maximumSizeInBytes","cacheSizeInBytes","numberOfImagesCached","cachedImages","purgeCacheIfNecessary","compare","timeStamp","lastCachedImage","sizeInBytes","imageCache","pop","_events2","cacheInfo","setMaximumSizeBytes","numBytes","toFixed","putImageTexture","imageTexture","cachedImage","getImageTexture","removeImageTexture","indexOf","purgeCache","removedCachedImage","_events","compileShader","gl","shaderSource","shaderType","shader","createShader","getShaderParameter","COMPILE_STATUS","isContextLost","infoLog","getShaderInfoLog","console","error","createProgram","vertexShader","fragmentShader","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","vertexShaderSrc","fragShaderSrc","VERTEX_SHADER","FRAGMENT_SHADER","renderWebImage","getImage","_renderColorImage","setCanvasSize","clientWidth","style","clientHeight","fitViewportToWindow","_fitToWindow2","_fitToWindow","getImageSize","imageSize","storedPixels","row","column","spIndex","removeImagePromise","putImagePromise","imagePromise","imageCacheDict","loaded","sharedCacheKey","then","eventDetails","action","getImagePromise","reject","decache","changeImageIdCacheSize","newCacheSize","cacheEntry","cacheSizeDifference","lookupTable","color","falseColor","origPixelData","storedColorPixelData","Uint8Array","sp","mapped","build","_requestAnimationFrame","_renderLabelMapImage","_renderPseudoColorImage","_renderGrayscaleImage","_renderWebImage","_canvasToPixel","_disable","_displayImage","_draw","_drawInvalidated","_enable","_enabledElementData","getElementData","removeElementData","_layers","_getDefaultViewportForImage","_getImage","_getPixels","_getStoredPixels","_getViewport","_imageLoader","loadImage","loadAndCacheImage","registerImageLoader","registerUnknownImageLoader","_invalidate","_invalidateImageId","_pageToPixel","_pixelToCanvas","_reset","_resize","_setViewport","_pixelDataToFalseColorData","_imageCache","_metaData","_index3","_index4","_falseColorMapping","convertImageToFalseColorImage","convertToFalseColorImage","restoreImage","_toConsumableArray","arr","isArray","arr2","from","generateLinearVOILUT","modalityLutValue","generateNonLinearVOILUT","bitsPerEntry","max","apply","toString","shift","_requestAnimationFrame2","_getTransform","_getTransform2","generateLut","getDefaultViewport","storedPixelDataToCanvasImageData","storedPixelDataToCanvasImageDataRGBA","storedColorPixelDataToCanvasImageData","getTransform","calculateTransform","initShaders","shaders","attributes","uniforms","vert","_vertexShader","frag","texCoordLocation","getAttribLocation","enableVertexAttribArray","positionLocation","resolutionLocation","getUniformLocation","initWebGL","initBuffers","updateRectangle","bufferData","ARRAY_BUFFER","Float32Array","STATIC_DRAW","handleLostContext","preventDefault","warn","handleRestoredContext","preserveDrawingBuffer","removeEventListener","addEventListener","getImageDataType","datatype","getShaderProgram","generateTexture","TEXTURE_FORMAT","uint8","LUMINANCE","int8","LUMINANCE_ALPHA","uint16","int16","RGB","TEXTURE_BYTES","imageDataType","format","texture","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","pixelStorei","UNPACK_ALIGNMENT","imageData","dataUtilities","storedPixelDataToImageData","texImage2D","UNSIGNED_BYTE","positionBuffer","createBuffer","bindBuffer","texCoordBuffer","renderQuad","parameters","clearColor","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","useProgram","vertexAttribPointer","FLOAT","uniformLocation","uniform","uniform1i","uniform1f","uniform2f","activeTexture","TEXTURE0","drawArrays","TRIANGLE_STRIP","u_resolution","wc","ww","failIfMajorPerformanceCaveat","WebGLRenderingContext","e","_int","_int2","_rgb","_uint","_uint2","abs","int16Shader","int16DataUtilities","int8Shader","int8DataUtilities","numStoredPixels","numOutputPixels","storedPixelData","rgbShader","rgbDataUtilities","uint16Shader","uint16DataUtilities","uint8Shader","uint8DataUtilities","pt","transformPoint","removeChild","oldImage","attrname","frameRate","lastImageTimeStamp","newImageEventData","s4","random","substring","ee","hasImageOrLayers","draw","timestamp","_drawImageSync2","appendChild","_resize2","_drawImageSync","lastRenderTime","_drawCompositeImage2","renderTimeInMs","_drawCompositeImage","getViewportRatio","baseLayerId","targetLayerId","originalViewportScale","activeLayer","renderLayers","save","isInvalid","globalAlpha","_layer$image","restore","allLayers","visibleLayers","resynced","lastSyncViewportsState","dataType","_getStoredPixels2","map","loadImageFromImageLoader","colonIndex","scheme","loader","imageLoaders","unknownImageLoader","imageLoader","oldImageLoader","pageX","pageY","rect","getBoundingClientRect","clientX","pageXOffset","clientY","top","pageYOffset","MIN_WINDOW_WIDTH","MIN_VIEWPORT_SCALE","colorImage","grayscaleImage","webImage","addProvider","provider","priority","providers","removeProvider","getMetaData","result","getPixelValues","MIN_VALUE","pixel","getRestoreImageMethod","ensuresColormap","setTableRange","_pixelDataToFalseColorData2","pixelValues"],"mappings":"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EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACrF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC1F,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC7F,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC7F,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,GAAI,MAC9F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACtG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,OAGpBmB,KACExW,KAAM,MACNsV,UAAW,IACXD,SACG,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,GAAI,EAAG,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAClF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MAAO,EAAG,GAAI,GAAI,MACnF,EAAG,IAAK,GAAI,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAC5F,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAC7F,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAC7F,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,EAAG,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAC9F,GAAI,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAClG,GAAI,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAAO,GAAI,IAAK,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAChG,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAC9F,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAChG,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAC7F,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAC/F,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAChG,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAC/F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC7F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACrG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,OAGpBoB,cACEzW,KAAM,iBACNsV,UAAW,IACXD,SACG,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAClF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACpF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAC1F,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAChG,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,GAAI,MAC5F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,IAAK,MACnG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,OAGpBqB,WACE1W,KAAM,cACNsV,UAAW,IACXD,SACG,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAC7E,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MACnF,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MACnF,GAAI,EAAG,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACvF,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACxF,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,IAAK,MACzF,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACnG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAC9F,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACxF,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACxF,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAC/F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC/F,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IA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","file":"cornerstone.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstone-core\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstone-core\"] = factory();\n\telse\n\t\troot[\"cornerstone\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/*! cornerstone-core - 1.1.3 - 2017-11-17 | (c) 2016 Chris Hafey | https://github.com/chafey/cornerstone */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstone-core\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstone-core\"] = factory();\n\telse\n\t\troot[\"cornerstone\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 41);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getEnabledElement = getEnabledElement;\nexports.addEnabledElement = addEnabledElement;\nexports.getEnabledElementsByImageId = getEnabledElementsByImageId;\nexports.getEnabledElements = getEnabledElements;\nvar enabledElements = [];\n\n/**\n * A two-dimensional vector\n *\n * @typedef {Object} vec2\n * @param {Number} x - The x distance\n * @param {Number} y - The y distance\n */\n\n/**\n * VOI\n *\n * @typedef {Object} VOI\n * @param {Number} windowWidth - Window Width for display\n * @param {Number} windowCenter - Window Center for display\n */\n\n/**\n * Lookup Table Array\n *\n * @typedef {Object} LUT\n * @property {Number} firstValueMapped\n * @property {Number} numBitsPerEntry\n * @property {Array} lut\n */\n\n/**\n * Image Statistics Object\n *\n * @typedef {Object} ImageStats\n *\n * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image\n * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array\n * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context\n * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run\n * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image\n */\n\n/**\n * An Image Object in Cornerstone\n *\n * @typedef {Object} Image\n *\n * @property {string} imageId - The imageId associated with this image object\n * @property {Number} minPixelValue - the minimum stored pixel value in the image\n * @property {Number} maxPixelValue - the maximum stored pixel value in the image\n * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified\n * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified\n * @property {Number} windowCenter - the default windowCenter to apply to the image\n * @property {Number} windowWidth - the default windowWidth to apply to the image\n * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color\n * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images\n * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.\n * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats\n * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience\n * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience\n * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience\n * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience\n * @property {Boolean} color - true if pixel data is RGB, false if grayscale\n * @property {Object} lut - The Lookup Table\n * @property {Boolean} rgba - Is the color pixel data stored in RGBA?\n * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known\n * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or heigh of each pixel) in mm or undefined if not known\n * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1\n * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.\n * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping\n * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping\n * @property {ImageStats} [stats] - Statistics for the last redraw of the image\n * @property {Object} cachedLut - Cached Lookup Table for this image.\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * A Viewport Settings Object Cornerstone\n *\n * @typedef {Object} Viewport\n *\n * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x\n * @param {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.\n * @param {VOI} [voi] - an object with properties windowWidth and windowCenter.\n * @property {boolean} [invert=false] - Whether or not the image is inverted.\n * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.\n * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false\n * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false\n * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0\n * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none\n * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * An Enabled Element in Cornerstone\n *\n * @typedef {Object} EnabledElement\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement\n * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters\n * for each of the enabled element's layers\n * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean\n */\n\n/**\n * An Enabled Element Layer in Cornerstone\n *\n * @typedef {Object} EnabledElementLayer\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Object} [options] - Layer drawing options\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n */\n\n/**\n * Retrieves a Cornerstone Enabled Element object\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n *\n * @returns {EnabledElement} A Cornerstone Enabled Element\n */\nfunction getEnabledElement(element) {\n if (element === undefined) {\n throw new Error('getEnabledElement: parameter element must not be undefined');\n }\n for (var i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n return enabledElements[i];\n }\n }\n\n throw new Error('element not enabled');\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object\n * @returns {void}\n */\nfunction addEnabledElement(enabledElement) {\n if (enabledElement === undefined) {\n throw new Error('getEnabledElement: enabledElement element must not be undefined');\n }\n\n enabledElements.push(enabledElement);\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {string} imageId A Cornerstone Image ID\n * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nfunction getEnabledElementsByImageId(imageId) {\n var ees = [];\n\n enabledElements.forEach(function (enabledElement) {\n if (enabledElement.image && enabledElement.image.imageId === imageId) {\n ees.push(enabledElement);\n }\n });\n\n return ees;\n}\n\n/**\n * Retrieve all of the currently enabled Cornerstone elements\n *\n * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nfunction getEnabledElements() {\n return enabledElements;\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = triggerEvent;\n\nvar _externalModules = __webpack_require__(33);\n\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {void}\n */\nfunction triggerEvent(el, type) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n var event = void 0;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type.toLocaleLowerCase(), { detail: detail });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail);\n }\n\n // TODO: remove jQuery event triggers\n _externalModules.external.$(el).trigger(type, detail);\n el.dispatchEvent(event);\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, context, scale) {\n if (enabledElement === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');\n }\n if (context === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');\n }\n\n var transform = (0, _calculateTransform2.default)(enabledElement, scale);\n\n context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);\n};\n\nvar _calculateTransform = __webpack_require__(22);\n\nvar _calculateTransform2 = _interopRequireDefault(_calculateTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n if (enabledElement.image === undefined && !enabledElement.layers.length) {\n throw new Error('updateImage: image has not been loaded yet');\n }\n\n (0, _drawImage2.default)(enabledElement, invalidated);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement) {\n var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n enabledElement.needsRedraw = true;\n if (invalidated) {\n enabledElement.invalid = true;\n }\n};\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (canvas, image) {\n if (canvas === undefined) {\n throw new Error('getDefaultViewport: parameter canvas must not be undefined');\n }\n\n if (image === undefined) {\n return {\n scale: 1,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false\n };\n }\n\n // Fit image to window\n var verticalScale = canvas.height / image.rows;\n var horizontalScale = canvas.width / image.columns;\n var scale = Math.min(horizontalScale, verticalScale);\n\n return {\n scale: scale,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: image.windowWidth,\n windowCenter: image.windowCenter\n },\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n voiLUT: image.voiLUT,\n colormap: image.colormap,\n labelmap: Boolean(image.labelmap)\n };\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _colormap = __webpack_require__(27);\n\nvar _lookupTable = __webpack_require__(28);\n\nvar _lookupTable2 = _interopRequireDefault(_lookupTable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n getColormap: _colormap.getColormap,\n getColormapsList: _colormap.getColormapsList,\n LookupTable: _lookupTable2.default\n};\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderColorImage = renderColorImage;\nexports.addColorLayer = addColorLayer;\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _generateLut = __webpack_require__(9);\n\nvar _generateLut2 = _interopRequireDefault(_generateLut);\n\nvar _storedColorPixelDataToCanvasImageData = __webpack_require__(19);\n\nvar _storedColorPixelDataToCanvasImageData2 = _interopRequireDefault(_storedColorPixelDataToCanvasImageData);\n\nvar _storedRGBAPixelDataToCanvasImageData = __webpack_require__(45);\n\nvar _storedRGBAPixelDataToCanvasImageData2 = _interopRequireDefault(_storedRGBAPixelDataToCanvasImageData);\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _index = __webpack_require__(14);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(13);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _initializeRenderCanvas = __webpack_require__(11);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _saveLastRendered = __webpack_require__(12);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getLut(image, viewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && image.cachedLut.invert === viewport.invert) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n (0, _generateLut2.default)(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n} /**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\n\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing\n if (enabledElement.viewport.voi.windowWidth === 255 && enabledElement.viewport.voi.windowCenter === 128 && enabledElement.viewport.invert === false && image.getCanvas && image.getCanvas()) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n var colorLut = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n (0, _storedRGBAPixelDataToCanvasImageData2.default)(image, colorLut, renderCanvasData.data);\n } else {\n (0, _storedColorPixelDataToCanvasImageData2.default)(image, colorLut, renderCanvasData.data);\n }\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderColorImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderColorImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderColorImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n var renderCanvas = void 0;\n\n if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = _index2.default.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\nfunction addColorLayer(layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addColorLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addColorLayer: image must be loaded before it can be drawn');\n }\n\n // All multi-layer images should include the alpha value\n image.rgba = true;\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {\n var maxPixelValue = image.maxPixelValue;\n var minPixelValue = image.minPixelValue;\n var offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n var length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n var lut = image.cachedLut.lutArray;\n var mlutfn = (0, _getModalityLUT2.default)(image.slope, image.intercept, modalityLUT);\n var vlutfn = (0, _getVOILut2.default)(windowWidth, windowCenter, voiLUT);\n\n if (invert === true) {\n for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));\n }\n } else {\n for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {\n lut[_storedValue + -offset] = vlutfn(mlutfn(_storedValue));\n }\n }\n\n return lut;\n};\n\nvar _getModalityLUT = __webpack_require__(26);\n\nvar _getModalityLUT2 = _interopRequireDefault(_getModalityLUT);\n\nvar _getVOILut = __webpack_require__(42);\n\nvar _getVOILut2 = _interopRequireDefault(_getVOILut);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement) {\n // For now we will calculate it every time it is requested.\n // In the future, we may want to cache it in the enabled element to speed things up.\n return (0, _calculateTransform2.default)(enabledElement);\n};\n\nvar _calculateTransform = __webpack_require__(22);\n\nvar _calculateTransform2 = _interopRequireDefault(_calculateTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, image) {\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n var canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n var renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n};\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement) {\n var imageId = enabledElement.image.imageId;\n var viewport = enabledElement.viewport;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap\n };\n\n return enabledElement.renderingTools;\n};\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, image) {\n var lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n var lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;\n\n return image.imageId !== lastRenderedImageId || !lastRenderedViewport || lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter || lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth || lastRenderedViewport.invert !== enabledElement.viewport.invert || lastRenderedViewport.rotation !== enabledElement.viewport.rotation || lastRenderedViewport.hflip !== enabledElement.viewport.hflip || lastRenderedViewport.vflip !== enabledElement.viewport.vflip || lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT || lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT || lastRenderedViewport.colormap !== enabledElement.viewport.colormap;\n};\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _renderer = __webpack_require__(46);\n\nvar _createProgramFromString = __webpack_require__(34);\n\nvar _createProgramFromString2 = _interopRequireDefault(_createProgramFromString);\n\nvar _textureCache = __webpack_require__(32);\n\nvar _textureCache2 = _interopRequireDefault(_textureCache);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mod = {\n createProgramFromString: _createProgramFromString2.default,\n renderer: {\n render: _renderer.render,\n initRenderer: _renderer.initRenderer,\n getRenderCanvas: _renderer.getRenderCanvas,\n isWebGLAvailable: _renderer.isWebGLAvailable\n },\n textureCache: _textureCache2.default\n};\n\nObject.defineProperty(mod, 'isWebGLInitialized', {\n enumerable: true,\n configurable: false,\n get: function get() {\n return _renderer.isWebGLInitialized;\n }\n});\n\nexports.default = mod;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EventTarget = function () {\n function EventTarget() {\n _classCallCheck(this, EventTarget);\n\n this.listeners = {};\n }\n\n _createClass(EventTarget, [{\n key: \"addEventListener\",\n value: function addEventListener(type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n }, {\n key: \"removeEventListener\",\n value: function removeEventListener(type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n var stack = this.listeners[type];\n\n for (var i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n }, {\n key: \"dispatchEvent\",\n value: function dispatchEvent(event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n\n var stack = this.listeners[event.type];\n\n for (var i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n }]);\n\n return EventTarget;\n}();\n\nvar events = new EventTarget();\n\nexports.default = events;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderGrayscaleImage = renderGrayscaleImage;\nexports.addGrayscaleLayer = addGrayscaleLayer;\n\nvar _storedPixelDataToCanvasImageData = __webpack_require__(18);\n\nvar _storedPixelDataToCanvasImageData2 = _interopRequireDefault(_storedPixelDataToCanvasImageData);\n\nvar _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(29);\n\nvar _storedPixelDataToCanvasImageDataRGBA2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataRGBA);\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _index = __webpack_require__(14);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _getLut = __webpack_require__(31);\n\nvar _getLut2 = _interopRequireDefault(_getLut);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(13);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _initializeRenderCanvas = __webpack_require__(11);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _saveLastRendered = __webpack_require__(12);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n var useAlphaChannel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n var lut = (0, _getLut2.default)(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // Gray scale image - apply the lut and put the resulting image onto the render canvas\n if (useAlphaChannel) {\n (0, _storedPixelDataToCanvasImageData2.default)(image, lut, renderCanvasData.data);\n } else {\n (0, _storedPixelDataToCanvasImageDataRGBA2.default)(image, lut, renderCanvasData.data);\n }\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderGrayscaleImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n var renderCanvas = void 0;\n\n if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = _index2.default.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\n/**\n * API function to draw a grayscale image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.\n This does not work if this layer is not the first layer in the enabledElement.\n * @returns {void}\n */\nfunction addGrayscaleLayer(layer, invalidated) {\n var useAlphaChannel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (layer === undefined) {\n throw new Error('addGrayscaleLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (callback) {\n return window.requestAnimationFrame(callback) || window.webkitRequestAnimationFrame(callback) || window.mozRequestAnimationFrame(callback) || window.oRequestAnimationFrame(callback) || window.msRequestAnimationFrame(callback) || requestFrame(callback);\n};\n\nfunction requestFrame(callback) {\n window.setTimeout(callback, 1000 / 60);\n}\n\n/**\n * Polyfills requestAnimationFrame for older browsers.\n *\n * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.\n *\n * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.\n */\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 3;\n var storedPixelDataIndex = 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = (0, _now2.default)();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = (0, _now2.default)();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + -minPixelValue]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataColorLUT(image, colorLut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var rgba = void 0;\n var clut = void 0;\n\n start = (0, _now2.default)();\n\n if (colorLut instanceof _index2.default.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n}\n\nexports.default = storedPixelDataToCanvasImageDataColorLUT;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT(image, grayscaleLut, colorLut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var grayscale = void 0;\n var rgba = void 0;\n var clut = void 0;\n\n start = (0, _now2.default)();\n\n if (colorLut instanceof _index2.default.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n}\n\nexports.default = storedPixelDataToCanvasImageDataPseudocolorLUT;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, scale) {\n\n var transform = new _transform.Transform();\n\n transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2);\n\n // Apply the rotation before scaling for non square pixels\n var angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n // Apply the scale\n var widthScale = enabledElement.viewport.scale;\n var heightScale = enabledElement.viewport.scale;\n\n if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {\n widthScale *= enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing;\n } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {\n heightScale *= enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing;\n }\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate(-angle * Math.PI / 180);\n }\n\n // Apply the pan offset\n transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y);\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Translate the origin back to the corner of the image so the event handlers can draw in image coordinate system\n transform.translate(-enabledElement.image.width / 2, -enabledElement.image.height / 2);\n\n return transform;\n};\n\nvar _transform = __webpack_require__(30);\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderLabelMapImage = renderLabelMapImage;\nexports.addLabelMapLayer = addLabelMapLayer;\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _initializeRenderCanvas = __webpack_require__(11);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _saveLastRendered = __webpack_require__(12);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(13);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _storedPixelDataToCanvasImageDataColorLUT = __webpack_require__(20);\n\nvar _storedPixelDataToCanvasImageDataColorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataColorLUT);\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && typeof colormap === 'string') {\n colormap = _index2.default.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderLabelMapImage: colormap not found.');\n }\n\n var colormapId = colormap.getId();\n\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n\n if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var colorLut = enabledElement.renderingTools.colorLut;\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n (0, _storedPixelDataToCanvasImageDataColorLUT2.default)(image, colorLut, renderCanvasData.data);\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a label map image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderLabelMapImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for label map pipeline\n var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n var width = image.width,\n height = image.height;\n\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction addLabelMapLayer(layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addLabelMapLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderPseudoColorImage = renderPseudoColorImage;\nexports.addPseudoColorLayer = addPseudoColorLayer;\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _initializeRenderCanvas = __webpack_require__(11);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _getLut = __webpack_require__(31);\n\nvar _getLut2 = _interopRequireDefault(_getLut);\n\nvar _saveLastRendered = __webpack_require__(12);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(13);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT);\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && typeof colormap === 'string') {\n colormap = _index2.default.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n var colormapId = colormap.getId();\n\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n\n if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n var lut = (0, _getLut2.default)(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var colorLut = enabledElement.renderingTools.colorLut;\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n (0, _storedPixelDataToCanvasImageDataPseudocolorLUT2.default)(image, lut, colorLut, renderCanvasData.data);\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderPseudoColorImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n var width = image.width,\n height = image.height;\n\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction addPseudoColorLayer(layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addPseudoColorLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rescaleImage = rescaleImage;\nexports.addLayer = addLayer;\nexports.removeLayer = removeLayer;\nexports.getLayer = getLayer;\nexports.getLayers = getLayers;\nexports.getVisibleLayers = getVisibleLayers;\nexports.setActiveLayer = setActiveLayer;\nexports.setLayerImage = setLayerImage;\nexports.getActiveLayer = getActiveLayer;\n\nvar _guid = __webpack_require__(57);\n\nvar _guid2 = _interopRequireDefault(_guid);\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Helper function to trigger an event on a Cornerstone element with\n * a specific layerId\n *\n * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)\n * @param {EnabledElement} enabledElement The Cornerstone enabled element\n * @param {String} layerId The layer's unique identifier\n * @returns {void}\n */\nfunction triggerEvent(eventName, enabledElement, layerId) {\n var element = enabledElement.element;\n var eventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n enabledElement: enabledElement,\n layerId: layerId\n };\n\n (0, _triggerEvent2.default)(element, eventName, eventData);\n}\n\n/**\n * Rescale the target layer to the base layer based on the\n * relative size of each image and their pixel dimensions.\n *\n * This function will update the Viewport parameters of the\n * target layer to a new scale.\n *\n * @param {EnabledElementLayer} baseLayer The base layer\n * @param {EnabledElementLayer} targetLayer The target layer to rescale\n * @returns {void}\n */\nfunction rescaleImage(baseLayer, targetLayer) {\n if (baseLayer.layerId === targetLayer.layerId) {\n throw new Error('rescaleImage: both arguments represent the same layer');\n }\n\n var baseImage = baseLayer.image;\n var targetImage = targetLayer.image;\n\n // Return if these images don't have an imageId (e.g. for dynamic images)\n if (!baseImage.imageId || !targetImage.imageId) {\n return;\n }\n\n // Column pixel spacing need to be considered when calculating the\n // ratio between the layer added and base layer images\n var colRelative = targetImage.columnPixelSpacing * targetImage.width / (baseImage.columnPixelSpacing * baseImage.width);\n var viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;\n\n targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;\n}\n\n/**\n * Add a layer to a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image object to add as a new layer\n * @param {Object} options Options for the layer\n *\n * @returns {String} layerId The new layer's unique identifier\n */\nfunction addLayer(element, image, options) {\n var layerId = (0, _guid2.default)();\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var layers = enabledElement.layers;\n var viewport = void 0;\n\n if (image) {\n viewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (options && options.viewport) {\n viewport = Object.assign(viewport, options.viewport);\n }\n }\n\n // Set syncViewports to true by default when a new layer is added\n if (enabledElement.syncViewports !== false) {\n enabledElement.syncViewports = true;\n }\n\n var newLayer = {\n image: image,\n layerId: layerId,\n viewport: viewport,\n options: options || {},\n renderingTools: {}\n };\n\n // Rescale the new layer based on the base layer to make sure\n // they will have a proportional size (pixel spacing)\n if (layers.length && image) {\n rescaleImage(layers[0], newLayer);\n }\n\n layers.push(newLayer);\n\n triggerEvent('CornerstoneLayerAdded', enabledElement, layerId);\n\n // Set the layer as active if it's the first layer added\n if (layers.length === 1 && image) {\n setActiveLayer(element, layerId);\n }\n\n return layerId;\n}\n\n/**\n * Remove a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nfunction removeLayer(element, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var layers = enabledElement.layers;\n var index = enabledElement.layers.findIndex(function (layer) {\n return layer.layerId === layerId;\n });\n\n if (index !== -1) {\n layers.splice(index, 1);\n\n // If the current layer is active, and we have other layers,\n // switch to the first layer that remains in the array\n if (layerId === enabledElement.activeLayerId && layers.length) {\n setActiveLayer(element, layers[0].layerId);\n }\n\n triggerEvent('CornerstoneLayerRemoved', enabledElement, layerId);\n }\n}\n\n/**\n * Retrieve a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @return {EnabledElementLayer} The layer\n */\nfunction getLayer(element, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers.find(function (layer) {\n return layer.layerId === layerId;\n });\n}\n\n/**\n * Retrieve all layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nfunction getLayers(element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers;\n}\n\n/**\n * Retrieve all visible layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nfunction getVisibleLayers(element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers.filter(function (layer) {\n return layer.options && layer.options.visible !== false && layer.options.opacity !== 0;\n });\n}\n\n/**\n * Set the active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nfunction setActiveLayer(element, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n // Stop here if this layer is already active\n if (enabledElement.activeLayerId === layerId) {\n return;\n }\n\n var index = enabledElement.layers.findIndex(function (layer) {\n return layer.layerId === layerId;\n });\n\n if (index === -1) {\n throw new Error('setActiveLayer: layer not found in layers array');\n }\n\n var layer = enabledElement.layers[index];\n\n if (!layer.image) {\n throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');\n }\n\n enabledElement.activeLayerId = layerId;\n enabledElement.image = layer.image;\n enabledElement.viewport = layer.viewport;\n\n (0, _updateImage2.default)(element);\n triggerEvent('CornerstoneActiveLayerChanged', enabledElement, layerId);\n}\n\n/**\n * Set a new image for a specific layerId\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image The image to be displayed in this layer\n * @param {String} [layerId] The unique identifier for the layer\n * @returns {void}\n */\nfunction setLayerImage(element, image, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var baseLayer = enabledElement.layers[0];\n\n var layer = void 0;\n\n if (layerId) {\n layer = getLayer(element, layerId);\n } else {\n layer = getActiveLayer(element);\n }\n\n if (!layer) {\n throw new Error('setLayerImage: Layer not found');\n }\n\n layer.image = image;\n\n if (!image) {\n layer.viewport = undefined;\n\n return;\n }\n\n if (!layer.viewport) {\n var defaultViewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (layer.options && layer.options.viewport) {\n layer.viewport = Object.assign(defaultViewport, layer.options.viewport);\n }\n\n if (baseLayer.layerId !== layerId) {\n rescaleImage(baseLayer, layer);\n }\n }\n}\n\n/**\n * Retrieve the currently active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @return {EnabledElementLayer} The currently active layer\n */\nfunction getActiveLayer(element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers.find(function (layer) {\n return layer.layerId === enabledElement.activeLayerId;\n });\n}\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (slope, intercept, modalityLUT) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n};\n\n/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n */\nfunction generateLinearModalityLUT(slope, intercept) {\n return function (storedPixelValue) {\n return storedPixelValue * slope + intercept;\n };\n}\n\nfunction generateNonLinearModalityLUT(modalityLUT) {\n var minValue = modalityLUT.lut[0];\n var maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n var maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return function (storedPixelValue) {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n */\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getColormapsList = getColormapsList;\nexports.getColormap = getColormap;\n\nvar _lookupTable = __webpack_require__(28);\n\nvar _lookupTable2 = _interopRequireDefault(_lookupTable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar COLOR_TRANSPARENT = [0, 0, 0, 0];\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palattes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nvar colormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [[0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255], [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255], [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255], [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255], [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255], [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255], [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255], [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255], [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255], [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255], [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255], [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255], [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255], [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255], [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255], [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255], [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255], [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255], [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255], [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255], [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255], [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255], [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255], [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255], [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255], [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255], [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255], [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255], [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255], [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255], [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255], [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255], [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255], [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255], [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255], [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255], [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255], [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255], [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255], [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255], [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255], [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255], [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255], [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255], [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255], [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255], [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255], [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255], [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255], [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255], [255, 255, 255, 255]]\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [[0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255], [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255], [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255], [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255], [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255], [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255], [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255], [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255], [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255], [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255], [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255], [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255], [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255], [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255], [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255], [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255], [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255], [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255], [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255], [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255], [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255], [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255], [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255], [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255], [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255], [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255], [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255], [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255], [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255], [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255], [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255], [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255], [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255], [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255], [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255], [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255], [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255], [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255], [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255], [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255], [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255], [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255], [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255], [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255], [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255], [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255], [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255], [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255], [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255], [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255], [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255], [255, 255, 255, 255]]\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [[0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255], [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255], [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255], [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255], [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255], [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255], [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255], [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255], [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255], [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255], [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255], [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255], [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255], [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255], [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255], [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255], [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255], [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255], [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255], [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255], [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255], [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255], [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255], [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255], [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255], [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255], [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255], [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255], [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255], [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255], [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255], [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255], [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255], [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255], [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255], [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255], [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255], [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255], [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255], [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255], [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255], [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255], [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255], [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255], [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255], [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255], [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255], [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255], [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255], [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255], [255, 255, 255, 255]]\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [[0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]]\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 1, 1]]\n }\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],\n green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],\n blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]\n }\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750], [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0], [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750], [0.857143, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1], [0.507937, 1, 1], [0.666667, 0.062500, 0.062500], [0.682540, 0, 0], [1, 0, 0]],\n blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500], [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500], [1, 0.09375, 0.09375]]\n }\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],\n blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]\n }\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 1, 1], [1, 0, 0]],\n blue: [[0, 1, 1], [1, 1, 1]]\n }\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0, 0]]\n }\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0.5, 0.5], [1, 1, 1]],\n blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]\n }\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 0, 0]]\n }\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 0, 0]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0.5, 0.5]]\n }\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],\n blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]\n }\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 0.7812, 0.7812]],\n blue: [[0, 0, 0], [1, 0.4975, 0.4975]]\n }\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0], [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1], [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80], [1, 0.80, 0.80]],\n green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000], [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000], [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1], [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000], [0.80, 0.6000, 0.6000], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],\n blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667], [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667], [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0], [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0], [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]\n }\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388], [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478], [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608], [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204], [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162], [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281], [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949], [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556], [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179], [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518], [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803], [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177], [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866], [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617], [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542], [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934], [1, 0.705673158, 0.705673158]],\n green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838], [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618], [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092], [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772], [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107], [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712], [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879], [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984], [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047], [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443], [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809], [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156], [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968], [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467], [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446], [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067], [1, 0.01555616, 0.01555616]],\n blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763], [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899], [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588], [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814], [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203], [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227], [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269], [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838], [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546], [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146], [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763], [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762], [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684], [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596], [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199], [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123], [1, 0.150232812, 0.150232812]]\n }\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991], [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429], [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256], [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502], [1, 0.031372550874948502, 0.031372550874948502]],\n green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449], [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144], [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698], [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169], [1, 0.18823529779911041, 0.18823529779911041]],\n blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359], [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171], [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162], [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]\n }\n }\n};\n\n// Generate linearly spaced vectors\n// http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\nfunction linspace(a, b, n) {\n n = n === null ? 100 : n;\n\n var increment = (b - a) / (n - 1);\n var vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n// Return the number of elements smaller than \"elem\" (binary search)\nfunction getRank(array, elem) {\n var left = 0;\n var right = array.length - 1;\n\n while (left <= right) {\n var mid = left + Math.floor((right - left) / 2);\n var midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n// Find the indices into a sorted array a such that, if the corresponding elements\n// In v were inserted before the indices, the order of a would be preserved.\n// http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\nfunction searchSorted(inputArray, values) {\n var i = void 0;\n var indexes = [];\n var len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n// Create an *N* -element 1-d lookup table\n//\n// *Data* represented by a list of x,y0,y1 mapping correspondences. Each element in this\n// List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n// A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n// Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n// The value of y for values of x <= to that given, and y1 is the value to be used for x >\n// Than that given). The list must start with x=0, end with x=1, and all values of x must be\n// In increasing order. Values between the given mapping points are determined by simple linear\n// Interpolation.\n//\n// The function returns an array \"result\" where result[x*(N-1)] gives the closest value for\n// Values of x between 0 and 1.\nfunction makeMappingArray(N, data, gamma) {\n var i = void 0;\n var x = [];\n var y0 = [];\n var y1 = [];\n var lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n var element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n var xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n var xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n var index = xLinSpaceIndexes[i];\n var colorPercent = (xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]);\n var colorDelta = y0[index] - y1[index - 1];\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n// Colormap based on lookup tables using linear segments.\n//\n// The lookup table is generated using linear interpolation for each\n// Primary color, with the 0-1 domain divided into any number of\n// Segments.\n//\n// https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\nfunction createLinearSegmentedColormap(segmentedData, N, gamma) {\n var i = void 0;\n var lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n var redLut = makeMappingArray(N, segmentedData.red, gamma);\n var greenLut = makeMappingArray(N, segmentedData.green, gamma);\n var blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n var red = Math.round(redLut[i] * 255);\n var green = Math.round(greenLut[i] * 255);\n var blue = Math.round(blueLut[i] * 255);\n var rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/*\n* Return all colormaps (id and name) available\n*/\nfunction getColormapsList() {\n var colormaps = [];\n var keys = Object.keys(colormapsData);\n\n keys.forEach(function (key) {\n if (colormapsData.hasOwnProperty(key)) {\n var colormap = colormapsData[key];\n\n colormaps.push({\n id: key,\n name: colormap.name\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n var aName = a.name.toLowerCase();\n var bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n *\n * @returns {*} The Colormap Object\n */\nfunction getColormap(id, colormapData) {\n var colormap = colormapsData[id];\n\n if (!colormap) {\n colormap = colormapsData[id] = colormapData || {\n name: '',\n colors: []\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);\n }\n\n return {\n getId: function getId() {\n return id;\n },\n getColorSchemeName: function getColorSchemeName() {\n return colormap.name;\n },\n setColorSchemeName: function setColorSchemeName(name) {\n colormap.name = name;\n },\n getNumberOfColors: function getNumberOfColors() {\n return colormap.colors.length;\n },\n setNumberOfColors: function setNumberOfColors(numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n getColor: function getColor(index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n getColorRepeating: function getColorRepeating(index) {\n var numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n setColor: function setColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n addColor: function addColor(rgba) {\n colormap.colors.push(rgba);\n },\n insertColor: function insertColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n removeColor: function removeColor(index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n clearColors: function clearColors() {\n colormap.colors = [];\n },\n buildLookupTable: function buildLookupTable(lut) {\n if (!lut) {\n return;\n }\n\n var numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (var i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n createLookupTable: function createLookupTable() {\n var lut = new _lookupTable2.default();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n isValidIndex: function isValidIndex(index) {\n return index >= 0 && index < colormap.colors.length;\n }\n };\n}\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nvar BELOW_RANGE_COLOR_INDEX = 0;\nvar ABOVE_RANGE_COLOR_INDEX = 1;\nvar NAN_COLOR_INDEX = 2;\n\nfunction HSVToRGB(hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n var rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n var hueCase = Math.floor(hue * 6);\n var frac = 6 * hue - hueCase;\n var lx = val * (1 - sat);\n var ly = val * (1 - sat * frac);\n var lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\nvar LookupTable = function () {\n function LookupTable() {\n _classCallCheck(this, LookupTable);\n\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n _createClass(LookupTable, [{\n key: 'setNumberOfTableValues',\n value: function setNumberOfTableValues(number) {\n this.NumberOfColors = number;\n }\n }, {\n key: 'setRamp',\n value: function setRamp(ramp) {\n this.Ramp = ramp;\n }\n }, {\n key: 'setTableRange',\n value: function setTableRange(start, end) {\n // Set/Get the minimum/maximum scalar values for scalar mapping.\n // Scalar values less than minimum range value are clamped to minimum range value.\n // Scalar values greater than maximum range value are clamped to maximum range value.\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n }, {\n key: 'setHueRange',\n value: function setHueRange(start, end) {\n // Set the range in hue (using automatic generation). Hue ranges between [0,1].\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n }, {\n key: 'setSaturationRange',\n value: function setSaturationRange(start, end) {\n // Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n }, {\n key: 'setValueRange',\n value: function setValueRange(start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n }, {\n key: 'setRange',\n value: function setRange(start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n }, {\n key: 'setAlphaRange',\n value: function setAlphaRange(start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n }, {\n key: 'getColor',\n value: function getColor(scalar) {\n // Map one value through the lookup table and return the color as an\n // RGB array of doubles between 0 and 1.\n return this.mapValue(scalar);\n }\n }, {\n key: 'build',\n value: function build(force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n var maxIndex = this.NumberOfColors - 1;\n\n var hinc = void 0,\n sinc = void 0,\n vinc = void 0,\n ainc = void 0;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (var i = 0; i <= maxIndex; i++) {\n var hue = this.HueRange[0] + i * hinc;\n var sat = this.SaturationRange[0] + i * sinc;\n var val = this.ValueRange[0] + i * vinc;\n var alpha = this.AlphaRange[0] + i * ainc;\n\n var rgb = HSVToRGB(hue, sat, val);\n var c_rgba = [];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));\n c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));\n c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error('Invalid Ramp value (' + this.Ramp + ')');\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n }, {\n key: 'buildSpecialColors',\n value: function buildSpecialColors() {\n var numberOfColors = this.NumberOfColors;\n var belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n var aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n var nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n // Given a scalar value v, return an rgba color value from lookup table.\n\n }, {\n key: 'mapValue',\n value: function mapValue(v) {\n var index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n }, {\n key: 'getIndex',\n value: function getIndex(v) {\n var p = {};\n\n p.Range = [];\n p.MaxIndex = this.NumberOfColors - 1;\n\n // This was LookupShiftAndScale\n p.Shift = -this.TableRange[0];\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n var index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n }, {\n key: 'setTableValue',\n value: function setTableValue(index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error('Can\\'t set the table value for negative index (' + index + ')');\n }\n\n if (index >= this.NumberOfColors) {\n new Error('Index ' + index + ' is greater than the number of colors ' + this.NumberOfColors);\n }\n\n this.Table[index] = rgba;\n\n if (index === 0 || index === this.NumberOfColors - 1) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n }]);\n\n return LookupTable;\n}();\n\nexports.default = LookupTable;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var pixelValue = void 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = (0, _now2.default)();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nvar Transform = exports.Transform = function () {\n function Transform() {\n _classCallCheck(this, Transform);\n\n this.reset();\n }\n\n _createClass(Transform, [{\n key: \"reset\",\n value: function reset() {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n }, {\n key: \"clone\",\n value: function clone() {\n var transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n }, {\n key: \"multiply\",\n value: function multiply(matrix) {\n var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n }, {\n key: \"invert\",\n value: function invert() {\n var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n var m0 = this.m[3] * d;\n var m1 = -this.m[1] * d;\n var m2 = -this.m[2] * d;\n var m3 = this.m[0] * d;\n var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n }, {\n key: \"rotate\",\n value: function rotate(rad) {\n var c = Math.cos(rad);\n var s = Math.sin(rad);\n var m11 = this.m[0] * c + this.m[2] * s;\n var m12 = this.m[1] * c + this.m[3] * s;\n var m21 = this.m[0] * -s + this.m[2] * c;\n var m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n }, {\n key: \"translate\",\n value: function translate(x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n }, {\n key: \"scale\",\n value: function scale(sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n }, {\n key: \"transformPoint\",\n value: function transformPoint(px, py) {\n var x = px;\n var y = py;\n\n px = x * this.m[0] + y * this.m[2] + this.m[4];\n py = x * this.m[1] + y * this.m[3] + this.m[5];\n\n return {\n x: px,\n y: py\n };\n }\n }]);\n\n return Transform;\n}();\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, viewport, invalidated) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && (0, _lutMatches2.default)(image.cachedLut.modalityLUT, viewport.modalityLUT) && (0, _lutMatches2.default)(image.cachedLut.voiLUT, viewport.voiLUT) && image.cachedLut.invert === viewport.invert && invalidated !== true) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n (0, _generateLut2.default)(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n};\n\nvar _lutMatches = __webpack_require__(44);\n\nvar _lutMatches2 = _interopRequireDefault(_lutMatches);\n\nvar _generateLut = __webpack_require__(9);\n\nvar _generateLut2 = _interopRequireDefault(_generateLut);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(15);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module deals with caching image textures in VRAM for WebGL\r\n */\n\nvar imageCache = {};\n\nvar cachedImages = [];\n\nvar maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB\nvar cacheSizeInBytes = 0;\n\nfunction getCacheInfo() {\n return {\n maximumSizeInBytes: maximumSizeInBytes,\n cacheSizeInBytes: cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\nfunction purgeCacheIfNecessary() {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare(a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary\n while (cacheSizeInBytes > maximumSizeInBytes) {\n var lastCachedImage = cachedImages[cachedImages.length - 1];\n\n cacheSizeInBytes -= lastCachedImage.sizeInBytes;\n delete imageCache[lastCachedImage.imageId];\n cachedImages.pop();\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneWebGLTextureRemoved', { imageId: lastCachedImage.imageId });\n }\n\n var cacheInfo = getCacheInfo();\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneWebGLTextureCacheFull', cacheInfo);\n}\n\nfunction setMaximumSizeBytes(numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n purgeCacheIfNecessary();\n}\n\nfunction putImageTexture(image, imageTexture) {\n var imageId = image.imageId;\n\n if (image === undefined) {\n throw new Error('putImageTexture: image must not be undefined');\n }\n\n if (imageId === undefined) {\n throw new Error('putImageTexture: imageId must not be undefined');\n }\n\n if (imageTexture === undefined) {\n throw new Error('putImageTexture: imageTexture must not be undefined');\n }\n\n if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {\n throw new Error('putImageTexture: imageId already in cache');\n }\n\n var cachedImage = {\n imageId: imageId,\n imageTexture: imageTexture,\n timeStamp: new Date(),\n sizeInBytes: imageTexture.sizeInBytes\n };\n\n imageCache[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n if (imageTexture.sizeInBytes === undefined) {\n throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');\n }\n if (imageTexture.sizeInBytes.toFixed === undefined) {\n throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');\n }\n cacheSizeInBytes += cachedImage.sizeInBytes;\n purgeCacheIfNecessary();\n}\n\nfunction getImageTexture(imageId) {\n if (imageId === undefined) {\n throw new Error('getImageTexture: imageId must not be undefined');\n }\n var cachedImage = imageCache[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = new Date();\n\n return cachedImage.imageTexture;\n}\n\nfunction removeImageTexture(imageId) {\n if (imageId === undefined) {\n throw new Error('removeImageTexture: imageId must not be undefined');\n }\n var cachedImage = imageCache[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImageTexture: imageId must not be undefined');\n }\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n delete imageCache[imageId];\n\n return cachedImage.imageTexture;\n}\n\nfunction purgeCache() {\n while (cachedImages.length > 0) {\n var removedCachedImage = cachedImages.pop();\n\n delete imageCache[removedCachedImage.imageId];\n }\n cacheSizeInBytes = 0;\n}\n\nexports.default = {\n purgeCache: purgeCache,\n getImageTexture: getImageTexture,\n putImageTexture: putImageTexture,\n removeImageTexture: removeImageTexture,\n setMaximumSizeBytes: setMaximumSizeBytes\n};\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar $ = window.$;\n\nvar external = {\n set $(module) {\n $ = module;\n },\n get $() {\n return $;\n }\n};\n\nexports.external = external;\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (gl, vertexShaderSrc, fragShaderSrc) {\n var vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);\n var fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);\n\n return createProgram(gl, vertexShader, fragShader);\n};\n\n/**\n * Creates and compiles a shader.\n *\n * @param {!WebGLRenderingContext} gl The WebGL Context.\n * @param {string} shaderSource The GLSL source code for the shader.\n * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.\n *\n * @return {!WebGLShader} The shader.\n */\nfunction compileShader(gl, shaderSource, shaderType) {\n\n // Create the shader object\n var shader = gl.createShader(shaderType);\n\n // Set the shader source code.\n gl.shaderSource(shader, shaderSource);\n\n // Compile the shader\n gl.compileShader(shader);\n\n // Check if it compiled\n var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong during compilation; get the error\n var infoLog = gl.getShaderInfoLog(shader);\n\n console.error(\"Could not compile shader:\\n\" + infoLog);\n }\n\n return shader;\n}\n\n/**\n * Creates a program from 2 shaders.\n *\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShader A vertex shader.\n * @param {!WebGLShader} fragmentShader A fragment shader.\n * @return {!WebGLProgram} A program.\n */\nfunction createProgram(gl, vertexShader, fragmentShader) {\n\n // Create a program.\n var program = gl.createProgram();\n\n // Attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n // Link the program.\n gl.linkProgram(program);\n\n // Check if it linked.\n var success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong with the link\n var infoLog = gl.getProgramInfoLog(program);\n\n console.error(\"WebGL program filed to link:\\n\" + infoLog);\n }\n\n return program;\n}\n\n/**\n * Creates a program from 2 shaders source (Strings)\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShaderSrc Vertex shader string\n * @param {!WebGLShader} fragShaderSrc Fragment shader string\n * @return {!WebGLProgram} A program\n */\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderWebImage = renderWebImage;\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _renderColorImage = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * API function to draw a standard web image (PNG, JPG) to an enabledImage\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\n/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nfunction renderWebImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderWebImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderWebImage: image must be loaded before it can be drawn');\n }\n\n // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image\n // Directly. If any of those are changed, we call renderColorImage() to apply the lut\n if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth && enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter && enabledElement.viewport.invert === false) {\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n context.drawImage(image.getImage(), 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n } else {\n (0, _renderColorImage.renderColorImage)(enabledElement, invalidated);\n }\n}\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, fitViewportToWindow) {\n\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n setCanvasSize(element, enabledElement.canvas);\n\n var eventData = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'CornerstoneElementResized', eventData);\n\n if (enabledElement.image === undefined) {\n return;\n }\n\n if (fitViewportToWindow === true) {\n (0, _fitToWindow2.default)(element);\n } else {\n (0, _updateImage2.default)(element);\n }\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _fitToWindow = __webpack_require__(37);\n\nvar _fitToWindow2 = _interopRequireDefault(_fitToWindow);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\nfunction setCanvasSize(element, canvas) {\n // The device pixel ratio is 1.0 for normal displays and > 1.0\n // For high DPI displays like Retina\n /*\r\n This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas\r\n is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to\r\n a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel\r\n produces incorrect results. I couldn't find any way to determine when the DPI changed other than\r\n by polling which is not very clean. If anyone has any ideas here, please let me know, but for now\r\n we will disable this functionality. We may want\r\n to add a mechanism to optionally enable this functionality if we can determine it is safe to do\r\n so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing\r\n to be cautious here since I would rather not have bug reports or safety issues related to this\r\n scenario.\r\n var devicePixelRatio = window.devicePixelRatio;\r\n if(devicePixelRatio === undefined) {\r\n devicePixelRatio = 1.0;\r\n }\r\n */\n\n // Avoid setting the same value because it flashes the canvas with IE and Edge\n if (canvas.width !== element.clientWidth) {\n canvas.width = element.clientWidth;\n canvas.style.width = element.clientWidth + 'px';\n }\n // Avoid setting the same value because it flashes the canvas with IE and Edge\n if (canvas.height !== element.clientHeight) {\n canvas.height = element.clientHeight;\n canvas.style.height = element.clientHeight + 'px';\n }\n}\n\n/**\r\n * Resizes an enabled element and optionally fits the image to window\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {Boolean} fitViewportToWindow true to refit, false to leave viewport parameters as they are\r\n * @returns {void}\r\n */\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var imageSize = getImageSize(enabledElement);\n\n var verticalScale = enabledElement.canvas.height / imageSize.height;\n var horizontalScale = enabledElement.canvas.width / imageSize.width;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = Math.min(horizontalScale, verticalScale);\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @return {{width, height}} The Image dimensions\n */\nfunction getImageSize(enabledElement) {\n if (enabledElement.viewport.rotation === 0 || enabledElement.viewport.rotation === 180) {\n return {\n width: enabledElement.image.width,\n height: enabledElement.image.height\n };\n }\n\n return {\n width: enabledElement.image.height,\n height: enabledElement.image.width\n };\n}\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param {HTMLElement} element The Cornerstone element to update\n * @returns {void}\n */\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (element === undefined) {\n throw new Error('getStoredPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var storedPixels = [];\n var index = 0;\n var pixelData = enabledElement.image.getPixelData();\n\n for (var row = 0; row < height; row++) {\n for (var column = 0; column < width; column++) {\n var spIndex = (row + y) * enabledElement.image.columns + (column + x);\n\n storedPixels[index++] = pixelData[spIndex];\n }\n }\n\n return storedPixels;\n};\n\nvar _enabledElements = __webpack_require__(0);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.cachedImages = undefined;\nexports.setMaximumSizeBytes = setMaximumSizeBytes;\nexports.putImagePromise = putImagePromise;\nexports.getImagePromise = getImagePromise;\nexports.removeImagePromise = removeImagePromise;\nexports.getCacheInfo = getCacheInfo;\nexports.purgeCache = purgeCache;\nexports.changeImageIdCacheSize = changeImageIdCacheSize;\n\nvar _events = __webpack_require__(15);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * This module deals with caching images\n */\nvar maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB\nvar cacheSizeInBytes = 0;\n\n// Dictionary of imageId to cachedImage objects\nvar imageCacheDict = {};\n\n// Array of cachedImage objects\nvar cachedImages = exports.cachedImages = [];\n\nfunction setMaximumSizeBytes(numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheMaximumSizeChanged');\n\n purgeCacheIfNecessary();\n}\n\nfunction purgeCacheIfNecessary() {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare(a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary)\n while (cacheSizeInBytes > maximumSizeInBytes) {\n var lastCachedImage = cachedImages[cachedImages.length - 1];\n var imageId = lastCachedImage.imageId;\n\n removeImagePromise(imageId);\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCachePromiseRemoved', { imageId: imageId });\n }\n\n var cacheInfo = getCacheInfo();\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheFull', cacheInfo);\n}\n\nfunction putImagePromise(imageId, imagePromise) {\n if (imageId === undefined) {\n throw new Error('putImagePromise: imageId must not be undefined');\n }\n if (imagePromise === undefined) {\n throw new Error('putImagePromise: imagePromise must not be undefined');\n }\n if (imageCacheDict.hasOwnProperty(imageId) === true) {\n throw new Error('putImagePromise: imageId already in cache');\n }\n\n var cachedImage = {\n loaded: false,\n imageId: imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imagePromise: imagePromise,\n timeStamp: Date.now(),\n sizeInBytes: 0\n };\n\n imageCacheDict[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n imagePromise.then(function (image) {\n if (cachedImages.indexOf(cachedImage) === -1) {\n // If the image has been purged before being loaded, we stop here.\n return;\n }\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n\n if (image.sizeInBytes === undefined) {\n throw new Error('putImagePromise: sizeInBytes must not be undefined');\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error('putImagePromise: image.sizeInBytes is not a number');\n }\n\n cachedImage.sizeInBytes = image.sizeInBytes;\n cacheSizeInBytes += cachedImage.sizeInBytes;\n\n var eventDetails = {\n action: 'addImage',\n image: cachedImage\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheChanged', eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n\n purgeCacheIfNecessary();\n });\n}\n\nfunction getImagePromise(imageId) {\n if (imageId === undefined) {\n throw new Error('getImagePromise: imageId must not be undefined');\n }\n var cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imagePromise;\n}\n\nfunction removeImagePromise(imageId) {\n if (imageId === undefined) {\n throw new Error('removeImagePromise: imageId must not be undefined');\n }\n var cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImagePromise: imageId was not present in imageCache');\n }\n\n cachedImage.imagePromise.reject();\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n\n var eventDetails = {\n action: 'deleteImage',\n image: cachedImage\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheChanged', eventDetails);\n decache(cachedImage.imagePromise);\n\n delete imageCacheDict[imageId];\n}\n\nfunction getCacheInfo() {\n return {\n maximumSizeInBytes: maximumSizeInBytes,\n cacheSizeInBytes: cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\n// This method should only be called by `removeImagePromise` because it's\n// The one that knows how to deal with shared cache keys and cache size.\nfunction decache(imagePromise) {\n imagePromise.then(function (image) {\n if (image.decache) {\n image.decache();\n }\n });\n}\n\nfunction purgeCache() {\n while (cachedImages.length > 0) {\n var removedCachedImage = cachedImages[0];\n\n removeImagePromise(removedCachedImage.imageId);\n }\n}\n\nfunction changeImageIdCacheSize(imageId, newCacheSize) {\n var cacheEntry = imageCacheDict[imageId];\n\n if (cacheEntry) {\n cacheEntry.imagePromise.then(function (image) {\n var cacheSizeDifference = newCacheSize - image.sizeInBytes;\n\n image.sizeInBytes = newCacheSize;\n cacheEntry.sizeInBytes = newCacheSize;\n cacheSizeInBytes += cacheSizeDifference;\n\n var eventDetails = {\n action: 'changeImageSize',\n image: image\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageCacheChanged', eventDetails);\n });\n }\n}\n\nexports.default = {\n imageCache: imageCacheDict,\n cachedImages: cachedImages,\n setMaximumSizeBytes: setMaximumSizeBytes,\n putImagePromise: putImagePromise,\n getImagePromise: getImagePromise,\n removeImagePromise: removeImagePromise,\n getCacheInfo: getCacheInfo,\n purgeCache: purgeCache,\n changeImageIdCacheSize: changeImageIdCacheSize\n};\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lookupTable) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var numPixels = image.width * image.height;\n var origPixelData = image.origPixelData || image.getPixelData();\n var storedColorPixelData = new Uint8Array(numPixels * 4);\n var sp = void 0;\n var mapped = void 0;\n\n image.color = true;\n image.falseColor = true;\n image.origPixelData = origPixelData;\n\n if (lookupTable instanceof _index2.default.LookupTable) {\n lookupTable.build();\n\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n mapped = lookupTable.mapValue(sp);\n storedColorPixelData[canvasImageDataIndex++] = mapped[0];\n storedColorPixelData[canvasImageDataIndex++] = mapped[1];\n storedColorPixelData[canvasImageDataIndex++] = mapped[2];\n storedColorPixelData[canvasImageDataIndex++] = mapped[3];\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][3]; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha\n }\n }\n\n image.rgba = true;\n image.cachedLut = undefined;\n image.render = undefined;\n image.slope = 1;\n image.intercept = 0;\n image.minPixelValue = 0;\n image.maxPixelValue = 255;\n image.windowWidth = 255;\n image.windowCenter = 128;\n image.getPixelData = function () {\n return storedColorPixelData;\n };\n};\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _drawImage = __webpack_require__(5);\n\nObject.defineProperty(exports, 'drawImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawImage).default;\n }\n});\n\nvar _generateLut = __webpack_require__(9);\n\nObject.defineProperty(exports, 'generateLut', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_generateLut).default;\n }\n});\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nObject.defineProperty(exports, 'getDefaultViewport', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getDefaultViewport).default;\n }\n});\n\nvar _requestAnimationFrame = __webpack_require__(17);\n\nObject.defineProperty(exports, 'requestAnimationFrame', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_requestAnimationFrame).default;\n }\n});\n\nvar _storedPixelDataToCanvasImageData = __webpack_require__(18);\n\nObject.defineProperty(exports, 'storedPixelDataToCanvasImageData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedPixelDataToCanvasImageData).default;\n }\n});\n\nvar _storedColorPixelDataToCanvasImageData = __webpack_require__(19);\n\nObject.defineProperty(exports, 'storedColorPixelDataToCanvasImageData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedColorPixelDataToCanvasImageData).default;\n }\n});\n\nvar _storedPixelDataToCanvasImageDataColorLUT = __webpack_require__(20);\n\nObject.defineProperty(exports, 'storedPixelDataToCanvasImageDataColorLUT', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedPixelDataToCanvasImageDataColorLUT).default;\n }\n});\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21);\n\nObject.defineProperty(exports, 'storedPixelDataToCanvasImageDataPseudocolorLUT', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT).default;\n }\n});\n\nvar _index = __webpack_require__(43);\n\nObject.defineProperty(exports, 'internal', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index).default;\n }\n});\n\nvar _renderLabelMapImage = __webpack_require__(23);\n\nObject.defineProperty(exports, 'renderLabelMapImage', {\n enumerable: true,\n get: function get() {\n return _renderLabelMapImage.renderLabelMapImage;\n }\n});\n\nvar _renderPseudoColorImage = __webpack_require__(24);\n\nObject.defineProperty(exports, 'renderPseudoColorImage', {\n enumerable: true,\n get: function get() {\n return _renderPseudoColorImage.renderPseudoColorImage;\n }\n});\n\nvar _renderColorImage = __webpack_require__(8);\n\nObject.defineProperty(exports, 'renderColorImage', {\n enumerable: true,\n get: function get() {\n return _renderColorImage.renderColorImage;\n }\n});\n\nvar _renderGrayscaleImage = __webpack_require__(16);\n\nObject.defineProperty(exports, 'renderGrayscaleImage', {\n enumerable: true,\n get: function get() {\n return _renderGrayscaleImage.renderGrayscaleImage;\n }\n});\n\nvar _renderWebImage = __webpack_require__(35);\n\nObject.defineProperty(exports, 'renderWebImage', {\n enumerable: true,\n get: function get() {\n return _renderWebImage.renderWebImage;\n }\n});\n\nvar _canvasToPixel = __webpack_require__(54);\n\nObject.defineProperty(exports, 'canvasToPixel', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_canvasToPixel).default;\n }\n});\n\nvar _disable = __webpack_require__(55);\n\nObject.defineProperty(exports, 'disable', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_disable).default;\n }\n});\n\nvar _displayImage = __webpack_require__(56);\n\nObject.defineProperty(exports, 'displayImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_displayImage).default;\n }\n});\n\nvar _draw = __webpack_require__(58);\n\nObject.defineProperty(exports, 'draw', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_draw).default;\n }\n});\n\nvar _drawInvalidated = __webpack_require__(59);\n\nObject.defineProperty(exports, 'drawInvalidated', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawInvalidated).default;\n }\n});\n\nvar _enable = __webpack_require__(60);\n\nObject.defineProperty(exports, 'enable', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_enable).default;\n }\n});\n\nvar _enabledElementData = __webpack_require__(63);\n\nObject.defineProperty(exports, 'getElementData', {\n enumerable: true,\n get: function get() {\n return _enabledElementData.getElementData;\n }\n});\nObject.defineProperty(exports, 'removeElementData', {\n enumerable: true,\n get: function get() {\n return _enabledElementData.removeElementData;\n }\n});\n\nvar _enabledElements = __webpack_require__(0);\n\nObject.defineProperty(exports, 'getEnabledElement', {\n enumerable: true,\n get: function get() {\n return _enabledElements.getEnabledElement;\n }\n});\nObject.defineProperty(exports, 'addEnabledElement', {\n enumerable: true,\n get: function get() {\n return _enabledElements.addEnabledElement;\n }\n});\nObject.defineProperty(exports, 'getEnabledElementsByImageId', {\n enumerable: true,\n get: function get() {\n return _enabledElements.getEnabledElementsByImageId;\n }\n});\nObject.defineProperty(exports, 'getEnabledElements', {\n enumerable: true,\n get: function get() {\n return _enabledElements.getEnabledElements;\n }\n});\n\nvar _layers = __webpack_require__(25);\n\nObject.defineProperty(exports, 'addLayer', {\n enumerable: true,\n get: function get() {\n return _layers.addLayer;\n }\n});\nObject.defineProperty(exports, 'removeLayer', {\n enumerable: true,\n get: function get() {\n return _layers.removeLayer;\n }\n});\nObject.defineProperty(exports, 'getLayer', {\n enumerable: true,\n get: function get() {\n return _layers.getLayer;\n }\n});\nObject.defineProperty(exports, 'getLayers', {\n enumerable: true,\n get: function get() {\n return _layers.getLayers;\n }\n});\nObject.defineProperty(exports, 'getVisibleLayers', {\n enumerable: true,\n get: function get() {\n return _layers.getVisibleLayers;\n }\n});\nObject.defineProperty(exports, 'setActiveLayer', {\n enumerable: true,\n get: function get() {\n return _layers.setActiveLayer;\n }\n});\nObject.defineProperty(exports, 'getActiveLayer', {\n enumerable: true,\n get: function get() {\n return _layers.getActiveLayer;\n }\n});\nObject.defineProperty(exports, 'setLayerImage', {\n enumerable: true,\n get: function get() {\n return _layers.setLayerImage;\n }\n});\n\nvar _fitToWindow = __webpack_require__(37);\n\nObject.defineProperty(exports, 'fitToWindow', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_fitToWindow).default;\n }\n});\n\nvar _getDefaultViewportForImage = __webpack_require__(64);\n\nObject.defineProperty(exports, 'getDefaultViewportForImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getDefaultViewportForImage).default;\n }\n});\n\nvar _getImage = __webpack_require__(65);\n\nObject.defineProperty(exports, 'getImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getImage).default;\n }\n});\n\nvar _getPixels = __webpack_require__(66);\n\nObject.defineProperty(exports, 'getPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getPixels).default;\n }\n});\n\nvar _getStoredPixels = __webpack_require__(38);\n\nObject.defineProperty(exports, 'getStoredPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getStoredPixels).default;\n }\n});\n\nvar _getViewport = __webpack_require__(67);\n\nObject.defineProperty(exports, 'getViewport', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getViewport).default;\n }\n});\n\nvar _imageLoader = __webpack_require__(68);\n\nObject.defineProperty(exports, 'loadImage', {\n enumerable: true,\n get: function get() {\n return _imageLoader.loadImage;\n }\n});\nObject.defineProperty(exports, 'loadAndCacheImage', {\n enumerable: true,\n get: function get() {\n return _imageLoader.loadAndCacheImage;\n }\n});\nObject.defineProperty(exports, 'registerImageLoader', {\n enumerable: true,\n get: function get() {\n return _imageLoader.registerImageLoader;\n }\n});\nObject.defineProperty(exports, 'registerUnknownImageLoader', {\n enumerable: true,\n get: function get() {\n return _imageLoader.registerUnknownImageLoader;\n }\n});\n\nvar _invalidate = __webpack_require__(69);\n\nObject.defineProperty(exports, 'invalidate', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_invalidate).default;\n }\n});\n\nvar _invalidateImageId = __webpack_require__(70);\n\nObject.defineProperty(exports, 'invalidateImageId', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_invalidateImageId).default;\n }\n});\n\nvar _pageToPixel = __webpack_require__(71);\n\nObject.defineProperty(exports, 'pageToPixel', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pageToPixel).default;\n }\n});\n\nvar _pixelToCanvas = __webpack_require__(72);\n\nObject.defineProperty(exports, 'pixelToCanvas', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pixelToCanvas).default;\n }\n});\n\nvar _reset = __webpack_require__(73);\n\nObject.defineProperty(exports, 'reset', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_reset).default;\n }\n});\n\nvar _resize = __webpack_require__(36);\n\nObject.defineProperty(exports, 'resize', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_resize).default;\n }\n});\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nObject.defineProperty(exports, 'setToPixelCoordinateSystem', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setToPixelCoordinateSystem).default;\n }\n});\n\nvar _setViewport = __webpack_require__(74);\n\nObject.defineProperty(exports, 'setViewport', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setViewport).default;\n }\n});\n\nvar _updateImage = __webpack_require__(4);\n\nObject.defineProperty(exports, 'updateImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_updateImage).default;\n }\n});\n\nvar _pixelDataToFalseColorData = __webpack_require__(40);\n\nObject.defineProperty(exports, 'pixelDataToFalseColorData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pixelDataToFalseColorData).default;\n }\n});\n\nvar _index2 = __webpack_require__(75);\n\nObject.defineProperty(exports, 'rendering', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index2).default;\n }\n});\n\nvar _imageCache = __webpack_require__(39);\n\nObject.defineProperty(exports, 'imageCache', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_imageCache).default;\n }\n});\n\nvar _metaData = __webpack_require__(76);\n\nObject.defineProperty(exports, 'metaData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_metaData).default;\n }\n});\n\nvar _index3 = __webpack_require__(14);\n\nObject.defineProperty(exports, 'webGL', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index3).default;\n }\n});\n\nvar _index4 = __webpack_require__(7);\n\nObject.defineProperty(exports, 'colors', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index4).default;\n }\n});\n\nvar _falseColorMapping = __webpack_require__(77);\n\nObject.defineProperty(exports, 'convertImageToFalseColorImage', {\n enumerable: true,\n get: function get() {\n return _falseColorMapping.convertImageToFalseColorImage;\n }\n});\nObject.defineProperty(exports, 'convertToFalseColorImage', {\n enumerable: true,\n get: function get() {\n return _falseColorMapping.convertToFalseColorImage;\n }\n});\nObject.defineProperty(exports, 'restoreImage', {\n enumerable: true,\n get: function get() {\n return _falseColorMapping.restoreImage;\n }\n});\n\nvar _events = __webpack_require__(15);\n\nObject.defineProperty(exports, 'events', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_events).default;\n }\n});\n\nvar _triggerEvent = __webpack_require__(2);\n\nObject.defineProperty(exports, 'triggerEvent', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_triggerEvent).default;\n }\n});\n\nvar _externalModules = __webpack_require__(33);\n\nObject.defineProperty(exports, 'external', {\n enumerable: true,\n get: function get() {\n return _externalModules.external;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (windowWidth, windowCenter, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n};\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n */\n\n/**\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateLinearVOILUT(windowWidth, windowCenter) {\n return function (modalityLutValue) {\n return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateNonLinearVOILUT(voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n var bitsPerEntry = Math.max.apply(Math, _toConsumableArray(voiLUT.lut)).toString(2).length;\n var shift = bitsPerEntry - 8;\n var minValue = voiLUT.lut[0] >> shift;\n var maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n var maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n */\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nvar _generateLut = __webpack_require__(9);\n\nvar _generateLut2 = _interopRequireDefault(_generateLut);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _requestAnimationFrame = __webpack_require__(17);\n\nvar _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);\n\nvar _storedPixelDataToCanvasImageData = __webpack_require__(18);\n\nvar _storedPixelDataToCanvasImageData2 = _interopRequireDefault(_storedPixelDataToCanvasImageData);\n\nvar _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(29);\n\nvar _storedPixelDataToCanvasImageDataRGBA2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataRGBA);\n\nvar _storedColorPixelDataToCanvasImageData = __webpack_require__(19);\n\nvar _storedColorPixelDataToCanvasImageData2 = _interopRequireDefault(_storedColorPixelDataToCanvasImageData);\n\nvar _storedPixelDataToCanvasImageDataColorLUT = __webpack_require__(20);\n\nvar _storedPixelDataToCanvasImageDataColorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataColorLUT);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT);\n\nvar _getTransform = __webpack_require__(10);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nvar _calculateTransform = __webpack_require__(22);\n\nvar _calculateTransform2 = _interopRequireDefault(_calculateTransform);\n\nvar _transform = __webpack_require__(30);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n drawImage: _drawImage2.default,\n generateLut: _generateLut2.default,\n getDefaultViewport: _getDefaultViewport2.default,\n requestAnimationFrame: _requestAnimationFrame2.default,\n storedPixelDataToCanvasImageData: _storedPixelDataToCanvasImageData2.default,\n storedPixelDataToCanvasImageDataRGBA: _storedPixelDataToCanvasImageDataRGBA2.default,\n storedPixelDataToCanvasImageDataColorLUT: _storedPixelDataToCanvasImageDataColorLUT2.default,\n storedPixelDataToCanvasImageDataPseudocolorLUT: _storedPixelDataToCanvasImageDataPseudocolorLUT2.default,\n storedColorPixelDataToCanvasImageData: _storedColorPixelDataToCanvasImageData2.default,\n getTransform: _getTransform2.default,\n calculateTransform: _calculateTransform2.default,\n Transform: _transform.Transform\n};\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (a, b) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return a.id === b.id;\n};\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = (0, _now2.default)();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isWebGLInitialized = undefined;\nexports.getRenderCanvas = getRenderCanvas;\nexports.initRenderer = initRenderer;\nexports.render = render;\nexports.isWebGLAvailable = isWebGLAvailable;\n\nvar _index = __webpack_require__(47);\n\nvar _vertexShader = __webpack_require__(53);\n\nvar _textureCache = __webpack_require__(32);\n\nvar _textureCache2 = _interopRequireDefault(_textureCache);\n\nvar _createProgramFromString = __webpack_require__(34);\n\nvar _createProgramFromString2 = _interopRequireDefault(_createProgramFromString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-bitwise: 0 */\n\nvar renderCanvas = document.createElement('canvas');\nvar gl = void 0;\nvar texCoordBuffer = void 0;\nvar positionBuffer = void 0;\nvar isWebGLInitialized = false;\n\nexports.isWebGLInitialized = isWebGLInitialized;\nfunction getRenderCanvas() {\n return renderCanvas;\n}\n\nfunction initShaders() {\n for (var id in _index.shaders) {\n // Console.log(\"WEBGL: Loading shader\", id);\n var shader = _index.shaders[id];\n\n shader.attributes = {};\n shader.uniforms = {};\n shader.vert = _vertexShader.vertexShader;\n\n shader.program = (0, _createProgramFromString2.default)(gl, shader.vert, shader.frag);\n\n shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');\n gl.enableVertexAttribArray(shader.attributes.texCoordLocation);\n\n shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');\n gl.enableVertexAttribArray(shader.attributes.positionLocation);\n\n shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');\n }\n}\n\nfunction initRenderer() {\n if (isWebGLInitialized === true) {\n // Console.log(\"WEBGL Renderer already initialized\");\n return;\n }\n\n if (initWebGL(renderCanvas)) {\n initBuffers();\n initShaders();\n // Console.log(\"WEBGL Renderer initialized!\");\n exports.isWebGLInitialized = isWebGLInitialized = true;\n }\n}\n\nfunction updateRectangle(gl, width, height) {\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([width, height, 0, height, width, 0, 0, 0]), gl.STATIC_DRAW);\n}\n\nfunction handleLostContext(event) {\n event.preventDefault();\n console.warn('WebGL Context Lost!');\n}\n\nfunction handleRestoredContext(event) {\n event.preventDefault();\n exports.isWebGLInitialized = isWebGLInitialized = false;\n _textureCache2.default.purgeCache();\n initRenderer();\n // Console.log('WebGL Context Restored.');\n}\n\nfunction initWebGL(canvas) {\n\n gl = null;\n try {\n // Try to grab the standard context. If it fails, fallback to experimental.\n var options = {\n preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element\n };\n\n // ---------------- Testing purposes -------------\n // If (debug === true && WebGLDebugUtils) {\n // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);\n // }\n // ---------------- Testing purposes -------------\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n // Set up event listeners for context lost / context restored\n canvas.removeEventListener('webglcontextlost', handleLostContext, false);\n canvas.addEventListener('webglcontextlost', handleLostContext, false);\n\n canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);\n canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);\n } catch (error) {\n throw new Error('Error creating WebGL context');\n }\n\n // If we don't have a GL context, give up now\n if (!gl) {\n console.error('Unable to initialize WebGL. Your browser may not support it.');\n gl = null;\n }\n\n return gl;\n}\n\nfunction getImageDataType(image) {\n if (image.color) {\n return 'rgb';\n }\n\n var datatype = 'int';\n\n if (image.minPixelValue >= 0) {\n datatype = 'u' + datatype;\n }\n\n if (image.maxPixelValue > 255) {\n datatype += '16';\n } else {\n datatype += '8';\n }\n\n return datatype;\n}\n\nfunction getShaderProgram(image) {\n\n var datatype = getImageDataType(image);\n // We need a mechanism for\n // Choosing the shader based on the image datatype\n // Console.log(\"Datatype: \" + datatype);\n\n if (_index.shaders.hasOwnProperty(datatype)) {\n return _index.shaders[datatype];\n }\n\n return _index.shaders.rgb;\n}\n\nfunction generateTexture(image) {\n var TEXTURE_FORMAT = {\n uint8: gl.LUMINANCE,\n int8: gl.LUMINANCE_ALPHA,\n uint16: gl.LUMINANCE_ALPHA,\n int16: gl.RGB,\n rgb: gl.RGB\n };\n\n var TEXTURE_BYTES = {\n int8: 1, // Luminance\n uint16: 2, // Luminance + Alpha\n int16: 3, // RGB\n rgb: 3 // RGB\n };\n\n var imageDataType = getImageDataType(image);\n var format = TEXTURE_FORMAT[imageDataType];\n\n // GL texture configuration\n var texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n var imageData = _index.dataUtilities[imageDataType].storedPixelDataToImageData(image, image.width, image.height);\n\n gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData);\n\n // Calculate the size in bytes of this image in memory\n var sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];\n\n return {\n texture: texture,\n sizeInBytes: sizeInBytes\n };\n}\n\nfunction getImageTexture(image) {\n var imageTexture = _textureCache2.default.getImageTexture(image.imageId);\n\n if (!imageTexture) {\n // Console.log(\"Generating texture for imageid: \", image.imageId);\n imageTexture = generateTexture(image);\n _textureCache2.default.putImageTexture(image, imageTexture);\n }\n\n return imageTexture.texture;\n}\n\nfunction initBuffers() {\n positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW);\n\n texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0]), gl.STATIC_DRAW);\n}\n\nfunction renderQuad(shader, parameters, texture, width, height) {\n gl.clearColor(1.0, 0.0, 0.0, 1.0);\n gl.viewport(0, 0, width, height);\n\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(shader.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n for (var key in parameters) {\n var uniformLocation = gl.getUniformLocation(shader.program, key);\n\n if (!uniformLocation) {\n continue;\n\n // Disabling this error for now since RGB requires minPixelValue\n // but the other shaders do not.\n // throw `Could not access location for uniform: ${key}`;\n }\n\n var uniform = parameters[key];\n\n var type = uniform.type;\n var value = uniform.value;\n\n if (type === 'i') {\n gl.uniform1i(uniformLocation, value);\n } else if (type === 'f') {\n gl.uniform1f(uniformLocation, value);\n } else if (type === '2f') {\n gl.uniform2f(uniformLocation, value[0], value[1]);\n }\n }\n\n updateRectangle(gl, width, height);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n}\n\nfunction render(enabledElement) {\n // Resize the canvas\n var image = enabledElement.image;\n\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n var viewport = enabledElement.viewport;\n\n // Render the current image\n var shader = getShaderProgram(image);\n var texture = getImageTexture(image);\n var parameters = {\n u_resolution: { type: '2f',\n value: [image.width, image.height] },\n wc: { type: 'f',\n value: viewport.voi.windowCenter },\n ww: { type: 'f',\n value: viewport.voi.windowWidth },\n slope: { type: 'f',\n value: image.slope },\n intercept: { type: 'f',\n value: image.intercept },\n minPixelValue: { type: 'f',\n value: image.minPixelValue },\n invert: { type: 'i',\n value: viewport.invert ? 1 : 0 }\n };\n\n renderQuad(shader, parameters, texture, image.width, image.height);\n\n return renderCanvas;\n}\n\nfunction isWebGLAvailable() {\n // Adapted from\n // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas\n\n var options = {\n failIfMajorPerformanceCaveat: true\n };\n\n try {\n var canvas = document.createElement('canvas');\n\n return Boolean(window.WebGLRenderingContext) && (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));\n } catch (e) {\n return false;\n }\n}\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.dataUtilities = exports.shaders = undefined;\n\nvar _int = __webpack_require__(48);\n\nvar _int2 = __webpack_require__(49);\n\nvar _rgb = __webpack_require__(50);\n\nvar _uint = __webpack_require__(51);\n\nvar _uint2 = __webpack_require__(52);\n\nvar shaders = {\n int16: _int.int16Shader,\n int8: _int2.int8Shader,\n rgb: _rgb.rgbShader,\n uint16: _uint.uint16Shader,\n uint8: _uint2.uint8Shader\n};\n\nvar dataUtilities = {\n int16: _int.int16DataUtilities,\n int8: _int2.int8DataUtilities,\n rgb: _rgb.rgbDataUtilities,\n uint16: _uint.uint16DataUtilities,\n uint8: _uint2.uint8DataUtilities\n};\n\nexports.shaders = shaders;\nexports.dataUtilities = dataUtilities;\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* eslint no-bitwise: 0 */\n\nvar int16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack int16 into three uint8 channels (r, g, b)\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack int16 into three uint8 channels (r, g, b)\n var pixelData = image.getPixelData();\n var numberOfChannels = 3;\n var data = new Uint8Array(image.width * image.height * numberOfChannels);\n var offset = 0;\n\n for (var i = 0; i < pixelData.length; i++) {\n var val = Math.abs(pixelData[i]);\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nvar int16DataUtilities = exports.int16DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nint16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.0 + color.g*65536.0;' + 'if (color.b == 0.0)' + 'intensity = -intensity;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.int16Shader = int16Shader;\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar int8Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Store data in Uint8Array\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n // Transfer image data to alpha channel of WebGL texture\n // Store data in Uint8Array\n var pixelData = image.getPixelData();\n var numberOfChannels = 2;\n var data = new Uint8Array(image.width * image.height * numberOfChannels);\n var offset = 0;\n\n for (var i = 0; i < pixelData.length; i++) {\n data[offset++] = pixelData[i];\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nvar int8DataUtilities = exports.int8DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nint8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.;' + 'if (color.a == 0.0)' + 'intensity = -intensity;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.int8Shader = int8Shader;\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar rgbShader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack RGB images into a 3-channel RGB texture\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n // Only 3 channels, since we use WebGL's RGB texture format\n var numStoredPixels = image.width * image.height * 4;\n var numOutputPixels = image.width * image.height * 3;\n var storedPixelData = image.getPixelData();\n var data = new Uint8Array(numOutputPixels);\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n } else {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n }\n\n return data;\n}\n\nvar rgbDataUtilities = exports.rgbDataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nrgbShader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform float minPixelValue;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n\n// Get texture\n'vec3 color = texture2D(u_image, v_texCoord).xyz;' +\n\n// Rescale based on slope and intercept\n'color = color * 256.0 * slope + intercept;' +\n\n// Apply window settings\n'float center0 = wc - 0.5 - minPixelValue;' + 'float width0 = max(ww, 1.0);' + 'color = (color - center0) / width0 + 0.5;' +\n\n// RGBA output\n'gl_FragColor = vec4(color, 1);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' + '}';\n\nexports.rgbShader = rgbShader;\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* eslint no-bitwise: 0 */\n\nvar uint16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * For uint16 pack uint16 into two uint8 channels (r and a).\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack uint16 into two uint8 channels (r and a)\n var pixelData = image.getPixelData();\n var numberOfChannels = 2;\n var data = new Uint8Array(image.width * image.height * numberOfChannels);\n var offset = 0;\n\n for (var i = 0; i < pixelData.length; i++) {\n var val = pixelData[i];\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n }\n\n return data;\n}\n\nvar uint16DataUtilities = exports.uint16DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nuint16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.0 + color.a*65536.0;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.uint16Shader = uint16Shader;\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar uint8Shader = {};\n\n/**\n * Convert stored pixel data to image data. Here we will store\n * all data in the alpha channel.\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n // Transfer image data to alpha channel of WebGL texture\n return image.getPixelData();\n}\n\nvar uint8DataUtilities = exports.uint8DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nuint8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.0;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.uint8Shader = uint8Shader;\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar vertexShader = exports.vertexShader = 'attribute vec2 a_position;' + 'attribute vec2 a_texCoord;' + 'uniform vec2 u_resolution;' + 'varying vec2 v_texCoord;' + 'void main() {' + 'vec2 zeroToOne = a_position / u_resolution;' + 'vec2 zeroToTwo = zeroToOne * 2.0;' + 'vec2 clipSpace = zeroToTwo - 1.0;' + 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' + 'v_texCoord = a_texCoord;' + '}';\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, pt) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var transform = (0, _getTransform2.default)(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getTransform = __webpack_require__(10);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n if (element === undefined) {\n throw new Error('disable: element must not be undefined');\n }\n\n // Search for this element in this list of enabled elements\n var enabledElements = (0, _enabledElements.getEnabledElements)();\n\n for (var i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n // We found it!\n\n // Fire an event so dependencies can cleanup\n var eventData = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'CornerstoneElementDisabled', eventData);\n\n // Remove the child DOM elements that we created (e.g.canvas)\n enabledElements[i].element.removeChild(enabledElements[i].canvas);\n enabledElements[i].canvas = undefined;\n\n // Remove this element from the list of enabled elements\n enabledElements.splice(i, 1);\n\n break;\n }\n }\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, image, viewport) {\n if (element === undefined) {\n throw new Error('displayImage: parameter element must not be undefined');\n }\n if (image === undefined) {\n throw new Error('displayImage: parameter image must not be undefined');\n }\n\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var oldImage = enabledElement.image;\n\n enabledElement.image = image;\n\n if (enabledElement.layers && enabledElement.layers.length) {\n (0, _layers.setLayerImage)(element, image);\n }\n\n if (enabledElement.viewport === undefined) {\n enabledElement.viewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n }\n\n // Merge viewport\n if (viewport) {\n for (var attrname in viewport) {\n if (viewport[attrname] !== null) {\n enabledElement.viewport[attrname] = viewport[attrname];\n }\n }\n }\n\n var frameRate = void 0;\n\n if (enabledElement.lastImageTimeStamp !== undefined) {\n var timeSinceLastImage = (0, _now2.default)() - enabledElement.lastImageTimeStamp;\n\n frameRate = (1000 / timeSinceLastImage).toFixed();\n }\n\n enabledElement.lastImageTimeStamp = (0, _now2.default)();\n\n var newImageEventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n oldImage: oldImage,\n enabledElement: enabledElement,\n frameRate: frameRate\n };\n\n (0, _triggerEvent2.default)(enabledElement.element, 'CornerstoneNewImage', newImageEventData);\n\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _layers = __webpack_require__(25);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n return s4() + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + s4() + s4();\n};\n\nfunction s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n}\n\n/**\n * Generate a unique identifier\n *\n * @return {string} A unique identifier\n */\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('draw: image has not been loaded yet');\n }\n\n (0, _drawImage2.default)(enabledElement);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var enabledElements = (0, _enabledElements.getEnabledElements)();\n\n for (var i = 0; i < enabledElements.length; i++) {\n var ee = enabledElements[i];\n\n if (ee.invalid === true) {\n (0, _drawImage2.default)(ee, true);\n }\n }\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, options) {\n if (element === undefined) {\n throw new Error('enable: parameter element cannot be undefined');\n }\n\n // If this enabled element has the option set for WebGL, we should\n // Check if this device actually supports it\n if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {\n if (_index2.default.renderer.isWebGLAvailable()) {\n // If WebGL is available on the device, initialize the renderer\n // And return the renderCanvas from the WebGL rendering path\n _index2.default.renderer.initRenderer();\n options.renderer = 'webgl';\n } else {\n // If WebGL is not available on this device, we will fall back\n // To using the Canvas renderer\n console.error('WebGL not available, falling back to Canvas renderer');\n delete options.renderer;\n }\n }\n\n var canvas = document.createElement('canvas');\n\n element.appendChild(canvas);\n\n var enabledElement = {\n element: element,\n canvas: canvas,\n image: undefined, // Will be set once image is loaded\n invalid: false, // True if image needs to be drawn, false if not\n needsRedraw: true,\n options: options,\n layers: [],\n data: {},\n renderingTools: {}\n };\n\n (0, _enabledElements.addEnabledElement)(enabledElement);\n\n (0, _resize2.default)(element, true);\n\n /**\r\n * Draw the image immediately\r\n *\r\n * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks\r\n * @returns {void}\r\n */\n function draw(timestamp) {\n if (enabledElement.canvas === undefined) {\n return;\n }\n\n var eventDetails = {\n enabledElement: enabledElement,\n timestamp: timestamp\n };\n\n (0, _triggerEvent2.default)(enabledElement.element, 'CornerstonePreRender', eventDetails);\n\n if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {\n (0, _drawImageSync2.default)(enabledElement, enabledElement.invalid);\n }\n\n (0, _requestAnimationFrame2.default)(draw);\n }\n\n draw();\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _resize = __webpack_require__(36);\n\nvar _resize2 = _interopRequireDefault(_resize);\n\nvar _drawImageSync = __webpack_require__(61);\n\nvar _drawImageSync2 = _interopRequireDefault(_drawImageSync);\n\nvar _requestAnimationFrame = __webpack_require__(17);\n\nvar _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);\n\nvar _index = __webpack_require__(14);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n */\n\nfunction hasImageOrLayers(enabledElement) {\n return enabledElement.image !== undefined || enabledElement.layers.length;\n}\n\n/**\r\n * Enable an HTML Element for use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @param {Object} options Options for the enabledElement\r\n *\r\n * @return {void}\r\n */\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, invalidated) {\n var image = enabledElement.image;\n var element = enabledElement.element;\n var layers = enabledElement.layers || [];\n\n // Check if enabledElement can be redrawn\n if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {\n return;\n }\n\n // Start measuring the time needed to draw the image/layers\n var start = (0, _now2.default)();\n\n image.stats = {\n lastGetPixelDataTime: -1.0,\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\n lastPutImageDataTime: -1.0,\n lastRenderTime: -1.0,\n lastLutGenerateTime: -1.0\n };\n\n if (layers && layers.length) {\n (0, _drawCompositeImage2.default)(enabledElement, invalidated);\n } else if (image) {\n var render = image.render;\n\n if (!render) {\n if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '' && enabledElement.image.labelmap === true) {\n render = _renderLabelMapImage.renderLabelMapImage;\n } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {\n render = _renderPseudoColorImage.renderPseudoColorImage;\n } else if (image.color) {\n render = _renderColorImage.renderColorImage;\n } else {\n render = _renderGrayscaleImage.renderGrayscaleImage;\n }\n }\n\n render(enabledElement, invalidated);\n }\n\n // Calculate how long it took to draw the image/layers\n var renderTimeInMs = (0, _now2.default)() - start;\n\n var eventData = {\n viewport: enabledElement.viewport,\n element: element,\n image: image,\n enabledElement: enabledElement,\n canvasContext: enabledElement.canvas.getContext('2d'),\n renderTimeInMs: renderTimeInMs\n };\n\n image.stats.lastRenderTime = renderTimeInMs;\n\n enabledElement.invalid = false;\n enabledElement.needsRedraw = false;\n\n (0, _triggerEvent2.default)(element, 'CornerstoneImageRendered', eventData);\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _drawCompositeImage = __webpack_require__(62);\n\nvar _drawCompositeImage2 = _interopRequireDefault(_drawCompositeImage);\n\nvar _renderColorImage = __webpack_require__(8);\n\nvar _renderGrayscaleImage = __webpack_require__(16);\n\nvar _renderPseudoColorImage = __webpack_require__(24);\n\nvar _renderLabelMapImage = __webpack_require__(23);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, invalidated) {\n var element = enabledElement.element;\n var allLayers = (0, _layers.getLayers)(element);\n var activeLayer = (0, _layers.getActiveLayer)(element);\n var visibleLayers = (0, _layers.getVisibleLayers)(element);\n var resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports;\n\n // This state will help us to determine if the user has re-synced the\n // layers allowing us to make a new copy of the viewports\n enabledElement.lastSyncViewportsState = enabledElement.syncViewports;\n\n // Stores a copy of all viewports if the user has just synced them then we can use the\n // copies to calculate anything later (ratio, translation offset, rotation offset, etc)\n if (resynced) {\n allLayers.forEach(function (layer) {\n if (layer.viewport) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n });\n }\n\n // Sync all viewports in case it's activated\n if (enabledElement.syncViewports === true) {\n syncViewports(visibleLayers, activeLayer);\n }\n\n // Get the enabled element's canvas so we can draw to it\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Render all visible layers\n renderLayers(context, visibleLayers, invalidated);\n};\n\nvar _layers = __webpack_require__(25);\n\nvar _renderGrayscaleImage = __webpack_require__(16);\n\nvar _renderColorImage = __webpack_require__(8);\n\nvar _renderPseudoColorImage = __webpack_require__(24);\n\nvar _renderLabelMapImage = __webpack_require__(23);\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This is used to keep each of the layers' viewports in sync with the active layer\nvar originalViewportScale = {};\n\nfunction getViewportRatio(baseLayerId, targetLayerId) {\n return originalViewportScale[targetLayerId] / originalViewportScale[baseLayerId];\n}\n\n// Sync all viewports based on active layer's viewport\nfunction syncViewports(layers, activeLayer) {\n // If we intend to keep the viewport's scale, translation and rotation in sync,\n // loop through the layers\n layers.forEach(function (layer) {\n // Don't do anything to the active layer\n // Don't do anything if this layer has no viewport\n if (layer === activeLayer || !layer.viewport || !activeLayer.viewport) {\n return;\n }\n\n if (!originalViewportScale[layer.layerId]) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n\n var viewportRatio = getViewportRatio(activeLayer.layerId, layer.layerId);\n\n // Update the layer's translation and scale to keep them in sync with the first image\n // based on the ratios between the images\n layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;\n layer.viewport.rotation = activeLayer.viewport.rotation;\n layer.viewport.translation = {\n x: activeLayer.viewport.translation.x / viewportRatio,\n y: activeLayer.viewport.translation.y / viewportRatio\n };\n layer.viewport.hflip = activeLayer.viewport.hflip;\n layer.viewport.vflip = activeLayer.viewport.vflip;\n });\n}\n\n/**\n * Internal function to render all layers for a Cornerstone enabled element\n *\n * @param {CanvasRenderingContext2D} context Canvas context to draw upon\n * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element\n * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn\n * @returns {void}\n */\nfunction renderLayers(context, layers, invalidated) {\n // Loop through each layer and draw it to the canvas\n layers.forEach(function (layer, index) {\n if (!layer.image) {\n return;\n }\n\n context.save();\n\n // Set the layer's canvas to the pixel coordinate system\n layer.canvas = context.canvas;\n (0, _setToPixelCoordinateSystem2.default)(layer, context);\n\n // Render into the layer's canvas\n var colormap = layer.viewport.colormap || layer.options.colormap;\n var labelmap = layer.viewport.labelmap;\n var isInvalid = layer.invalid || invalidated;\n\n if (colormap && colormap !== '' && labelmap === true) {\n (0, _renderLabelMapImage.addLabelMapLayer)(layer, isInvalid);\n } else if (colormap && colormap !== '') {\n (0, _renderPseudoColorImage.addPseudoColorLayer)(layer, isInvalid);\n } else if (layer.image.color === true) {\n (0, _renderColorImage.addColorLayer)(layer, isInvalid);\n } else {\n // If this is the base layer, use the alpha channel for rendering of the grayscale image\n var useAlphaChannel = index === 0;\n\n (0, _renderGrayscaleImage.addGrayscaleLayer)(layer, isInvalid, useAlphaChannel);\n }\n\n // Apply any global opacity settings that have been defined for this layer\n if (layer.options && layer.options.opacity) {\n context.globalAlpha = layer.options.opacity;\n } else {\n context.globalAlpha = 1;\n }\n\n if (layer.options && layer.options.fillStyle) {\n context.fillStyle = layer.options.fillStyle;\n }\n\n // Set the pixelReplication property before drawing from the layer into the\n // composite canvas\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Draw from the current layer's canvas onto the enabled element's canvas\n var _layer$image = layer.image,\n width = _layer$image.width,\n height = _layer$image.height;\n\n\n context.drawImage(layer.canvas, 0, 0, width, height, 0, 0, width, height);\n context.restore();\n\n layer.invalid = false;\n });\n}\n\n/**\n * Internal API function to draw a composite image to a given enabled element\n *\n * @param {EnabledElement} enabledElement An enabled element to draw into\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getElementData = getElementData;\nexports.removeElementData = removeElementData;\n\nvar _enabledElements = __webpack_require__(0);\n\n/**\n * Retrieves any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n * @returns {*} Whatever data is stored for this enabled element\n */\nfunction getElementData(element, dataType) {\n var ee = (0, _enabledElements.getEnabledElement)(element);\n\n if (ee.data.hasOwnProperty(dataType) === false) {\n ee.data[dataType] = {};\n }\n\n return ee.data[dataType];\n}\n\n/**\n * Clears any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n *\n * @returns {void}\n */\nfunction removeElementData(element, dataType) {\n var ee = (0, _enabledElements.getEnabledElement)(element);\n\n delete ee.data[dataType];\n}\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, image) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.image;\n};\n\nvar _enabledElements = __webpack_require__(0);\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n var storedPixels = (0, _getStoredPixels2.default)(element, x, y, width, height);\n var ee = (0, _enabledElements.getEnabledElement)(element);\n var mlutfn = (0, _getModalityLUT2.default)(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);\n\n return storedPixels.map(mlutfn);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getStoredPixels = __webpack_require__(38);\n\nvar _getStoredPixels2 = _interopRequireDefault(_getStoredPixels);\n\nvar _getModalityLUT = __webpack_require__(26);\n\nvar _getModalityLUT2 = _interopRequireDefault(_getModalityLUT);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var viewport = enabledElement.viewport;\n\n if (viewport === undefined) {\n return;\n }\n\n // Return a copy of the viewport\n return Object.assign({}, viewport);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.loadImage = loadImage;\nexports.loadAndCacheImage = loadAndCacheImage;\nexports.registerImageLoader = registerImageLoader;\nexports.registerUnknownImageLoader = registerUnknownImageLoader;\n\nvar _imageCache = __webpack_require__(39);\n\nvar _events = __webpack_require__(15);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module deals with ImageLoaders, loading images and caching images\r\n */\n\nvar imageLoaders = {};\n\nvar unknownImageLoader = void 0;\n\n/**\r\n * Load an image using a registered Cornerstone Image Loader.\r\n *\r\n * The image loader that is used will be\r\n * determined by the image loader scheme matching against the imageId.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\nfunction loadImageFromImageLoader(imageId, options) {\n var colonIndex = imageId.indexOf(':');\n var scheme = imageId.substring(0, colonIndex);\n var loader = imageLoaders[scheme];\n var imagePromise = void 0;\n\n if (loader === undefined || loader === null) {\n if (unknownImageLoader !== undefined) {\n imagePromise = unknownImageLoader(imageId);\n\n return imagePromise;\n }\n\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\n }\n\n imagePromise = loader(imageId, options);\n\n // Broadcast an image loaded event once the image is loaded\n imagePromise.then(function (image) {\n (0, _triggerEvent2.default)(_events2.default, 'CornerstoneImageLoaded', { image: image });\n });\n\n return imagePromise;\n}\n\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\nfunction loadImage(imageId, options) {\n if (imageId === undefined) {\n throw new Error('loadImage: parameter imageId must not be undefined');\n }\n\n var imagePromise = (0, _imageCache.getImagePromise)(imageId);\n\n if (imagePromise !== undefined) {\n return imagePromise;\n }\n\n imagePromise = loadImageFromImageLoader(imageId, options);\n\n return imagePromise;\n}\n\n//\n\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\nfunction loadAndCacheImage(imageId, options) {\n if (imageId === undefined) {\n throw new Error('loadAndCacheImage: parameter imageId must not be undefined');\n }\n\n var imagePromise = (0, _imageCache.getImagePromise)(imageId);\n\n if (imagePromise !== undefined) {\n return imagePromise;\n }\n\n imagePromise = loadImageFromImageLoader(imageId, options);\n\n (0, _imageCache.putImagePromise)(imageId, imagePromise);\n\n return imagePromise;\n}\n\n/**\r\n * Registers an imageLoader plugin with cornerstone for the specified scheme\r\n *\r\n * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\r\n * @param {Function} imageLoader A Cornerstone Image Loader function\r\n * @returns {void}\r\n */\nfunction registerImageLoader(scheme, imageLoader) {\n imageLoaders[scheme] = imageLoader;\n}\n\n/**\r\n * Registers a new unknownImageLoader and returns the previous one\r\n *\r\n * @param {Function} imageLoader A Cornerstone Image Loader\r\n *\r\n * @returns {Function|Undefined} The previous Unknown Image Loader\r\n */\nfunction registerUnknownImageLoader(imageLoader) {\n var oldImageLoader = unknownImageLoader;\n\n unknownImageLoader = imageLoader;\n\n return oldImageLoader;\n}\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n enabledElement.invalid = true;\n enabledElement.needsRedraw = true;\n var eventData = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'CornerstoneInvalidated', eventData);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (imageId) {\n\n var enabledElements = (0, _enabledElements.getEnabledElementsByImageId)(imageId);\n\n enabledElements.forEach(function (enabledElement) {\n (0, _drawImage2.default)(enabledElement, true);\n });\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, pageX, pageY) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('image has not been loaded yet');\n }\n\n // Convert the pageX and pageY to the canvas client coordinates\n var rect = element.getBoundingClientRect();\n var clientX = pageX - rect.left - window.pageXOffset;\n var clientY = pageY - rect.top - window.pageYOffset;\n\n var pt = { x: clientX,\n y: clientY };\n var transform = (0, _getTransform2.default)(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getTransform = __webpack_require__(10);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, pt) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var transform = (0, _getTransform2.default)(enabledElement);\n\n return transform.transformPoint(pt.x, pt.y);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getTransform = __webpack_require__(10);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n enabledElement.viewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, enabledElement.image);\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, viewport) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n enabledElement.viewport.translation.x = viewport.translation.x;\n enabledElement.viewport.translation.y = viewport.translation.y;\n enabledElement.viewport.voi.windowCenter = viewport.voi.windowCenter;\n enabledElement.viewport.invert = viewport.invert;\n enabledElement.viewport.pixelReplication = viewport.pixelReplication;\n enabledElement.viewport.rotation = viewport.rotation;\n enabledElement.viewport.hflip = viewport.hflip;\n enabledElement.viewport.vflip = viewport.vflip;\n enabledElement.viewport.modalityLUT = viewport.modalityLUT;\n enabledElement.viewport.voiLUT = viewport.voiLUT;\n enabledElement.viewport.colormap = viewport.colormap;\n enabledElement.viewport.labelmap = viewport.labelmap;\n\n // Prevent window width from being too small (note that values close to zero are valid and can occur with\n // PET images in particular)\n enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);\n\n // Prevent scale from getting too small\n enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);\n\n // Normalize the rotation value to a positive rotation in degrees\n enabledElement.viewport.rotation %= 360;\n if (enabledElement.viewport.rotation < 0) {\n enabledElement.viewport.rotation += 360;\n }\n\n // Force the image to be updated since the viewport has been modified\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MIN_WINDOW_WIDTH = 0.000001;\nvar MIN_VIEWPORT_SCALE = 0.0001;\n\n/**\n * Sets the viewport for an element and corrects invalid values\n *\n * @param {HTMLElement} element - DOM element of the enabled element\n * @param {Viewport} viewport - Object containing the viewport properties\n * @returns {void}\n */\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _renderColorImage = __webpack_require__(8);\n\nvar _renderGrayscaleImage = __webpack_require__(16);\n\nvar _renderWebImage = __webpack_require__(35);\n\nexports.default = {\n colorImage: _renderColorImage.renderColorImage,\n grayscaleImage: _renderGrayscaleImage.renderGrayscaleImage,\n webImage: _renderWebImage.renderWebImage\n};\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addProvider = addProvider;\nexports.removeProvider = removeProvider;\n// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nvar providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param {Function} provider Metadata provider function\n * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @returns {void}\n */\nfunction addProvider(provider) {\n var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var i = void 0;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority: priority,\n provider: provider\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param {Function} provider Metadata provider function\n *\n * @returns {void}\n */\nfunction removeProvider(provider) {\n for (var i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param {String} type The type of metadata requested from the metadata store\n * @param {String} imageId The Cornerstone Image Object's imageId\n *\n * @returns {*} The metadata retrieved from the metadata store\n */\nfunction getMetaData(type, imageId) {\n // Invoke each provider in priority order until one returns something\n for (var i = 0; i < providers.length; i++) {\n var result = providers[i].provider(type, imageId);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexports.default = {\n addProvider: addProvider,\n removeProvider: removeProvider,\n get: getMetaData\n};\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.restoreImage = exports.convertToFalseColorImage = exports.convertImageToFalseColorImage = undefined;\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _pixelDataToFalseColorData = __webpack_require__(40);\n\nvar _pixelDataToFalseColorData2 = _interopRequireDefault(_pixelDataToFalseColorData);\n\nvar _colormap = __webpack_require__(27);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Retrieves the minimum and maximum pixel values from an Array of pixel data\n *\n * @param {Array} pixelData The input pixel data array\n *\n * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array\n */\nfunction getPixelValues(pixelData) {\n var minPixelValue = Number.MAX_VALUE;\n var maxPixelValue = Number.MIN_VALUE;\n var len = pixelData.length;\n var pixel = void 0;\n\n for (var i = 0; i < len; i++) {\n pixel = pixelData[i];\n minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;\n maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;\n }\n\n return {\n minPixelValue: minPixelValue,\n maxPixelValue: maxPixelValue\n };\n}\n\n/**\n * Retrieve a function that will allow an image object to be reset to its original form\n * after a false color mapping transformation\n *\n * @param {Image} image A Cornerstone Image Object\n *\n * @return {Function} A function for resetting an Image Object to its original form\n */\nfunction getRestoreImageMethod(image) {\n if (image.restore) {\n return image.restore;\n }\n\n var color = image.color;\n var rgba = image.rgba;\n var cachedLut = image.cachedLut;\n var slope = image.slope;\n var windowWidth = image.windowWidth;\n var windowCenter = image.windowCenter;\n var minPixelValue = image.minPixelValue;\n var maxPixelValue = image.maxPixelValue;\n\n return function () {\n image.color = color;\n image.rgba = rgba;\n image.cachedLut = cachedLut;\n image.slope = slope;\n image.windowWidth = windowWidth;\n image.windowCenter = windowCenter;\n image.minPixelValue = minPixelValue;\n image.maxPixelValue = maxPixelValue;\n\n if (image.origPixelData) {\n var pixelData = image.origPixelData;\n\n image.getPixelData = function () {\n return pixelData;\n };\n }\n\n // Remove some attributes added by false color mapping\n image.origPixelData = undefined;\n image.colormapId = undefined;\n image.falseColor = undefined;\n };\n}\n\n//\n// Then we need to make sure it will be converted into a colormap object if it's as string.\n\n/**\n * User can pass a colormap or its id as string to some of these public functions.\n * Then we need to make sure it will be converted into a colormap object if it's a string.\n *\n * @param {*} colormap A colormap ID or Object\n * @return {*} The colormap\n */\nfunction ensuresColormap(colormap) {\n if (colormap && typeof colormap === 'string') {\n colormap = (0, _colormap.getColormap)(colormap);\n }\n\n return colormap;\n}\n\n/**\n * Restores a false color image to its original version\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.\n */\nfunction restoreImage(image) {\n if (image.restore && typeof image.restore === 'function') {\n image.restore();\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Convert an image to a false color image\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {Boolean} - Whether or not the image has been converted to a false color image\n */\nfunction convertImageToFalseColorImage(image, colormap) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n // User can pass a colormap id or a colormap object\n colormap = ensuresColormap(colormap);\n\n var colormapId = colormap.getId();\n\n // Doesn't do anything if colormapId hasn't changed\n if (image.colormapId === colormapId) {\n // It has already being converted into a false color image\n // Using the colormapId passed as parameter\n return false;\n }\n\n // Restore the image attributes updated when converting to a false color image\n restoreImage(image);\n\n // Convert the image to a false color image\n if (colormapId) {\n var minPixelValue = image.minPixelValue || 0;\n var maxPixelValue = image.maxPixelValue || 255;\n\n image.restore = getRestoreImageMethod(image);\n\n var lookupTable = colormap.createLookupTable();\n\n lookupTable.setTableRange(minPixelValue, maxPixelValue);\n\n // Update the pixel data and render the new image\n (0, _pixelDataToFalseColorData2.default)(image, lookupTable);\n\n // Update min and max pixel values\n var pixelValues = getPixelValues(image.getPixelData());\n\n image.minPixelValue = pixelValues.minPixelValue;\n image.maxPixelValue = pixelValues.maxPixelValue;\n\n image.windowWidth = 255;\n image.windowCenter = 128;\n\n // Cache the last colormapId used for performance\n // Then it doesn't need to be re-rendered on next\n // Time if the user hasn't updated it\n image.colormapId = colormapId;\n }\n\n // Return `true` to tell the caller that the image has got updated\n return true;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {HTMLElement} element The Cornerstone element\n * @param {*} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {void}\n */\nfunction convertToFalseColorImage(element, colormap) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return convertImageToFalseColorImage(enabledElement.image, colormap);\n}\n\nexports.convertImageToFalseColorImage = convertImageToFalseColorImage;\nexports.convertToFalseColorImage = convertToFalseColorImage;\nexports.restoreImage = restoreImage;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// cornerstone.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 41);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a7065d67f6c3f57512c2","const enabledElements = [];\n\n/**\n * A two-dimensional vector\n *\n * @typedef {Object} vec2\n * @param {Number} x - The x distance\n * @param {Number} y - The y distance\n */\n\n/**\n * VOI\n *\n * @typedef {Object} VOI\n * @param {Number} windowWidth - Window Width for display\n * @param {Number} windowCenter - Window Center for display\n */\n\n/**\n * Lookup Table Array\n *\n * @typedef {Object} LUT\n * @property {Number} firstValueMapped\n * @property {Number} numBitsPerEntry\n * @property {Array} lut\n */\n\n/**\n * Image Statistics Object\n *\n * @typedef {Object} ImageStats\n *\n * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image\n * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array\n * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context\n * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run\n * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image\n */\n\n/**\n * An Image Object in Cornerstone\n *\n * @typedef {Object} Image\n *\n * @property {string} imageId - The imageId associated with this image object\n * @property {Number} minPixelValue - the minimum stored pixel value in the image\n * @property {Number} maxPixelValue - the maximum stored pixel value in the image\n * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified\n * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified\n * @property {Number} windowCenter - the default windowCenter to apply to the image\n * @property {Number} windowWidth - the default windowWidth to apply to the image\n * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color\n * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images\n * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.\n * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats\n * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience\n * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience\n * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience\n * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience\n * @property {Boolean} color - true if pixel data is RGB, false if grayscale\n * @property {Object} lut - The Lookup Table\n * @property {Boolean} rgba - Is the color pixel data stored in RGBA?\n * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known\n * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or heigh of each pixel) in mm or undefined if not known\n * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1\n * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.\n * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping\n * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping\n * @property {ImageStats} [stats] - Statistics for the last redraw of the image\n * @property {Object} cachedLut - Cached Lookup Table for this image.\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * A Viewport Settings Object Cornerstone\n *\n * @typedef {Object} Viewport\n *\n * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x\n * @param {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.\n * @param {VOI} [voi] - an object with properties windowWidth and windowCenter.\n * @property {boolean} [invert=false] - Whether or not the image is inverted.\n * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.\n * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false\n * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false\n * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0\n * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none\n * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * An Enabled Element in Cornerstone\n *\n * @typedef {Object} EnabledElement\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement\n * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters\n * for each of the enabled element's layers\n * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean\n */\n\n/**\n * An Enabled Element Layer in Cornerstone\n *\n * @typedef {Object} EnabledElementLayer\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Object} [options] - Layer drawing options\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n */\n\n\n/**\n * Retrieves a Cornerstone Enabled Element object\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n *\n * @returns {EnabledElement} A Cornerstone Enabled Element\n */\nexport function getEnabledElement (element) {\n if (element === undefined) {\n throw new Error('getEnabledElement: parameter element must not be undefined');\n }\n for (let i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n return enabledElements[i];\n }\n }\n\n throw new Error('element not enabled');\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object\n * @returns {void}\n */\nexport function addEnabledElement (enabledElement) {\n if (enabledElement === undefined) {\n throw new Error('getEnabledElement: enabledElement element must not be undefined');\n }\n\n enabledElements.push(enabledElement);\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {string} imageId A Cornerstone Image ID\n * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElementsByImageId (imageId) {\n const ees = [];\n\n enabledElements.forEach(function (enabledElement) {\n if (enabledElement.image && enabledElement.image.imageId === imageId) {\n ees.push(enabledElement);\n }\n });\n\n return ees;\n}\n\n/**\n * Retrieve all of the currently enabled Cornerstone elements\n *\n * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElements () {\n return enabledElements;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElements.js","/**\n * Use the performance.now() method if possible, and if not, use Date.now()\n *\n * @return {number} Time elapsed since the time origin\n */\nexport default function () {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/now.js","import { external } from './externalModules.js';\n\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {void}\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type.toLocaleLowerCase(), { detail });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail);\n }\n\n // TODO: remove jQuery event triggers\n external.$(el).trigger(type, detail);\n el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./triggerEvent.js","/**\n * This module contains a function that will set the canvas context to the pixel coordinates system\n * making it easy to draw geometry on the image\n */\n\nimport calculateTransform from './internal/calculateTransform.js';\n\n/**\n * Sets the canvas context transformation matrix to the pixel coordinate system. This allows\n * geometry to be driven using the canvas context using coordinates in the pixel coordinate system\n * @param {EnabledElement} enabledElement The\n * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas\n * @param {Number} [scale] Optional scale to apply\n * @returns {void}\n */\nexport default function (enabledElement, context, scale) {\n if (enabledElement === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');\n }\n if (context === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');\n }\n\n const transform = calculateTransform(enabledElement, scale);\n\n context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setToPixelCoordinateSystem.js","import { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the specified enabled element\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Boolean} [invalidated=false] Whether or not the image pixel data has been changed, necessitating a redraw\n *\n * @returns {void}\n */\nexport default function (element, invalidated = false) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined && !enabledElement.layers.length) {\n throw new Error('updateImage: image has not been loaded yet');\n }\n\n drawImage(enabledElement, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./updateImage.js","/**\n * Internal API function to draw an image to a given enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} [invalidated] - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated = false) {\n enabledElement.needsRedraw = true;\n if (invalidated) {\n enabledElement.invalid = true;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImage.js","/**\n * Creates a new viewport object containing default values for the image and canvas\n *\n * @param {HTMLElement} canvas A Canvas DOM element\n * @param {Image} image A Cornerstone Image Object\n * @returns {Viewport} viewport object\n */\nexport default function (canvas, image) {\n if (canvas === undefined) {\n throw new Error('getDefaultViewport: parameter canvas must not be undefined');\n }\n\n if (image === undefined) {\n return {\n scale: 1,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false\n };\n }\n\n // Fit image to window\n const verticalScale = canvas.height / image.rows;\n const horizontalScale = canvas.width / image.columns;\n const scale = Math.min(horizontalScale, verticalScale);\n\n return {\n scale,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: image.windowWidth,\n windowCenter: image.windowCenter\n },\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n voiLUT: image.voiLUT,\n colormap: image.colormap,\n labelmap: Boolean(image.labelmap)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getDefaultViewport.js","import { getColormap, getColormapsList } from './colormap.js';\nimport LookupTable from './lookupTable.js';\n\nexport default {\n getColormap,\n getColormapsList,\n LookupTable\n};\n\n\n\n// WEBPACK FOOTER //\n// ./colors/index.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport now from '../internal/now.js';\nimport generateLut from '../internal/generateLut.js';\nimport storedColorPixelDataToCanvasImageData from '../internal/storedColorPixelDataToCanvasImageData.js';\nimport storedRGBAPixelDataToCanvasImageData from '../internal/storedRGBAPixelDataToCanvasImageData.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport webGL from '../webgl/index.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getLut (image, viewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n image.cachedLut.invert === viewport.invert) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n}\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing\n if (enabledElement.viewport.voi.windowWidth === 255 &&\n enabledElement.viewport.voi.windowCenter === 128 &&\n enabledElement.viewport.invert === false &&\n image.getCanvas &&\n image.getCanvas()\n ) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const colorLut = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n storedRGBAPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n } else {\n storedColorPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderColorImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderColorImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\nexport function addColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addColorLayer: image must be loaded before it can be drawn');\n }\n\n // All multi-layer images should include the alpha value\n image.rgba = true;\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderColorImage.js","import getModalityLUT from './getModalityLUT.js';\r\nimport getVOILUT from './getVOILut.js';\r\n\r\n/**\r\n * Creates a LUT used while rendering to convert stored pixel values to\r\n * display pixels\r\n *\r\n * @param {Image} image A Cornerstone Image Object\r\n * @param {Number} windowWidth The Window Width\r\n * @param {Number} windowCenter The Window Center\r\n * @param {Boolean} invert A boolean describing whether or not the image has been inverted\r\n * @param {Array} [modalityLUT] A modality Lookup Table\r\n * @param {Array} [voiLUT] A Volume of Interest Lookup Table\r\n *\r\n * @returns {Uint8ClampedArray} A lookup table to apply to the image\r\n */\r\nexport default function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {\r\n const maxPixelValue = image.maxPixelValue;\r\n const minPixelValue = image.minPixelValue;\r\n const offset = Math.min(minPixelValue, 0);\r\n\r\n if (image.cachedLut === undefined) {\r\n const length = maxPixelValue - offset + 1;\r\n\r\n image.cachedLut = {};\r\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\r\n }\r\n\r\n const lut = image.cachedLut.lutArray;\r\n const mlutfn = getModalityLUT(image.slope, image.intercept, modalityLUT);\r\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\r\n\r\n if (invert === true) {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = 255 - vlutfn(mlutfn(storedValue));\r\n }\r\n } else {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = vlutfn(mlutfn(storedValue));\r\n }\r\n }\r\n\r\n return lut;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/generateLut.js","import calculateTransform from './calculateTransform.js';\n\nexport default function (enabledElement) {\n // For now we will calculate it every time it is requested.\n // In the future, we may want to cache it in the enabled element to speed things up.\n return calculateTransform(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getTransform.js","export default function (enabledElement, image) {\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n const renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/initializeRenderCanvas.js","export default function (enabledElement) {\n const imageId = enabledElement.image.imageId;\n const viewport = enabledElement.viewport;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap\n };\n\n return enabledElement.renderingTools;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/saveLastRendered.js","export default function (enabledElement, image) {\n const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n const lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;\n\n return (\n image.imageId !== lastRenderedImageId ||\n !lastRenderedViewport ||\n lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter ||\n lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth ||\n lastRenderedViewport.invert !== enabledElement.viewport.invert ||\n lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||\n lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||\n lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||\n lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||\n lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||\n lastRenderedViewport.colormap !== enabledElement.viewport.colormap\n );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/doesImageNeedToBeRendered.js","import { render, initRenderer, getRenderCanvas, isWebGLAvailable, isWebGLInitialized } from './renderer.js';\nimport createProgramFromString from './createProgramFromString.js';\nimport textureCache from './textureCache.js';\n\nconst mod = {\n createProgramFromString,\n renderer: {\n render,\n initRenderer,\n getRenderCanvas,\n isWebGLAvailable\n },\n textureCache\n};\n\nObject.defineProperty(mod, 'isWebGLInitialized', {\n enumerable: true,\n configurable: false,\n get: () => isWebGLInitialized\n});\n\nexport default mod;\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/index.js","class EventTarget {\n constructor () {\n this.listeners = {};\n }\n\n addEventListener (type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n\n removeEventListener (type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n const stack = this.listeners[type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n\n dispatchEvent (event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n\n const stack = this.listeners[event.type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n}\n\n\nconst events = new EventTarget();\n\nexport default events;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import storedPixelDataToCanvasImageData from '../internal/storedPixelDataToCanvasImageData.js';\nimport storedPixelDataToCanvasImageDataRGBA from '../internal/storedPixelDataToCanvasImageDataRGBA.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport webGL from '../webgl/index.js';\nimport getLut from './getLut.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated, useAlphaChannel = true) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // Gray scale image - apply the lut and put the resulting image onto the render canvas\n if (useAlphaChannel) {\n storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);\n } else {\n storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderGrayscaleImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a grayscale image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.\n This does not work if this layer is not the first layer in the enabledElement.\n * @returns {void}\n */\nexport function addGrayscaleLayer (layer, invalidated, useAlphaChannel = false) {\n if (layer === undefined) {\n throw new Error('addGrayscaleLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderGrayscaleImage.js","function requestFrame (callback) {\n window.setTimeout(callback, 1000 / 60);\n}\n\n/**\n * Polyfills requestAnimationFrame for older browsers.\n *\n * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.\n *\n * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.\n */\nexport default function (callback) {\n return window.requestAnimationFrame(callback) ||\n window.webkitRequestAnimationFrame(callback) ||\n window.mozRequestAnimationFrame(callback) ||\n window.oRequestAnimationFrame(callback) ||\n window.msRequestAnimationFrame(callback) ||\n requestFrame(callback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/requestAnimationFrame.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageData.js","import now from './now.js';\n\n/**\n * Converts stored color pixel values to display pixel values using a LUT.\n *\n * Note: Skips alpha value for any input image pixel data.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + (-minPixelValue)]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedColorPixelDataToCanvasImageData.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataColorLUT (image, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataColorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataColorLUT.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT (image, grayscaleLut, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","import { Transform } from './transform.js';\n\n/**\n * Calculate the transform for a Cornerstone enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {Number} [scale] The viewport scale\n * @return {Transform} The current transform\n */\nexport default function (enabledElement, scale) {\n\n const transform = new Transform();\n\n transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2);\n\n // Apply the rotation before scaling for non square pixels\n const angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n // Apply the scale\n let widthScale = enabledElement.viewport.scale;\n let heightScale = enabledElement.viewport.scale;\n\n if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {\n widthScale *= (enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing);\n } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {\n heightScale *= (enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing);\n }\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate(-angle * Math.PI / 180);\n }\n\n // Apply the pan offset\n transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y);\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Translate the origin back to the corner of the image so the event handlers can draw in image coordinate system\n transform.translate(-enabledElement.image.width / 2, -enabledElement.image.height / 2);\n\n return transform;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/calculateTransform.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataColorLUT from '../internal/storedPixelDataToCanvasImageDataColorLUT';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderLabelMapImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataColorLUT(image, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a label map image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderLabelMapImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for label map pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addLabelMapLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addLabelMapLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderLabelMapImage.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport getLut from './getLut.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from '../internal/storedPixelDataToCanvasImageDataPseudocolorLUT';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataPseudocolorLUT(image, lut, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderPseudoColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addPseudoColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addPseudoColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderPseudoColorImage.js","import guid from './internal/guid.js';\nimport { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport triggerCustomEvent from './triggerEvent.js';\n\n/**\n * Helper function to trigger an event on a Cornerstone element with\n * a specific layerId\n *\n * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)\n * @param {EnabledElement} enabledElement The Cornerstone enabled element\n * @param {String} layerId The layer's unique identifier\n * @returns {void}\n */\nfunction triggerEvent (eventName, enabledElement, layerId) {\n const element = enabledElement.element;\n const eventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n enabledElement,\n layerId\n };\n\n triggerCustomEvent(element, eventName, eventData);\n}\n\n/**\n * Rescale the target layer to the base layer based on the\n * relative size of each image and their pixel dimensions.\n *\n * This function will update the Viewport parameters of the\n * target layer to a new scale.\n *\n * @param {EnabledElementLayer} baseLayer The base layer\n * @param {EnabledElementLayer} targetLayer The target layer to rescale\n * @returns {void}\n */\nexport function rescaleImage (baseLayer, targetLayer) {\n if (baseLayer.layerId === targetLayer.layerId) {\n throw new Error('rescaleImage: both arguments represent the same layer');\n }\n\n const baseImage = baseLayer.image;\n const targetImage = targetLayer.image;\n\n // Return if these images don't have an imageId (e.g. for dynamic images)\n if (!baseImage.imageId || !targetImage.imageId) {\n return;\n }\n\n // Column pixel spacing need to be considered when calculating the\n // ratio between the layer added and base layer images\n const colRelative = (targetImage.columnPixelSpacing * targetImage.width) /\n (baseImage.columnPixelSpacing * baseImage.width);\n const viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;\n\n targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;\n}\n\n/**\n * Add a layer to a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image object to add as a new layer\n * @param {Object} options Options for the layer\n *\n * @returns {String} layerId The new layer's unique identifier\n */\nexport function addLayer (element, image, options) {\n const layerId = guid();\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n let viewport;\n\n if (image) {\n viewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (options && options.viewport) {\n viewport = Object.assign(viewport, options.viewport);\n }\n }\n\n // Set syncViewports to true by default when a new layer is added\n if (enabledElement.syncViewports !== false) {\n enabledElement.syncViewports = true;\n }\n\n const newLayer = {\n image,\n layerId,\n viewport,\n options: options || {},\n renderingTools: {}\n };\n\n // Rescale the new layer based on the base layer to make sure\n // they will have a proportional size (pixel spacing)\n if (layers.length && image) {\n rescaleImage(layers[0], newLayer);\n }\n\n layers.push(newLayer);\n\n triggerEvent('CornerstoneLayerAdded', enabledElement, layerId);\n\n // Set the layer as active if it's the first layer added\n if (layers.length === 1 && image) {\n setActiveLayer(element, layerId);\n }\n\n return layerId;\n}\n\n/**\n * Remove a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function removeLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index !== -1) {\n layers.splice(index, 1);\n\n // If the current layer is active, and we have other layers,\n // switch to the first layer that remains in the array\n if (layerId === enabledElement.activeLayerId && layers.length) {\n setActiveLayer(element, layers[0].layerId);\n }\n\n triggerEvent('CornerstoneLayerRemoved', enabledElement, layerId);\n }\n}\n\n/**\n * Retrieve a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @return {EnabledElementLayer} The layer\n */\nexport function getLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === layerId);\n}\n\n/**\n * Retrieve all layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers;\n}\n\n/**\n * Retrieve all visible layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getVisibleLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.layers.filter((layer) => layer.options &&\n layer.options.visible !== false &&\n layer.options.opacity !== 0);\n}\n\n/**\n * Set the active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function setActiveLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n // Stop here if this layer is already active\n if (enabledElement.activeLayerId === layerId) {\n return;\n }\n\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index === -1) {\n throw new Error('setActiveLayer: layer not found in layers array');\n }\n\n const layer = enabledElement.layers[index];\n\n if (!layer.image) {\n throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');\n }\n\n enabledElement.activeLayerId = layerId;\n enabledElement.image = layer.image;\n enabledElement.viewport = layer.viewport;\n\n updateImage(element);\n triggerEvent('CornerstoneActiveLayerChanged', enabledElement, layerId);\n}\n\n/**\n * Set a new image for a specific layerId\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image The image to be displayed in this layer\n * @param {String} [layerId] The unique identifier for the layer\n * @returns {void}\n */\nexport function setLayerImage (element, image, layerId) {\n const enabledElement = getEnabledElement(element);\n const baseLayer = enabledElement.layers[0];\n\n let layer;\n\n if (layerId) {\n layer = getLayer(element, layerId);\n } else {\n layer = getActiveLayer(element);\n }\n\n if (!layer) {\n throw new Error('setLayerImage: Layer not found');\n }\n\n layer.image = image;\n\n if (!image) {\n layer.viewport = undefined;\n\n return;\n }\n\n if (!layer.viewport) {\n const defaultViewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (layer.options && layer.options.viewport) {\n layer.viewport = Object.assign(defaultViewport, layer.options.viewport);\n }\n\n if (baseLayer.layerId !== layerId) {\n rescaleImage(baseLayer, layer);\n }\n }\n}\n\n/**\n * Retrieve the currently active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @return {EnabledElementLayer} The currently active layer\n */\nexport function getActiveLayer (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === enabledElement.activeLayerId);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./layers.js","/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n */\nfunction generateLinearModalityLUT (slope, intercept) {\n return (storedPixelValue) => storedPixelValue * slope + intercept;\n}\n\nfunction generateNonLinearModalityLUT (modalityLUT) {\n const minValue = modalityLUT.lut[0];\n const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return (storedPixelValue) => {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n */\nexport default function (slope, intercept, modalityLUT) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getModalityLUT.js","import LookupTable from './lookupTable.js';\n\nconst COLOR_TRANSPARENT = [0, 0, 0, 0];\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palattes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nconst colormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [\n [0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255],\n [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255],\n [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255],\n [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255],\n [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255],\n [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255],\n [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255],\n [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255],\n [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255],\n [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255],\n [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255],\n [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255],\n [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255],\n [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255],\n [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255],\n [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255],\n [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255],\n [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255],\n [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255],\n [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255],\n [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255],\n [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255],\n [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255],\n [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255],\n [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255],\n [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255],\n [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255],\n [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255],\n [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255],\n [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255],\n [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255],\n [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255],\n [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255],\n [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255],\n [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255],\n [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255],\n [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255],\n [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255],\n [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255],\n [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255],\n [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255],\n [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255],\n [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255],\n [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255],\n [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255],\n [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255],\n [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255],\n [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255],\n [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255],\n [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255],\n [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255],\n [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255],\n [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255],\n [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255],\n [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255],\n [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255],\n [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255],\n [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255],\n [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255],\n [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255],\n [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255],\n [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255],\n [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255],\n [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255],\n [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255],\n [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255],\n [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255],\n [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255],\n [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255],\n [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255],\n [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255],\n [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255],\n [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255],\n [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255],\n [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255],\n [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255],\n [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255],\n [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255],\n [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255],\n [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255],\n [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255],\n [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255],\n [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255],\n [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255],\n [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255],\n [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255],\n [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255],\n [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255],\n [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255],\n [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255],\n [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255],\n [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255],\n [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255],\n [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255],\n [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255],\n [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255],\n [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255],\n [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255],\n [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255],\n [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255],\n [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255],\n [255, 255, 255, 255]\n ]\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255],\n [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255],\n [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255],\n [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255],\n [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255],\n [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255],\n [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255],\n [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255],\n [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255],\n [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255],\n [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255],\n [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255],\n [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255],\n [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255],\n [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255],\n [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255],\n [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255],\n [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255],\n [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255],\n [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255],\n [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255],\n [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255],\n [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255],\n [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255],\n [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255],\n [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255],\n [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255],\n [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255],\n [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255],\n [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255],\n [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255],\n [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255],\n [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255],\n [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255],\n [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255],\n [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255],\n [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255],\n [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255],\n [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255],\n [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255],\n [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255],\n [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255],\n [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255],\n [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255],\n [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255],\n [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255],\n [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255],\n [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255],\n [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255],\n [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255],\n [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255]\n ]\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 1, 1]]\n }\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],\n green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],\n blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]\n }\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750],\n [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0],\n [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750],\n [0.857143, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1],\n [0.507937, 1, 1], [0.666667, 0.062500, 0.062500],\n [0.682540, 0, 0], [1, 0, 0]],\n blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500],\n [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500],\n [1, 0.09375, 0.09375]]\n }\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],\n blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]\n }\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 1, 1], [1, 0, 0]],\n blue: [[0, 1, 1], [1, 1, 1]]\n }\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0, 0]]\n }\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0.5, 0.5], [1, 1, 1]],\n blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]\n }\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 0, 0]]\n }\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 0, 0]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0.5, 0.5]]\n }\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],\n blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]\n }\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 0.7812, 0.7812]],\n blue: [[0, 0, 0], [1, 0.4975, 0.4975]]\n }\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0],\n [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0],\n [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1],\n [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80],\n [1, 0.80, 0.80]],\n green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000],\n [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000],\n [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1],\n [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000],\n [0.80, 0.6000, 0.6000], [0.85, 0, 0],\n [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],\n blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667],\n [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667],\n [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0],\n [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0],\n [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]\n }\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388],\n [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478],\n [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608],\n [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204],\n [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162],\n [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281],\n [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949],\n [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556],\n [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179],\n [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518],\n [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803],\n [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177],\n [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866],\n [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617],\n [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542],\n [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934],\n [1, 0.705673158, 0.705673158]],\n green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838],\n [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618],\n [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092],\n [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772],\n [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107],\n [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712],\n [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879],\n [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984],\n [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047],\n [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443],\n [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809],\n [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156],\n [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968],\n [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467],\n [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446],\n [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067],\n [1, 0.01555616, 0.01555616]],\n blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763],\n [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899],\n [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588],\n [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814],\n [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203],\n [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227],\n [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269],\n [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838],\n [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546],\n [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146],\n [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763],\n [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762],\n [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684],\n [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596],\n [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199],\n [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123],\n [1, 0.150232812, 0.150232812]]\n }\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991],\n [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429],\n [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256],\n [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502],\n [1, 0.031372550874948502, 0.031372550874948502]],\n green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449],\n [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144],\n [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698],\n [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169],\n [1, 0.18823529779911041, 0.18823529779911041]],\n blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359],\n [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171],\n [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162],\n [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]\n }\n }\n};\n\n// Generate linearly spaced vectors\n// http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\nfunction linspace (a, b, n) {\n n = n === null ? 100 : n;\n\n const increment = (b - a) / (n - 1);\n const vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n// Return the number of elements smaller than \"elem\" (binary search)\nfunction getRank (array, elem) {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = left + Math.floor((right - left) / 2);\n const midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n// Find the indices into a sorted array a such that, if the corresponding elements\n// In v were inserted before the indices, the order of a would be preserved.\n// http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\nfunction searchSorted (inputArray, values) {\n let i;\n const indexes = [];\n const len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n// Create an *N* -element 1-d lookup table\n//\n// *Data* represented by a list of x,y0,y1 mapping correspondences. Each element in this\n// List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n// A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n// Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n// The value of y for values of x <= to that given, and y1 is the value to be used for x >\n// Than that given). The list must start with x=0, end with x=1, and all values of x must be\n// In increasing order. Values between the given mapping points are determined by simple linear\n// Interpolation.\n//\n// The function returns an array \"result\" where result[x*(N-1)] gives the closest value for\n// Values of x between 0 and 1.\nfunction makeMappingArray (N, data, gamma) {\n let i;\n const x = [];\n const y0 = [];\n const y1 = [];\n const lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n const element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n const xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n const xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n const index = xLinSpaceIndexes[i];\n const colorPercent = ((xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]));\n const colorDelta = (y0[index] - y1[index - 1]);\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n// Colormap based on lookup tables using linear segments.\n//\n// The lookup table is generated using linear interpolation for each\n// Primary color, with the 0-1 domain divided into any number of\n// Segments.\n//\n// https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\nfunction createLinearSegmentedColormap (segmentedData, N, gamma) {\n let i;\n const lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n const redLut = makeMappingArray(N, segmentedData.red, gamma);\n const greenLut = makeMappingArray(N, segmentedData.green, gamma);\n const blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n const red = Math.round(redLut[i] * 255);\n const green = Math.round(greenLut[i] * 255);\n const blue = Math.round(blueLut[i] * 255);\n const rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/*\n* Return all colormaps (id and name) available\n*/\nexport function getColormapsList () {\n const colormaps = [];\n const keys = Object.keys(colormapsData);\n\n keys.forEach(function (key) {\n if (colormapsData.hasOwnProperty(key)) {\n const colormap = colormapsData[key];\n\n colormaps.push({\n id: key,\n name: colormap.name\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n *\n * @returns {*} The Colormap Object\n */\nexport function getColormap (id, colormapData) {\n let colormap = colormapsData[id];\n\n if (!colormap) {\n colormap = colormapsData[id] = colormapData || {\n name: '',\n colors: []\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);\n }\n\n return {\n getId () {\n return id;\n },\n\n getColorSchemeName () {\n return colormap.name;\n },\n\n setColorSchemeName (name) {\n colormap.name = name;\n },\n\n getNumberOfColors () {\n return colormap.colors.length;\n },\n\n setNumberOfColors (numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n\n getColor (index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n\n getColorRepeating (index) {\n const numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n\n setColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n\n addColor (rgba) {\n colormap.colors.push(rgba);\n },\n\n insertColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n\n removeColor (index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n\n clearColors () {\n colormap.colors = [];\n },\n\n buildLookupTable (lut) {\n if (!lut) {\n return;\n }\n\n const numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (let i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n\n createLookupTable () {\n const lut = new LookupTable();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n\n isValidIndex (index) {\n return (index >= 0) && (index < colormap.colors.length);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./colors/colormap.js","// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nconst BELOW_RANGE_COLOR_INDEX = 0;\nconst ABOVE_RANGE_COLOR_INDEX = 1;\nconst NAN_COLOR_INDEX = 2;\n\nfunction HSVToRGB (hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n const rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n const hueCase = Math.floor(hue * 6);\n const frac = 6 * hue - hueCase;\n const lx = val * (1 - sat);\n const ly = val * (1 - sat * frac);\n const lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\nclass LookupTable {\n constructor () {\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n setNumberOfTableValues (number) {\n this.NumberOfColors = number;\n }\n\n setRamp (ramp) {\n this.Ramp = ramp;\n }\n\n setTableRange (start, end) {\n // Set/Get the minimum/maximum scalar values for scalar mapping.\n // Scalar values less than minimum range value are clamped to minimum range value.\n // Scalar values greater than maximum range value are clamped to maximum range value.\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n\n setHueRange (start, end) {\n // Set the range in hue (using automatic generation). Hue ranges between [0,1].\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n\n setSaturationRange (start, end) {\n // Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n\n setValueRange (start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n\n setRange (start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n\n setAlphaRange (start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n\n getColor (scalar) {\n // Map one value through the lookup table and return the color as an\n // RGB array of doubles between 0 and 1.\n return this.mapValue(scalar);\n }\n\n build (force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n const maxIndex = this.NumberOfColors - 1;\n\n let hinc, sinc, vinc, ainc;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (let i = 0; i <= maxIndex; i++) {\n const hue = this.HueRange[0] + i * hinc;\n const sat = this.SaturationRange[0] + i * sinc;\n const val = this.ValueRange[0] + i * vinc;\n const alpha = this.AlphaRange[0] + i * ainc;\n\n const rgb = HSVToRGB(hue, sat, val);\n const c_rgba = [];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));\n c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));\n c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error(`Invalid Ramp value (${this.Ramp})`);\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n\n buildSpecialColors () {\n const numberOfColors = this.NumberOfColors;\n const belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n const aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n const nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n // Given a scalar value v, return an rgba color value from lookup table.\n mapValue (v) {\n const index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n\n getIndex (v) {\n const p = {};\n\n p.Range = [];\n p.MaxIndex = this.NumberOfColors - 1;\n\n // This was LookupShiftAndScale\n p.Shift = -this.TableRange[0];\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n let index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n\n setTableValue (index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error(`Can't set the table value for negative index (${index})`);\n }\n\n if (index >= this.NumberOfColors) {\n new Error(`Index ${index} is greater than the number of colors ${this.NumberOfColors}`);\n }\n\n this.Table[index] = rgba;\n\n if ((index === 0) || (index === this.NumberOfColors - 1)) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n}\n\nexport default LookupTable;\n\n\n\n// WEBPACK FOOTER //\n// ./colors/lookupTable.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let pixelValue;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataRGBA.js","// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nexport class Transform {\n constructor () {\n this.reset();\n }\n\n reset () {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n\n clone () {\n const transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n\n multiply (matrix) {\n const m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n const m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n const m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n const m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n const dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n const dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n\n invert () {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n\n rotate (rad) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n\n translate (x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n\n scale (sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n\n transformPoint (px, py) {\n const x = px;\n const y = py;\n\n px = x * this.m[0] + y * this.m[2] + this.m[4];\n py = x * this.m[1] + y * this.m[3] + this.m[5];\n\n return {\n x: px,\n y: py\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/transform.js","import lutMatches from './lutMatches.js';\nimport generateLut from '../internal/generateLut.js';\n\nexport default function (image, viewport, invalidated) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&\n lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&\n image.cachedLut.invert === viewport.invert &&\n invalidated !== true) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/getLut.js","import events from '../events.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * This module deals with caching image textures in VRAM for WebGL\r\n */\r\n\r\nconst imageCache = {};\r\n\r\nconst cachedImages = [];\r\n\r\nlet maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB\r\nlet cacheSizeInBytes = 0;\r\n\r\nfunction getCacheInfo () {\r\n return {\r\n maximumSizeInBytes,\r\n cacheSizeInBytes,\r\n numberOfImagesCached: cachedImages.length\r\n };\r\n}\r\n\r\nfunction purgeCacheIfNecessary () {\r\n // If max cache size has not been exceeded, do nothing\r\n if (cacheSizeInBytes <= maximumSizeInBytes) {\r\n return;\r\n }\r\n\r\n // Cache size has been exceeded, create list of images sorted by timeStamp\r\n // So we can purge the least recently used image\r\n function compare (a, b) {\r\n if (a.timeStamp > b.timeStamp) {\r\n return -1;\r\n }\r\n if (a.timeStamp < b.timeStamp) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n cachedImages.sort(compare);\r\n\r\n // Remove images as necessary\r\n while (cacheSizeInBytes > maximumSizeInBytes) {\r\n const lastCachedImage = cachedImages[cachedImages.length - 1];\r\n\r\n cacheSizeInBytes -= lastCachedImage.sizeInBytes;\r\n delete imageCache[lastCachedImage.imageId];\r\n cachedImages.pop();\r\n\r\n triggerEvent(events, 'CornerstoneWebGLTextureRemoved', { imageId: lastCachedImage.imageId });\r\n }\r\n\r\n const cacheInfo = getCacheInfo();\r\n\r\n triggerEvent(events, 'CornerstoneWebGLTextureCacheFull', cacheInfo);\r\n}\r\n\r\nfunction setMaximumSizeBytes (numBytes) {\r\n if (numBytes === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\r\n }\r\n if (numBytes.toFixed === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\r\n }\r\n\r\n maximumSizeInBytes = numBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction putImageTexture (image, imageTexture) {\r\n const imageId = image.imageId;\r\n\r\n if (image === undefined) {\r\n throw new Error('putImageTexture: image must not be undefined');\r\n }\r\n\r\n if (imageId === undefined) {\r\n throw new Error('putImageTexture: imageId must not be undefined');\r\n }\r\n\r\n if (imageTexture === undefined) {\r\n throw new Error('putImageTexture: imageTexture must not be undefined');\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {\r\n throw new Error('putImageTexture: imageId already in cache');\r\n }\r\n\r\n const cachedImage = {\r\n imageId,\r\n imageTexture,\r\n timeStamp: new Date(),\r\n sizeInBytes: imageTexture.sizeInBytes\r\n };\r\n\r\n imageCache[imageId] = cachedImage;\r\n cachedImages.push(cachedImage);\r\n\r\n if (imageTexture.sizeInBytes === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');\r\n }\r\n if (imageTexture.sizeInBytes.toFixed === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');\r\n }\r\n cacheSizeInBytes += cachedImage.sizeInBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction getImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('getImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n return;\r\n }\r\n\r\n // Bump time stamp for cached image\r\n cachedImage.timeStamp = new Date();\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction removeImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\r\n cacheSizeInBytes -= cachedImage.sizeInBytes;\r\n delete imageCache[imageId];\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction purgeCache () {\r\n while (cachedImages.length > 0) {\r\n const removedCachedImage = cachedImages.pop();\r\n\r\n delete imageCache[removedCachedImage.imageId];\r\n }\r\n cacheSizeInBytes = 0;\r\n}\r\n\r\nexport default {\r\n purgeCache,\r\n getImageTexture,\r\n putImageTexture,\r\n removeImageTexture,\r\n setMaximumSizeBytes\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/textureCache.js","let $ = window.$;\n\nconst external = {\n set $ (module) {\n $ = module;\n },\n get $ () {\n return $;\n }\n};\n\nexport { external };\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","/**\n * Creates and compiles a shader.\n *\n * @param {!WebGLRenderingContext} gl The WebGL Context.\n * @param {string} shaderSource The GLSL source code for the shader.\n * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.\n *\n * @return {!WebGLShader} The shader.\n */\nfunction compileShader (gl, shaderSource, shaderType) {\n\n // Create the shader object\n const shader = gl.createShader(shaderType);\n\n // Set the shader source code.\n gl.shaderSource(shader, shaderSource);\n\n // Compile the shader\n gl.compileShader(shader);\n\n // Check if it compiled\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong during compilation; get the error\n const infoLog = gl.getShaderInfoLog(shader);\n\n console.error(`Could not compile shader:\\n${infoLog}`);\n }\n\n return shader;\n}\n\n/**\n * Creates a program from 2 shaders.\n *\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShader A vertex shader.\n * @param {!WebGLShader} fragmentShader A fragment shader.\n * @return {!WebGLProgram} A program.\n */\nfunction createProgram (gl, vertexShader, fragmentShader) {\n\n // Create a program.\n const program = gl.createProgram();\n\n // Attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n // Link the program.\n gl.linkProgram(program);\n\n // Check if it linked.\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong with the link\n const infoLog = gl.getProgramInfoLog(program);\n\n console.error(`WebGL program filed to link:\\n${infoLog}`);\n }\n\n return program;\n}\n\n/**\n * Creates a program from 2 shaders source (Strings)\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShaderSrc Vertex shader string\n * @param {!WebGLShader} fragShaderSrc Fragment shader string\n * @return {!WebGLProgram} A program\n */\nexport default function (gl, vertexShaderSrc, fragShaderSrc) {\n const vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);\n const fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);\n\n\n return createProgram(gl, vertexShader, fragShader);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/createProgramFromString.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport { renderColorImage } from './renderColorImage.js';\n\n/**\n * API function to draw a standard web image (PNG, JPG) to an enabledImage\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderWebImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderWebImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderWebImage: image must be loaded before it can be drawn');\n }\n\n // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image\n // Directly. If any of those are changed, we call renderColorImage() to apply the lut\n if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth &&\n enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter &&\n enabledElement.viewport.invert === false) {\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n context.drawImage(image.getImage(), 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n } else {\n renderColorImage(enabledElement, invalidated);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderWebImage.js","import { getEnabledElement } from './enabledElements.js';\r\nimport fitToWindow from './fitToWindow.js';\r\nimport updateImage from './updateImage.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nfunction setCanvasSize (element, canvas) {\r\n // The device pixel ratio is 1.0 for normal displays and > 1.0\r\n // For high DPI displays like Retina\r\n /*\r\n\r\n This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas\r\n is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to\r\n a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel\r\n produces incorrect results. I couldn't find any way to determine when the DPI changed other than\r\n by polling which is not very clean. If anyone has any ideas here, please let me know, but for now\r\n we will disable this functionality. We may want\r\n to add a mechanism to optionally enable this functionality if we can determine it is safe to do\r\n so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing\r\n to be cautious here since I would rather not have bug reports or safety issues related to this\r\n scenario.\r\n\r\n var devicePixelRatio = window.devicePixelRatio;\r\n if(devicePixelRatio === undefined) {\r\n devicePixelRatio = 1.0;\r\n }\r\n */\r\n\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.width !== element.clientWidth) {\r\n canvas.width = element.clientWidth;\r\n canvas.style.width = `${element.clientWidth}px`;\r\n }\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.height !== element.clientHeight) {\r\n canvas.height = element.clientHeight;\r\n canvas.style.height = `${element.clientHeight}px`;\r\n }\r\n}\r\n\r\n/**\r\n * Resizes an enabled element and optionally fits the image to window\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {Boolean} fitViewportToWindow true to refit, false to leave viewport parameters as they are\r\n * @returns {void}\r\n */\r\nexport default function (element, fitViewportToWindow) {\r\n\r\n const enabledElement = getEnabledElement(element);\r\n\r\n setCanvasSize(element, enabledElement.canvas);\r\n\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'CornerstoneElementResized', eventData);\r\n\r\n if (enabledElement.image === undefined) {\r\n return;\r\n }\r\n\r\n if (fitViewportToWindow === true) {\r\n fitToWindow(element);\r\n } else {\r\n updateImage(element);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./resize.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @return {{width, height}} The Image dimensions\n */\nfunction getImageSize (enabledElement) {\n if (enabledElement.viewport.rotation === 0 || enabledElement.viewport.rotation === 180) {\n return {\n width: enabledElement.image.width,\n height: enabledElement.image.height\n };\n }\n\n return {\n width: enabledElement.image.height,\n height: enabledElement.image.width\n };\n\n}\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param {HTMLElement} element The Cornerstone element to update\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const imageSize = getImageSize(enabledElement);\n\n const verticalScale = enabledElement.canvas.height / imageSize.height;\n const horizontalScale = enabledElement.canvas.width / imageSize.width;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = Math.min(horizontalScale, verticalScale);\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./fitToWindow.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves an array of stored pixel values from a rectangular region of an image\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The stored pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n if (element === undefined) {\n throw new Error('getStoredPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = getEnabledElement(element);\n const storedPixels = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < width; column++) {\n const spIndex = ((row + y) * enabledElement.image.columns) + (column + x);\n\n storedPixels[index++] = pixelData[spIndex];\n }\n }\n\n return storedPixels;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getStoredPixels.js","import events from './events.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * This module deals with caching images\n */\nlet maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB\nlet cacheSizeInBytes = 0;\n\n// Dictionary of imageId to cachedImage objects\nconst imageCacheDict = {};\n\n// Array of cachedImage objects\nexport const cachedImages = [];\n\nexport function setMaximumSizeBytes (numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n\n triggerEvent(events, 'CornerstoneImageCacheMaximumSizeChanged');\n\n purgeCacheIfNecessary();\n}\n\nfunction purgeCacheIfNecessary () {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare (a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary)\n while (cacheSizeInBytes > maximumSizeInBytes) {\n const lastCachedImage = cachedImages[cachedImages.length - 1];\n const imageId = lastCachedImage.imageId;\n\n removeImagePromise(imageId);\n\n triggerEvent(events, 'CornerstoneImageCachePromiseRemoved', { imageId });\n }\n\n const cacheInfo = getCacheInfo();\n\n triggerEvent(events, 'CornerstoneImageCacheFull', cacheInfo);\n}\n\nexport function putImagePromise (imageId, imagePromise) {\n if (imageId === undefined) {\n throw new Error('putImagePromise: imageId must not be undefined');\n }\n if (imagePromise === undefined) {\n throw new Error('putImagePromise: imagePromise must not be undefined');\n }\n if (imageCacheDict.hasOwnProperty(imageId) === true) {\n throw new Error('putImagePromise: imageId already in cache');\n }\n\n const cachedImage = {\n loaded: false,\n imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imagePromise,\n timeStamp: Date.now(),\n sizeInBytes: 0\n };\n\n imageCacheDict[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n imagePromise.then(function (image) {\n if (cachedImages.indexOf(cachedImage) === -1) {\n // If the image has been purged before being loaded, we stop here.\n return;\n }\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n\n if (image.sizeInBytes === undefined) {\n throw new Error('putImagePromise: sizeInBytes must not be undefined');\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error('putImagePromise: image.sizeInBytes is not a number');\n }\n\n cachedImage.sizeInBytes = image.sizeInBytes;\n cacheSizeInBytes += cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'addImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'CornerstoneImageCacheChanged', eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n\n purgeCacheIfNecessary();\n });\n}\n\nexport function getImagePromise (imageId) {\n if (imageId === undefined) {\n throw new Error('getImagePromise: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imagePromise;\n}\n\nexport function removeImagePromise (imageId) {\n if (imageId === undefined) {\n throw new Error('removeImagePromise: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImagePromise: imageId was not present in imageCache');\n }\n\n cachedImage.imagePromise.reject();\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'deleteImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'CornerstoneImageCacheChanged', eventDetails);\n decache(cachedImage.imagePromise);\n\n delete imageCacheDict[imageId];\n}\n\nexport function getCacheInfo () {\n return {\n maximumSizeInBytes,\n cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\n// This method should only be called by `removeImagePromise` because it's\n// The one that knows how to deal with shared cache keys and cache size.\nfunction decache (imagePromise) {\n imagePromise.then(function (image) {\n if (image.decache) {\n image.decache();\n }\n });\n}\n\nexport function purgeCache () {\n while (cachedImages.length > 0) {\n const removedCachedImage = cachedImages[0];\n\n removeImagePromise(removedCachedImage.imageId);\n }\n}\n\nexport function changeImageIdCacheSize (imageId, newCacheSize) {\n const cacheEntry = imageCacheDict[imageId];\n\n if (cacheEntry) {\n cacheEntry.imagePromise.then(function (image) {\n const cacheSizeDifference = newCacheSize - image.sizeInBytes;\n\n image.sizeInBytes = newCacheSize;\n cacheEntry.sizeInBytes = newCacheSize;\n cacheSizeInBytes += cacheSizeDifference;\n\n const eventDetails = {\n action: 'changeImageSize',\n image\n };\n\n triggerEvent(events, 'CornerstoneImageCacheChanged', eventDetails);\n });\n }\n}\n\nexport default {\n imageCache: imageCacheDict,\n cachedImages,\n setMaximumSizeBytes,\n putImagePromise,\n getImagePromise,\n removeImagePromise,\n getCacheInfo,\n purgeCache,\n changeImageIdCacheSize\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageCache.js","import colors from './colors/index.js';\n\n/**\n * Converts the image pixel data into a false color data\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Object} lookupTable A lookup table Object\n *\n * @returns {void}\n */\nexport default function (image, lookupTable) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = image.width * image.height;\n const origPixelData = image.origPixelData || image.getPixelData();\n const storedColorPixelData = new Uint8Array(numPixels * 4);\n let sp;\n let mapped;\n\n image.color = true;\n image.falseColor = true;\n image.origPixelData = origPixelData;\n\n if (lookupTable instanceof colors.LookupTable) {\n lookupTable.build();\n\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n mapped = lookupTable.mapValue(sp);\n storedColorPixelData[canvasImageDataIndex++] = mapped[0];\n storedColorPixelData[canvasImageDataIndex++] = mapped[1];\n storedColorPixelData[canvasImageDataIndex++] = mapped[2];\n storedColorPixelData[canvasImageDataIndex++] = mapped[3];\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][3]; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha\n }\n }\n\n image.rgba = true;\n image.cachedLut = undefined;\n image.render = undefined;\n image.slope = 1;\n image.intercept = 0;\n image.minPixelValue = 0;\n image.maxPixelValue = 255;\n image.windowWidth = 255;\n image.windowCenter = 128;\n image.getPixelData = () => storedColorPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelDataToFalseColorData.js","// Internal (some of these are from old internal/legacy expose)\nexport { default as drawImage } from './internal/drawImage.js';\nexport { default as generateLut } from './internal/generateLut.js';\nexport { default as getDefaultViewport } from './internal/getDefaultViewport.js';\nexport { default as requestAnimationFrame } from './internal/requestAnimationFrame.js';\nexport { default as storedPixelDataToCanvasImageData } from './internal/storedPixelDataToCanvasImageData.js';\nexport { default as storedColorPixelDataToCanvasImageData } from './internal/storedColorPixelDataToCanvasImageData.js';\nexport { default as storedPixelDataToCanvasImageDataColorLUT } from './internal/storedPixelDataToCanvasImageDataColorLUT.js';\nexport { default as storedPixelDataToCanvasImageDataPseudocolorLUT } from './internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js';\n\nexport { default as internal } from './internal/index.js';\n\n// Rendering\nexport { renderLabelMapImage } from './rendering/renderLabelMapImage.js';\nexport { renderPseudoColorImage } from './rendering/renderPseudoColorImage.js';\nexport { renderColorImage } from './rendering/renderColorImage.js';\nexport { renderGrayscaleImage } from './rendering/renderGrayscaleImage.js';\nexport { renderWebImage } from './rendering/renderWebImage.js';\n\nexport { default as canvasToPixel } from './canvasToPixel.js';\nexport { default as disable } from './disable.js';\nexport { default as displayImage } from './displayImage.js';\nexport { default as draw } from './draw.js';\nexport { default as drawInvalidated } from './drawInvalidated.js';\nexport { default as enable } from './enable.js';\nexport { getElementData, removeElementData } from './enabledElementData.js';\nexport {\n getEnabledElement,\n addEnabledElement,\n getEnabledElementsByImageId,\n getEnabledElements\n} from './enabledElements.js';\n\nexport {\n addLayer,\n removeLayer,\n getLayer,\n getLayers,\n getVisibleLayers,\n setActiveLayer,\n getActiveLayer,\n setLayerImage\n} from './layers.js';\n\nexport { default as fitToWindow } from './fitToWindow.js';\nexport { default as getDefaultViewportForImage } from './getDefaultViewportForImage.js';\nexport { default as getImage } from './getImage.js';\nexport { default as getPixels } from './getPixels.js';\nexport { default as getStoredPixels } from './getStoredPixels.js';\nexport { default as getViewport } from './getViewport.js';\nexport {\n loadImage,\n loadAndCacheImage,\n registerImageLoader,\n registerUnknownImageLoader\n} from './imageLoader.js';\n\nexport { default as invalidate } from './invalidate.js';\nexport { default as invalidateImageId } from './invalidateImageId.js';\nexport { default as pageToPixel } from './pageToPixel.js';\nexport { default as pixelToCanvas } from './pixelToCanvas.js';\nexport { default as reset } from './reset.js';\nexport { default as resize } from './resize.js';\nexport { default as setToPixelCoordinateSystem } from './setToPixelCoordinateSystem.js';\nexport { default as setViewport } from './setViewport.js';\nexport { default as updateImage } from './updateImage.js';\nexport { default as pixelDataToFalseColorData } from './pixelDataToFalseColorData.js';\n\nexport { default as rendering } from './rendering/index.js';\nexport { default as imageCache } from './imageCache.js';\nexport { default as metaData } from './metaData.js';\nexport { default as webGL } from './webgl/index.js';\nexport { default as colors } from './colors/index.js';\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage } from './falseColorMapping.js';\n\nexport { default as events } from './events.js';\nexport { default as triggerEvent } from './triggerEvent.js';\nexport { external } from './externalModules.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n */\n\n/**\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateLinearVOILUT (windowWidth, windowCenter) {\n return function (modalityLutValue) {\n return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateNonLinearVOILUT (voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;\n const shift = bitsPerEntry - 8;\n const minValue = voiLUT.lut[0] >> shift;\n const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n */\nexport default function (windowWidth, windowCenter, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getVOILut.js","import drawImage from './drawImage.js';\r\nimport generateLut from './generateLut.js';\r\nimport getDefaultViewport from './getDefaultViewport.js';\r\nimport requestAnimationFrame from './requestAnimationFrame.js';\r\nimport storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA.js';\r\nimport storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataColorLUT from './storedPixelDataToCanvasImageDataColorLUT.js';\r\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from './storedPixelDataToCanvasImageDataPseudocolorLUT.js';\r\nimport getTransform from './getTransform.js';\r\nimport calculateTransform from './calculateTransform.js';\r\nimport { Transform } from './transform.js';\r\n\r\nexport default {\r\n drawImage,\r\n generateLut,\r\n getDefaultViewport,\r\n requestAnimationFrame,\r\n storedPixelDataToCanvasImageData,\r\n storedPixelDataToCanvasImageDataRGBA,\r\n storedPixelDataToCanvasImageDataColorLUT,\r\n storedPixelDataToCanvasImageDataPseudocolorLUT,\r\n storedColorPixelDataToCanvasImageData,\r\n getTransform,\r\n calculateTransform,\r\n Transform\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/index.js","/**\n * Check if two lookup tables match\n *\n * @param {LUT} a A lookup table function\n * @param {LUT} b Another lookup table function\n * @return {boolean} Whether or not they match\n */\nexport default function (a, b) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return (a.id === b.id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/lutMatches.js","import now from './now.js';\n\n/**\n * Converts stored RGBA color pixel values to display pixel values using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedRGBAPixelDataToCanvasImageData.js","/* eslint no-bitwise: 0 */\n\nimport { shaders, dataUtilities } from './shaders/index.js';\nimport { vertexShader } from './vertexShader.js';\nimport textureCache from './textureCache.js';\nimport createProgramFromString from './createProgramFromString.js';\n\nconst renderCanvas = document.createElement('canvas');\nlet gl;\nlet texCoordBuffer;\nlet positionBuffer;\nlet isWebGLInitialized = false;\n\nexport { isWebGLInitialized };\n\nexport function getRenderCanvas () {\n return renderCanvas;\n}\n\nfunction initShaders () {\n for (const id in shaders) {\n // Console.log(\"WEBGL: Loading shader\", id);\n const shader = shaders[id];\n\n shader.attributes = {};\n shader.uniforms = {};\n shader.vert = vertexShader;\n\n shader.program = createProgramFromString(gl, shader.vert, shader.frag);\n\n shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');\n gl.enableVertexAttribArray(shader.attributes.texCoordLocation);\n\n shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');\n gl.enableVertexAttribArray(shader.attributes.positionLocation);\n\n shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');\n }\n}\n\nexport function initRenderer () {\n if (isWebGLInitialized === true) {\n // Console.log(\"WEBGL Renderer already initialized\");\n return;\n }\n\n if (initWebGL(renderCanvas)) {\n initBuffers();\n initShaders();\n // Console.log(\"WEBGL Renderer initialized!\");\n isWebGLInitialized = true;\n }\n}\n\nfunction updateRectangle (gl, width, height) {\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n width, height,\n 0, height,\n width, 0,\n 0, 0]), gl.STATIC_DRAW);\n}\n\nfunction handleLostContext (event) {\n event.preventDefault();\n console.warn('WebGL Context Lost!');\n}\n\nfunction handleRestoredContext (event) {\n event.preventDefault();\n isWebGLInitialized = false;\n textureCache.purgeCache();\n initRenderer();\n // Console.log('WebGL Context Restored.');\n}\n\nfunction initWebGL (canvas) {\n\n gl = null;\n try {\n // Try to grab the standard context. If it fails, fallback to experimental.\n const options = {\n preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element\n };\n\n // ---------------- Testing purposes -------------\n // If (debug === true && WebGLDebugUtils) {\n // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);\n // }\n // ---------------- Testing purposes -------------\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n // Set up event listeners for context lost / context restored\n canvas.removeEventListener('webglcontextlost', handleLostContext, false);\n canvas.addEventListener('webglcontextlost', handleLostContext, false);\n\n canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);\n canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);\n\n } catch (error) {\n throw new Error('Error creating WebGL context');\n }\n\n // If we don't have a GL context, give up now\n if (!gl) {\n console.error('Unable to initialize WebGL. Your browser may not support it.');\n gl = null;\n }\n\n return gl;\n}\n\nfunction getImageDataType (image) {\n if (image.color) {\n return 'rgb';\n }\n\n let datatype = 'int';\n\n if (image.minPixelValue >= 0) {\n datatype = `u${datatype}`;\n }\n\n if (image.maxPixelValue > 255) {\n datatype += '16';\n } else {\n datatype += '8';\n }\n\n return datatype;\n}\n\nfunction getShaderProgram (image) {\n\n const datatype = getImageDataType(image);\n // We need a mechanism for\n // Choosing the shader based on the image datatype\n // Console.log(\"Datatype: \" + datatype);\n\n if (shaders.hasOwnProperty(datatype)) {\n return shaders[datatype];\n }\n\n return shaders.rgb;\n}\n\nfunction generateTexture (image) {\n const TEXTURE_FORMAT = {\n uint8: gl.LUMINANCE,\n int8: gl.LUMINANCE_ALPHA,\n uint16: gl.LUMINANCE_ALPHA,\n int16: gl.RGB,\n rgb: gl.RGB\n };\n\n const TEXTURE_BYTES = {\n int8: 1, // Luminance\n uint16: 2, // Luminance + Alpha\n int16: 3, // RGB\n rgb: 3 // RGB\n };\n\n const imageDataType = getImageDataType(image);\n const format = TEXTURE_FORMAT[imageDataType];\n\n // GL texture configuration\n const texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n const imageData = dataUtilities[imageDataType].storedPixelDataToImageData(image, image.width, image.height);\n\n gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData);\n\n // Calculate the size in bytes of this image in memory\n const sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];\n\n return {\n texture,\n sizeInBytes\n };\n}\n\nfunction getImageTexture (image) {\n let imageTexture = textureCache.getImageTexture(image.imageId);\n\n if (!imageTexture) {\n // Console.log(\"Generating texture for imageid: \", image.imageId);\n imageTexture = generateTexture(image);\n textureCache.putImageTexture(image, imageTexture);\n }\n\n return imageTexture.texture;\n}\n\nfunction initBuffers () {\n positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1, 1,\n 0, 1,\n 1, 0,\n 0, 0\n ]), gl.STATIC_DRAW);\n\n\n texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1.0, 1.0,\n 0.0, 1.0,\n 1.0, 0.0,\n 0.0, 0.0\n ]), gl.STATIC_DRAW);\n}\n\nfunction renderQuad (shader, parameters, texture, width, height) {\n gl.clearColor(1.0, 0.0, 0.0, 1.0);\n gl.viewport(0, 0, width, height);\n\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(shader.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n for (const key in parameters) {\n const uniformLocation = gl.getUniformLocation(shader.program, key);\n\n if (!uniformLocation) {\n continue;\n\n // Disabling this error for now since RGB requires minPixelValue\n // but the other shaders do not.\n // throw `Could not access location for uniform: ${key}`;\n }\n\n const uniform = parameters[key];\n\n const type = uniform.type;\n const value = uniform.value;\n\n if (type === 'i') {\n gl.uniform1i(uniformLocation, value);\n } else if (type === 'f') {\n gl.uniform1f(uniformLocation, value);\n } else if (type === '2f') {\n gl.uniform2f(uniformLocation, value[0], value[1]);\n }\n }\n\n updateRectangle(gl, width, height);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n}\n\nexport function render (enabledElement) {\n // Resize the canvas\n const image = enabledElement.image;\n\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const viewport = enabledElement.viewport;\n\n // Render the current image\n const shader = getShaderProgram(image);\n const texture = getImageTexture(image);\n const parameters = {\n u_resolution: { type: '2f',\n value: [image.width, image.height] },\n wc: { type: 'f',\n value: viewport.voi.windowCenter },\n ww: { type: 'f',\n value: viewport.voi.windowWidth },\n slope: { type: 'f',\n value: image.slope },\n intercept: { type: 'f',\n value: image.intercept },\n minPixelValue: { type: 'f',\n value: image.minPixelValue },\n invert: { type: 'i',\n value: viewport.invert ? 1 : 0 }\n };\n\n renderQuad(shader, parameters, texture, image.width, image.height);\n\n return renderCanvas;\n}\n\nexport function isWebGLAvailable () {\n // Adapted from\n // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas\n\n const options = {\n failIfMajorPerformanceCaveat: true\n };\n\n try {\n const canvas = document.createElement('canvas');\n\n\n return Boolean(window.WebGLRenderingContext) &&\n (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));\n } catch (e) {\n return false;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/renderer.js","import { int16Shader, int16DataUtilities } from './int16.js';\nimport { int8Shader, int8DataUtilities } from './int8.js';\nimport { rgbShader, rgbDataUtilities } from './rgb.js';\nimport { uint16Shader, uint16DataUtilities } from './uint16.js';\nimport { uint8Shader, uint8DataUtilities } from './uint8.js';\n\nconst shaders = {\n int16: int16Shader,\n int8: int8Shader,\n rgb: rgbShader,\n uint16: uint16Shader,\n uint8: uint8Shader\n};\n\nconst dataUtilities = {\n int16: int16DataUtilities,\n int8: int8DataUtilities,\n rgb: rgbDataUtilities,\n uint16: uint16DataUtilities,\n uint8: uint8DataUtilities\n};\n\nexport { shaders, dataUtilities };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/index.js","/* eslint no-bitwise: 0 */\n\nconst int16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack int16 into three uint8 channels (r, g, b)\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack int16 into three uint8 channels (r, g, b)\n const pixelData = image.getPixelData();\n const numberOfChannels = 3;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = Math.abs(pixelData[i]);\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int16DataUtilities = {\n storedPixelDataToImageData\n};\n\nint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.g*65536.0;' +\n\n 'if (color.b == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int16.js","const int8Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Store data in Uint8Array\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n // Store data in Uint8Array\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n data[offset++] = pixelData[i];\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int8DataUtilities = {\n storedPixelDataToImageData\n};\n\nint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.;' +\n\n 'if (color.a == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int8.js","const rgbShader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack RGB images into a 3-channel RGB texture\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n // Only 3 channels, since we use WebGL's RGB texture format\n const numStoredPixels = image.width * image.height * 4;\n const numOutputPixels = image.width * image.height * 3;\n const storedPixelData = image.getPixelData();\n const data = new Uint8Array(numOutputPixels);\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n } else {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n }\n\n return data;\n}\n\nexport const rgbDataUtilities = {\n storedPixelDataToImageData\n};\n\nrgbShader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform float minPixelValue;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n\n // Get texture\n 'vec3 color = texture2D(u_image, v_texCoord).xyz;' +\n\n // Rescale based on slope and intercept\n 'color = color * 256.0 * slope + intercept;' +\n\n // Apply window settings\n 'float center0 = wc - 0.5 - minPixelValue;' +\n 'float width0 = max(ww, 1.0);' +\n 'color = (color - center0) / width0 + 0.5;' +\n\n // RGBA output\n 'gl_FragColor = vec4(color, 1);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' +\n '}';\n\nexport { rgbShader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/rgb.js","/* eslint no-bitwise: 0 */\n\nconst uint16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * For uint16 pack uint16 into two uint8 channels (r and a).\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack uint16 into two uint8 channels (r and a)\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = pixelData[i];\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n }\n\n return data;\n}\n\nexport const uint16DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.a*65536.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint16.js","const uint8Shader = {};\n\n/**\n * Convert stored pixel data to image data. Here we will store\n * all data in the alpha channel.\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n return image.getPixelData();\n}\n\nexport const uint8DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint8.js","export const vertexShader = 'attribute vec2 a_position;' +\n 'attribute vec2 a_texCoord;' +\n 'uniform vec2 u_resolution;' +\n 'varying vec2 v_texCoord;' +\n 'void main() {' +\n 'vec2 zeroToOne = a_position / u_resolution;' +\n 'vec2 zeroToTwo = zeroToOne * 2.0;' +\n 'vec2 clipSpace = zeroToTwo - 1.0;' +\n 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +\n 'v_texCoord = a_texCoord;' +\n '}';\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/vertexShader.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the canvas coordinate system to the pixel coordinate system\n * system. This can be used to reset tools' image coordinates after modifications\n * have been made in canvas space (e.g. moving a tool by a few cm, independent of\n * image resolution).\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {{x: Number, y: Number}} pt The input point in the canvas coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./canvasToPixel.js","import { getEnabledElements } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n\r\n/**\r\n * Disable an HTML element for further use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n if (element === undefined) {\r\n throw new Error('disable: element must not be undefined');\r\n }\r\n\r\n // Search for this element in this list of enabled elements\r\n const enabledElements = getEnabledElements();\r\n\r\n for (let i = 0; i < enabledElements.length; i++) {\r\n if (enabledElements[i].element === element) {\r\n // We found it!\r\n\r\n // Fire an event so dependencies can cleanup\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'CornerstoneElementDisabled', eventData);\r\n\r\n // Remove the child DOM elements that we created (e.g.canvas)\r\n enabledElements[i].element.removeChild(enabledElements[i].canvas);\r\n enabledElements[i].canvas = undefined;\r\n\r\n // Remove this element from the list of enabled elements\r\n enabledElements.splice(i, 1);\r\n\r\n break;\r\n }\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./disable.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport now from './internal/now.js';\nimport { setLayerImage } from './layers.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * Sets a new image object for a given element.\n *\n * Will also apply an optional viewport setting.\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Object} image An Image loaded by a Cornerstone Image Loader\n * @param {Object} [viewport] A set of Cornerstone viewport parameters\n * @returns {void}\n */\nexport default function (element, image, viewport) {\n if (element === undefined) {\n throw new Error('displayImage: parameter element must not be undefined');\n }\n if (image === undefined) {\n throw new Error('displayImage: parameter image must not be undefined');\n }\n\n const enabledElement = getEnabledElement(element);\n const oldImage = enabledElement.image;\n\n enabledElement.image = image;\n\n if (enabledElement.layers && enabledElement.layers.length) {\n setLayerImage(element, image);\n }\n\n if (enabledElement.viewport === undefined) {\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, image);\n }\n\n // Merge viewport\n if (viewport) {\n for (const attrname in viewport) {\n if (viewport[attrname] !== null) {\n enabledElement.viewport[attrname] = viewport[attrname];\n }\n }\n }\n\n let frameRate;\n\n if (enabledElement.lastImageTimeStamp !== undefined) {\n const timeSinceLastImage = now() - enabledElement.lastImageTimeStamp;\n\n frameRate = (1000 / timeSinceLastImage).toFixed();\n }\n\n enabledElement.lastImageTimeStamp = now();\n\n const newImageEventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n oldImage,\n enabledElement,\n frameRate\n };\n\n triggerEvent(enabledElement.element, 'CornerstoneNewImage', newImageEventData);\n\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./displayImage.js","function s4 () {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).\n substring(1);\n}\n\n/**\n * Generate a unique identifier\n *\n * @return {string} A unique identifier\n */\nexport default function () {\n return `${s4() + s4()}-${s4()}-${s4()}-${\n s4()}-${s4()}${s4()}${s4()}`;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/guid.js","/**\n * This module is responsible for immediately drawing an enabled element\n */\n\nimport { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Immediately draws the enabled element\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('draw: image has not been loaded yet');\n }\n\n drawImage(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./draw.js","/**\n * This module is responsible for drawing invalidated enabled elements\n */\n\nimport { getEnabledElements } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Draws all invalidated enabled elements and clears the invalid flag after drawing it\n *\n * @returns {void}\n */\nexport default function () {\n const enabledElements = getEnabledElements();\n\n for (let i = 0; i < enabledElements.length; i++) {\n const ee = enabledElements[i];\n\n if (ee.invalid === true) {\n drawImage(ee, true);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./drawInvalidated.js","import { addEnabledElement } from './enabledElements.js';\r\nimport resize from './resize.js';\r\nimport drawImageSync from './internal/drawImageSync.js';\r\nimport requestAnimationFrame from './internal/requestAnimationFrame.js';\r\nimport webGL from './webgl/index.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n */\r\n\r\nfunction hasImageOrLayers (enabledElement) {\r\n return enabledElement.image !== undefined || enabledElement.layers.length;\r\n}\r\n\r\n\r\n/**\r\n * Enable an HTML Element for use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @param {Object} options Options for the enabledElement\r\n *\r\n * @return {void}\r\n */\r\nexport default function (element, options) {\r\n if (element === undefined) {\r\n throw new Error('enable: parameter element cannot be undefined');\r\n }\r\n\r\n // If this enabled element has the option set for WebGL, we should\r\n // Check if this device actually supports it\r\n if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {\r\n if (webGL.renderer.isWebGLAvailable()) {\r\n // If WebGL is available on the device, initialize the renderer\r\n // And return the renderCanvas from the WebGL rendering path\r\n webGL.renderer.initRenderer();\r\n options.renderer = 'webgl';\r\n } else {\r\n // If WebGL is not available on this device, we will fall back\r\n // To using the Canvas renderer\r\n console.error('WebGL not available, falling back to Canvas renderer');\r\n delete options.renderer;\r\n }\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n\r\n element.appendChild(canvas);\r\n\r\n const enabledElement = {\r\n element,\r\n canvas,\r\n image: undefined, // Will be set once image is loaded\r\n invalid: false, // True if image needs to be drawn, false if not\r\n needsRedraw: true,\r\n options,\r\n layers: [],\r\n data: {},\r\n renderingTools: {}\r\n };\r\n\r\n addEnabledElement(enabledElement);\r\n\r\n resize(element, true);\r\n\r\n /**\r\n * Draw the image immediately\r\n *\r\n * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks\r\n * @returns {void}\r\n */\r\n function draw (timestamp) {\r\n if (enabledElement.canvas === undefined) {\r\n return;\r\n }\r\n\r\n const eventDetails = {\r\n enabledElement,\r\n timestamp\r\n };\r\n\r\n triggerEvent(enabledElement.element, 'CornerstonePreRender', eventDetails);\r\n\r\n if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {\r\n drawImageSync(enabledElement, enabledElement.invalid);\r\n }\r\n\r\n requestAnimationFrame(draw);\r\n }\r\n\r\n draw();\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./enable.js","import now from './now.js';\r\nimport drawCompositeImage from './drawCompositeImage.js';\r\nimport { renderColorImage } from '../rendering/renderColorImage.js';\r\nimport { renderGrayscaleImage } from '../rendering/renderGrayscaleImage.js';\r\nimport { renderPseudoColorImage } from '../rendering/renderPseudoColorImage.js';\r\nimport { renderLabelMapImage } from '../rendering/renderLabelMapImage.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * Draw an image to a given enabled element synchronously\r\n *\r\n * @param {EnabledElement} enabledElement An enabled element to draw into\r\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\r\n * @returns {void}\r\n */\r\nexport default function (enabledElement, invalidated) {\r\n const image = enabledElement.image;\r\n const element = enabledElement.element;\r\n const layers = enabledElement.layers || [];\r\n\r\n // Check if enabledElement can be redrawn\r\n if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {\r\n return;\r\n }\r\n\r\n // Start measuring the time needed to draw the image/layers\r\n const start = now();\r\n\r\n image.stats = {\r\n lastGetPixelDataTime: -1.0,\r\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\r\n lastPutImageDataTime: -1.0,\r\n lastRenderTime: -1.0,\r\n lastLutGenerateTime: -1.0\r\n };\r\n\r\n if (layers && layers.length) {\r\n drawCompositeImage(enabledElement, invalidated);\r\n } else if (image) {\r\n let render = image.render;\r\n\r\n if (!render) {\r\n if (enabledElement.viewport.colormap &&\r\n enabledElement.viewport.colormap !== '' &&\r\n enabledElement.image.labelmap === true) {\r\n render = renderLabelMapImage;\r\n } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {\r\n render = renderPseudoColorImage;\r\n } else if (image.color) {\r\n render = renderColorImage;\r\n } else {\r\n render = renderGrayscaleImage;\r\n }\r\n }\r\n\r\n render(enabledElement, invalidated);\r\n }\r\n\r\n // Calculate how long it took to draw the image/layers\r\n const renderTimeInMs = now() - start;\r\n\r\n const eventData = {\r\n viewport: enabledElement.viewport,\r\n element,\r\n image,\r\n enabledElement,\r\n canvasContext: enabledElement.canvas.getContext('2d'),\r\n renderTimeInMs\r\n };\r\n\r\n image.stats.lastRenderTime = renderTimeInMs;\r\n\r\n enabledElement.invalid = false;\r\n enabledElement.needsRedraw = false;\r\n\r\n triggerEvent(element, 'CornerstoneImageRendered', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImageSync.js","import { getLayers, getActiveLayer, getVisibleLayers } from '../layers.js';\nimport { addGrayscaleLayer } from '../rendering/renderGrayscaleImage.js';\nimport { addColorLayer } from '../rendering/renderColorImage.js';\nimport { addPseudoColorLayer } from '../rendering/renderPseudoColorImage.js';\nimport { addLabelMapLayer } from '../rendering/renderLabelMapImage.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\n\n// This is used to keep each of the layers' viewports in sync with the active layer\nconst originalViewportScale = {};\n\nfunction getViewportRatio (baseLayerId, targetLayerId) {\n return originalViewportScale[targetLayerId] / originalViewportScale[baseLayerId];\n}\n\n// Sync all viewports based on active layer's viewport\nfunction syncViewports (layers, activeLayer) {\n // If we intend to keep the viewport's scale, translation and rotation in sync,\n // loop through the layers\n layers.forEach((layer) => {\n // Don't do anything to the active layer\n // Don't do anything if this layer has no viewport\n if (layer === activeLayer ||\n !layer.viewport ||\n !activeLayer.viewport) {\n return;\n }\n\n if (!originalViewportScale[layer.layerId]) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n\n const viewportRatio = getViewportRatio(activeLayer.layerId, layer.layerId);\n\n // Update the layer's translation and scale to keep them in sync with the first image\n // based on the ratios between the images\n layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;\n layer.viewport.rotation = activeLayer.viewport.rotation;\n layer.viewport.translation = {\n x: (activeLayer.viewport.translation.x / viewportRatio),\n y: (activeLayer.viewport.translation.y / viewportRatio)\n };\n layer.viewport.hflip = activeLayer.viewport.hflip;\n layer.viewport.vflip = activeLayer.viewport.vflip;\n });\n}\n\n/**\n * Internal function to render all layers for a Cornerstone enabled element\n *\n * @param {CanvasRenderingContext2D} context Canvas context to draw upon\n * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element\n * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn\n * @returns {void}\n */\nfunction renderLayers (context, layers, invalidated) {\n // Loop through each layer and draw it to the canvas\n layers.forEach((layer, index) => {\n if (!layer.image) {\n return;\n }\n\n context.save();\n\n // Set the layer's canvas to the pixel coordinate system\n layer.canvas = context.canvas;\n setToPixelCoordinateSystem(layer, context);\n\n // Render into the layer's canvas\n const colormap = layer.viewport.colormap || layer.options.colormap;\n const labelmap = layer.viewport.labelmap;\n const isInvalid = layer.invalid || invalidated;\n\n if (colormap && colormap !== '' && labelmap === true) {\n addLabelMapLayer(layer, isInvalid);\n } else if (colormap && colormap !== '') {\n addPseudoColorLayer(layer, isInvalid);\n } else if (layer.image.color === true) {\n addColorLayer(layer, isInvalid);\n } else {\n // If this is the base layer, use the alpha channel for rendering of the grayscale image\n const useAlphaChannel = (index === 0);\n\n addGrayscaleLayer(layer, isInvalid, useAlphaChannel);\n }\n\n // Apply any global opacity settings that have been defined for this layer\n if (layer.options && layer.options.opacity) {\n context.globalAlpha = layer.options.opacity;\n } else {\n context.globalAlpha = 1;\n }\n\n if (layer.options && layer.options.fillStyle) {\n context.fillStyle = layer.options.fillStyle;\n }\n\n // Set the pixelReplication property before drawing from the layer into the\n // composite canvas\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Draw from the current layer's canvas onto the enabled element's canvas\n const { width, height } = layer.image;\n\n context.drawImage(layer.canvas, 0, 0, width, height, 0, 0, width, height);\n context.restore();\n\n layer.invalid = false;\n });\n}\n\n/**\n * Internal API function to draw a composite image to a given enabled element\n *\n * @param {EnabledElement} enabledElement An enabled element to draw into\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated) {\n const element = enabledElement.element;\n const allLayers = getLayers(element);\n const activeLayer = getActiveLayer(element);\n const visibleLayers = getVisibleLayers(element);\n const resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports;\n\n // This state will help us to determine if the user has re-synced the\n // layers allowing us to make a new copy of the viewports\n enabledElement.lastSyncViewportsState = enabledElement.syncViewports;\n\n // Stores a copy of all viewports if the user has just synced them then we can use the\n // copies to calculate anything later (ratio, translation offset, rotation offset, etc)\n if (resynced) {\n allLayers.forEach(function (layer) {\n if (layer.viewport) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n });\n }\n\n // Sync all viewports in case it's activated\n if (enabledElement.syncViewports === true) {\n syncViewports(visibleLayers, activeLayer);\n }\n\n // Get the enabled element's canvas so we can draw to it\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Render all visible layers\n renderLayers(context, visibleLayers, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawCompositeImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n * @returns {*} Whatever data is stored for this enabled element\n */\nexport function getElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n if (ee.data.hasOwnProperty(dataType) === false) {\n ee.data[dataType] = {};\n }\n\n return ee.data[dataType];\n}\n\n/**\n * Clears any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n *\n * @returns {void}\n */\nexport function removeElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n delete ee.data[dataType];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElementData.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\n\n/**\n * Returns a default viewport for display the specified image on the specified\n * enabled element. The default viewport is fit to window\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image Object\n *\n * @returns {Viewport} The default viewport for the image\n */\nexport default function (element, image) {\n const enabledElement = getEnabledElement(element);\n\n return getDefaultViewport(enabledElement.canvas, image);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getDefaultViewportForImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Returns the currently displayed image for an element or undefined if no image has\n * been displayed yet\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Image} The Cornerstone Image Object displayed in this element\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.image;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getImage.js","import { getEnabledElement } from './enabledElements.js';\nimport getStoredPixels from './getStoredPixels.js';\nimport getModalityLUT from './internal/getModalityLUT.js';\n\n/**\n * Retrieves an array of pixels from a rectangular region with modality LUT transformation applied\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The modality pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n const storedPixels = getStoredPixels(element, x, y, width, height);\n const ee = getEnabledElement(element);\n const mlutfn = getModalityLUT(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);\n\n return storedPixels.map(mlutfn);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getPixels.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves the viewport for the specified enabled element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Viewport|undefined} The Cornerstone Viewport settings for this element, if they exist. Otherwise, undefined\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const viewport = enabledElement.viewport;\n\n if (viewport === undefined) {\n return;\n }\n\n // Return a copy of the viewport\n return Object.assign({}, viewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getViewport.js","import { getImagePromise, putImagePromise } from './imageCache.js';\r\nimport events from './events.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module deals with ImageLoaders, loading images and caching images\r\n */\r\n\r\n\r\nconst imageLoaders = {};\r\n\r\nlet unknownImageLoader;\r\n\r\n/**\r\n * Load an image using a registered Cornerstone Image Loader.\r\n *\r\n * The image loader that is used will be\r\n * determined by the image loader scheme matching against the imageId.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\r\nfunction loadImageFromImageLoader (imageId, options) {\r\n const colonIndex = imageId.indexOf(':');\r\n const scheme = imageId.substring(0, colonIndex);\r\n const loader = imageLoaders[scheme];\r\n let imagePromise;\r\n\r\n if (loader === undefined || loader === null) {\r\n if (unknownImageLoader !== undefined) {\r\n imagePromise = unknownImageLoader(imageId);\r\n\r\n return imagePromise;\r\n }\r\n\r\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\r\n }\r\n\r\n imagePromise = loader(imageId, options);\r\n\r\n // Broadcast an image loaded event once the image is loaded\r\n imagePromise.then(function (image) {\r\n triggerEvent(events, 'CornerstoneImageLoaded', { image });\r\n });\r\n\r\n return imagePromise;\r\n}\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\r\nexport function loadImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadImage: parameter imageId must not be undefined');\r\n }\r\n\r\n let imagePromise = getImagePromise(imageId);\r\n\r\n if (imagePromise !== undefined) {\r\n return imagePromise;\r\n }\r\n\r\n imagePromise = loadImageFromImageLoader(imageId, options);\r\n\r\n return imagePromise;\r\n}\r\n\r\n//\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Deferred} A jQuery Deferred which can be used to act after an image is loaded or loading fails\r\n */\r\nexport function loadAndCacheImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadAndCacheImage: parameter imageId must not be undefined');\r\n }\r\n\r\n let imagePromise = getImagePromise(imageId);\r\n\r\n if (imagePromise !== undefined) {\r\n return imagePromise;\r\n }\r\n\r\n imagePromise = loadImageFromImageLoader(imageId, options);\r\n\r\n putImagePromise(imageId, imagePromise);\r\n\r\n return imagePromise;\r\n}\r\n\r\n/**\r\n * Registers an imageLoader plugin with cornerstone for the specified scheme\r\n *\r\n * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\r\n * @param {Function} imageLoader A Cornerstone Image Loader function\r\n * @returns {void}\r\n */\r\nexport function registerImageLoader (scheme, imageLoader) {\r\n imageLoaders[scheme] = imageLoader;\r\n}\r\n\r\n/**\r\n * Registers a new unknownImageLoader and returns the previous one\r\n *\r\n * @param {Function} imageLoader A Cornerstone Image Loader\r\n *\r\n * @returns {Function|Undefined} The previous Unknown Image Loader\r\n */\r\nexport function registerUnknownImageLoader (imageLoader) {\r\n const oldImageLoader = unknownImageLoader;\r\n\r\n unknownImageLoader = imageLoader;\r\n\r\n return oldImageLoader;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./imageLoader.js","import { getEnabledElement } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module contains a function to make an image is invalid\r\n */\r\n\r\n/**\r\n * Sets the invalid flag on the enabled element and fire an event\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n const enabledElement = getEnabledElement(element);\r\n\r\n enabledElement.invalid = true;\r\n enabledElement.needsRedraw = true;\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'CornerstoneInvalidated', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./invalidate.js","/**\n * This module contains a function to immediately invalidate an image\n */\n\nimport { getEnabledElementsByImageId } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the all enabled elements\n * displaying the specified imageId\n *\n * @param {string} imageId The imageId of the Cornerstone Image Object to redraw\n * @returns {void}\n */\nexport default function (imageId) {\n\n const enabledElements = getEnabledElementsByImageId(imageId);\n\n enabledElements.forEach(function (enabledElement) {\n drawImage(enabledElement, true);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./invalidateImageId.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the page coordinate system to the pixel coordinate\n * system\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {Number} pageX The x value in the page coordinate system\n * @param {Number} pageY The y value in the page coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pageX, pageY) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('image has not been loaded yet');\n }\n\n // Convert the pageX and pageY to the canvas client coordinates\n const rect = element.getBoundingClientRect();\n const clientX = pageX - rect.left - window.pageXOffset;\n const clientY = pageY - rect.top - window.pageYOffset;\n\n const pt = { x: clientX,\n y: clientY };\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pageToPixel.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the pixel coordinate system to the canvas coordinate system\n * system. This can be used to render using canvas context without having the weird\n * side effects that come from scaling and non square pixels\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system\n *\n * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelToCanvas.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Resets the viewport to the default settings\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, enabledElement.image);\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./reset.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\nconst MIN_WINDOW_WIDTH = 0.000001;\nconst MIN_VIEWPORT_SCALE = 0.0001;\n\n/**\n * Sets the viewport for an element and corrects invalid values\n *\n * @param {HTMLElement} element - DOM element of the enabled element\n * @param {Viewport} viewport - Object containing the viewport properties\n * @returns {void}\n */\nexport default function (element, viewport) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport.translation.x = viewport.translation.x;\n enabledElement.viewport.translation.y = viewport.translation.y;\n enabledElement.viewport.voi.windowCenter = viewport.voi.windowCenter;\n enabledElement.viewport.invert = viewport.invert;\n enabledElement.viewport.pixelReplication = viewport.pixelReplication;\n enabledElement.viewport.rotation = viewport.rotation;\n enabledElement.viewport.hflip = viewport.hflip;\n enabledElement.viewport.vflip = viewport.vflip;\n enabledElement.viewport.modalityLUT = viewport.modalityLUT;\n enabledElement.viewport.voiLUT = viewport.voiLUT;\n enabledElement.viewport.colormap = viewport.colormap;\n enabledElement.viewport.labelmap = viewport.labelmap;\n\n // Prevent window width from being too small (note that values close to zero are valid and can occur with\n // PET images in particular)\n enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);\n\n // Prevent scale from getting too small\n enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);\n\n // Normalize the rotation value to a positive rotation in degrees\n enabledElement.viewport.rotation %= 360;\n if (enabledElement.viewport.rotation < 0) {\n enabledElement.viewport.rotation += 360;\n }\n\n // Force the image to be updated since the viewport has been modified\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setViewport.js","import { renderColorImage } from './renderColorImage.js';\nimport { renderGrayscaleImage } from './renderGrayscaleImage.js';\nimport { renderWebImage } from './renderWebImage.js';\n\nexport default {\n colorImage: renderColorImage,\n grayscaleImage: renderGrayscaleImage,\n webImage: renderWebImage\n};\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/index.js","// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nconst providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param {Function} provider Metadata provider function\n * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @returns {void}\n */\nexport function addProvider (provider, priority = 0) {\n let i;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority,\n provider\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param {Function} provider Metadata provider function\n *\n * @returns {void}\n */\nexport function removeProvider (provider) {\n for (let i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param {String} type The type of metadata requested from the metadata store\n * @param {String} imageId The Cornerstone Image Object's imageId\n *\n * @returns {*} The metadata retrieved from the metadata store\n */\nfunction getMetaData (type, imageId) {\n // Invoke each provider in priority order until one returns something\n for (let i = 0; i < providers.length; i++) {\n const result = providers[i].provider(type, imageId);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexport default {\n addProvider,\n removeProvider,\n get: getMetaData\n};\n\n\n\n// WEBPACK FOOTER //\n// ./metaData.js","import { getEnabledElement } from './enabledElements.js';\nimport pixelDataToFalseColorData from './pixelDataToFalseColorData.js';\nimport { getColormap } from './colors/colormap.js';\n\n/**\n * Retrieves the minimum and maximum pixel values from an Array of pixel data\n *\n * @param {Array} pixelData The input pixel data array\n *\n * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array\n */\nfunction getPixelValues (pixelData) {\n let minPixelValue = Number.MAX_VALUE;\n let maxPixelValue = Number.MIN_VALUE;\n const len = pixelData.length;\n let pixel;\n\n for (let i = 0; i < len; i++) {\n pixel = pixelData[i];\n minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;\n maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;\n }\n\n return {\n minPixelValue,\n maxPixelValue\n };\n}\n\n/**\n * Retrieve a function that will allow an image object to be reset to its original form\n * after a false color mapping transformation\n *\n * @param {Image} image A Cornerstone Image Object\n *\n * @return {Function} A function for resetting an Image Object to its original form\n */\nfunction getRestoreImageMethod (image) {\n if (image.restore) {\n return image.restore;\n }\n\n const color = image.color;\n const rgba = image.rgba;\n const cachedLut = image.cachedLut;\n const slope = image.slope;\n const windowWidth = image.windowWidth;\n const windowCenter = image.windowCenter;\n const minPixelValue = image.minPixelValue;\n const maxPixelValue = image.maxPixelValue;\n\n return function () {\n image.color = color;\n image.rgba = rgba;\n image.cachedLut = cachedLut;\n image.slope = slope;\n image.windowWidth = windowWidth;\n image.windowCenter = windowCenter;\n image.minPixelValue = minPixelValue;\n image.maxPixelValue = maxPixelValue;\n\n if (image.origPixelData) {\n const pixelData = image.origPixelData;\n\n image.getPixelData = () => pixelData;\n }\n\n // Remove some attributes added by false color mapping\n image.origPixelData = undefined;\n image.colormapId = undefined;\n image.falseColor = undefined;\n };\n}\n\n//\n// Then we need to make sure it will be converted into a colormap object if it's as string.\n\n/**\n * User can pass a colormap or its id as string to some of these public functions.\n * Then we need to make sure it will be converted into a colormap object if it's a string.\n *\n * @param {*} colormap A colormap ID or Object\n * @return {*} The colormap\n */\nfunction ensuresColormap (colormap) {\n if (colormap && (typeof colormap === 'string')) {\n colormap = getColormap(colormap);\n }\n\n return colormap;\n}\n\n/**\n * Restores a false color image to its original version\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.\n */\nfunction restoreImage (image) {\n if (image.restore && (typeof image.restore === 'function')) {\n image.restore();\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Convert an image to a false color image\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {Boolean} - Whether or not the image has been converted to a false color image\n */\nfunction convertImageToFalseColorImage (image, colormap) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n // User can pass a colormap id or a colormap object\n colormap = ensuresColormap(colormap);\n\n const colormapId = colormap.getId();\n\n // Doesn't do anything if colormapId hasn't changed\n if (image.colormapId === colormapId) {\n // It has already being converted into a false color image\n // Using the colormapId passed as parameter\n return false;\n }\n\n // Restore the image attributes updated when converting to a false color image\n restoreImage(image);\n\n // Convert the image to a false color image\n if (colormapId) {\n const minPixelValue = image.minPixelValue || 0;\n const maxPixelValue = image.maxPixelValue || 255;\n\n image.restore = getRestoreImageMethod(image);\n\n const lookupTable = colormap.createLookupTable();\n\n lookupTable.setTableRange(minPixelValue, maxPixelValue);\n\n // Update the pixel data and render the new image\n pixelDataToFalseColorData(image, lookupTable);\n\n // Update min and max pixel values\n const pixelValues = getPixelValues(image.getPixelData());\n\n image.minPixelValue = pixelValues.minPixelValue;\n image.maxPixelValue = pixelValues.maxPixelValue;\n\n image.windowWidth = 255;\n image.windowCenter = 128;\n\n // Cache the last colormapId used for performance\n // Then it doesn't need to be re-rendered on next\n // Time if the user hasn't updated it\n image.colormapId = colormapId;\n }\n\n // Return `true` to tell the caller that the image has got updated\n return true;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {HTMLElement} element The Cornerstone element\n * @param {*} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {void}\n */\nfunction convertToFalseColorImage (element, colormap) {\n const enabledElement = getEnabledElement(element);\n\n\n return convertImageToFalseColorImage(enabledElement.image, colormap);\n}\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage };\n\n\n\n// WEBPACK FOOTER //\n// ./falseColorMapping.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///cornerstone.min.js","webpack:///webpack/bootstrap 6df70bee89025a942e6c","webpack:///./enabledElements.js","webpack:///./internal/now.js","webpack:///./triggerEvent.js","webpack:///./setToPixelCoordinateSystem.js","webpack:///./updateImage.js","webpack:///./internal/drawImage.js","webpack:///./internal/getDefaultViewport.js","webpack:///./colors/index.js","webpack:///./rendering/renderColorImage.js","webpack:///./internal/getTransform.js","webpack:///./rendering/initializeRenderCanvas.js","webpack:///./rendering/saveLastRendered.js","webpack:///./rendering/doesImageNeedToBeRendered.js","webpack:///./webgl/index.js","webpack:///./events.js","webpack:///./rendering/renderGrayscaleImage.js","webpack:///./internal/generateLut.js","webpack:///./internal/requestAnimationFrame.js","webpack:///./internal/storedPixelDataToCanvasImageData.js","webpack:///./internal/storedColorPixelDataToCanvasImageData.js","webpack:///./internal/storedPixelDataToCanvasImageDataColorLUT.js","webpack:///./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","webpack:///./internal/calculateTransform.js","webpack:///./rendering/renderLabelMapImage.js","webpack:///./rendering/renderPseudoColorImage.js","webpack:///./layers.js","webpack:///./internal/getModalityLUT.js","webpack:///./internal/getVOILut.js","webpack:///./colors/colormap.js","webpack:///./colors/lookupTable.js","webpack:///./internal/storedPixelDataToCanvasImageDataRGBA.js","webpack:///./internal/transform.js","webpack:///./rendering/getLut.js","webpack:///./webgl/textureCache.js","webpack:///./webgl/createProgramFromString.js","webpack:///./rendering/renderWebImage.js","webpack:///./resize.js","webpack:///./fitToWindow.js","webpack:///./getStoredPixels.js","webpack:///./imageCache.js","webpack:///./pixelDataToFalseColorData.js","webpack:///./index.js","webpack:///./internal/index.js","webpack:///./rendering/lutMatches.js","webpack:///./internal/generateColorLut.js","webpack:///./internal/storedRGBAPixelDataToCanvasImageData.js","webpack:///./webgl/renderer.js","webpack:///./webgl/shaders/index.js","webpack:///./webgl/shaders/int16.js","webpack:///./webgl/shaders/int8.js","webpack:///./webgl/shaders/rgb.js","webpack:///./webgl/shaders/uint16.js","webpack:///./webgl/shaders/uint8.js","webpack:///./webgl/vertexShader.js","webpack:///./canvasToPixel.js","webpack:///./disable.js","webpack:///./displayImage.js","webpack:///./internal/guid.js","webpack:///./draw.js","webpack:///./drawInvalidated.js","webpack:///./enable.js","webpack:///./internal/drawImageSync.js","webpack:///./internal/drawCompositeImage.js","webpack:///./enabledElementData.js","webpack:///./getDefaultViewportForImage.js","webpack:///./getImage.js","webpack:///./getPixels.js","webpack:///./getViewport.js","webpack:///./imageLoader.js","webpack:///./invalidate.js","webpack:///./invalidateImageId.js","webpack:///./pageToPixel.js","webpack:///./pixelToCanvas.js","webpack:///./reset.js","webpack:///./setViewport.js","webpack:///./rendering/index.js","webpack:///./metaData.js","webpack:///./falseColorMapping.js"],"names":["root","factory","exports","module","define","amd","self","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","getEnabledElement","element","undefined","Error","enabledElements","length","addEnabledElement","enabledElement","push","getEnabledElementsByImageId","imageId","ees","forEach","image","getEnabledElements","value","default","window","performance","now","Date","triggerEvent","el","type","detail","arguments","event","CustomEvent","cancelable","document","createEvent","initCustomEvent","dispatchEvent","context","scale","transform","_calculateTransform2","setTransform","_calculateTransform","obj","invalidated","_enabledElements","layers","_drawImage2","_drawImage","needsRedraw","invalid","canvas","translation","x","y","voi","windowWidth","windowCenter","invert","pixelReplication","rotation","hflip","vflip","modalityLUT","voiLUT","colormap","labelmap","verticalScale","height","rows","horizontalScale","width","columns","Math","min","Boolean","_colormap","_lookupTable","_lookupTable2","getColormap","getColormapsList","LookupTable","_interopRequireDefault","getLut","viewport","cachedLut","lutArray","_generateColorLut2","getRenderCanvas","renderingTools","renderCanvas","createElement","getCanvas","_doesImageNeedToBeRendered2","_initializeRenderCanvas2","start","_now2","colorLut","stats","lastLutGenerateTime","renderCanvasData","renderCanvasContext","rgba","_storedRGBAPixelDataToCanvasImageData2","data","_storedColorPixelDataToCanvasImageData2","putImageData","lastPutImageDataTime","renderColorImage","getContext","fillStyle","fillRect","imageSmoothingEnabled","mozImageSmoothingEnabled","_setToPixelCoordinateSystem2","options","renderer","toLowerCase","_index2","render","drawImage","_saveLastRendered2","addColorLayer","layer","_now","_generateColorLut","_storedColorPixelDataToCanvasImageData","_storedRGBAPixelDataToCanvasImageData","_setToPixelCoordinateSystem","_index","_doesImageNeedToBeRendered","_initializeRenderCanvas","_saveLastRendered","canvasContext","getImageData","lastRenderedImageId","lastRenderedViewport","_renderer","_createProgramFromString","_createProgramFromString2","_textureCache","_textureCache2","mod","createProgramFromString","initRenderer","isWebGLAvailable","textureCache","isWebGLInitialized","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","descriptor","writable","key","protoProps","staticProps","EventTarget","listeners","callback","stack","splice","defaultPrevented","events","useAlphaChannel","lut","_getLut2","_storedPixelDataToCanvasImageData2","_storedPixelDataToCanvasImageDataRGBA2","renderGrayscaleImage","addGrayscaleLayer","_storedPixelDataToCanvasImageData","_storedPixelDataToCanvasImageDataRGBA","_getLut","maxPixelValue","minPixelValue","offset","Uint8ClampedArray","mlutfn","_getModalityLUT2","slope","intercept","vlutfn","_getVOILut2","storedValue","_getModalityLUT","_getVOILut","requestFrame","setTimeout","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","canvasImageDataData","pixelData","getPixelData","lastGetPixelDataTime","numPixels","canvasImageDataIndex","storedPixelDataIndex","Int16Array","Uint16Array","lastStoredPixelDataToCanvasImageDataTime","storedPixelDataToCanvasImageDataColorLUT","clut","Table","storedPixelDataToCanvasImageDataPseudocolorLUT","grayscaleLut","grayscale","_transform","Transform","translate","angle","rotate","PI","widthScale","heightScale","rowPixelSpacing","columnPixelSpacing","colormapId","getId","createLookupTable","_storedPixelDataToCanvasImageDataColorLUT2","renderLabelMapImage","addLabelMapLayer","_storedPixelDataToCanvasImageDataColorLUT","setNumberOfColors","_storedPixelDataToCanvasImageDataPseudocolorLUT2","renderPseudoColorImage","addPseudoColorLayer","_storedPixelDataToCanvasImageDataPseudocolorLUT","eventName","layerId","eventData","_triggerEvent2","rescaleImage","baseLayer","targetLayer","baseImage","targetImage","colRelative","viewportRatio","addLayer","_guid2","_getDefaultViewport2","assign","syncViewports","newLayer","setActiveLayer","removeLayer","index","findIndex","activeLayerId","getLayer","find","getLayers","getVisibleLayers","filter","visible","opacity","_updateImage2","setLayerImage","getActiveLayer","defaultViewport","_guid","_getDefaultViewport","_updateImage","_triggerEvent","generateLinearModalityLUT","storedPixelValue","generateNonLinearModalityLUT","minValue","maxValue","maxValueMapped","firstValueMapped","_toConsumableArray","arr","Array","isArray","arr2","from","generateLinearVOILUT","modalityLutValue","generateNonLinearVOILUT","bitsPerEntry","max","apply","toString","shift","linspace","a","b","increment","vector","getRank","array","elem","left","right","mid","floor","midElem","searchSorted","inputArray","values","indexes","len","sort","makeMappingArray","N","gamma","y0","y1","xLinSpace","pow","xLinSpaceIndexes","colorPercent","colorDelta","createLinearSegmentedColormap","segmentedData","redLut","red","greenLut","green","blueLut","blue","round","colormaps","keys","colormapsData","id","aName","bName","colormapData","colors","numColors","getColorSchemeName","setColorSchemeName","getNumberOfColors","COLOR_TRANSPARENT","getColor","isValidIndex","getColorRepeating","setColor","addColor","insertColor","removeColor","clearColors","buildLookupTable","setNumberOfTableValues","setTableValue","hotIron","numOfColors","pet","hotMetalBlue","pet20Step","gray","jet","hsv","hot","cool","spring","summer","autumn","winter","bone","copper","spectral","coolwarm","blues","HSVToRGB","hue","sat","val","rgb","hueCase","frac","lx","ly","lz","linearIndexLookupMain","v","dIndex","Range","MaxIndex","BELOW_RANGE_COLOR_INDEX","ABOVE_RANGE_COLOR_INDEX","Shift","Scale","NumberOfColors","Ramp","TableRange","HueRange","SaturationRange","ValueRange","AlphaRange","NaNColor","BelowRangeColor","UseBelowRangeColor","AboveRangeColor","UseAboveRangeColor","InputRange","number","ramp","end","scalar","mapValue","force","maxIndex","hinc","sinc","vinc","ainc","alpha","c_rgba","cos","sqrt","buildSpecialColors","numberOfColors","belowRangeColorIndex","aboveRangeColorIndex","nanColorIndex","getIndex","Number","MAX_VALUE","isNaN","slice","pixelValue","reset","matrix","m11","m12","m21","m22","dx","dy","m0","m1","m2","m3","m4","m5","rad","sin","sx","sy","px","py","_lutMatches2","_generateLut2","_lutMatches","_generateLut","getCacheInfo","maximumSizeInBytes","cacheSizeInBytes","numberOfImagesCached","cachedImages","purgeCacheIfNecessary","compare","timeStamp","lastCachedImage","sizeInBytes","imageCache","pop","_events2","cacheInfo","setMaximumSizeBytes","numBytes","toFixed","putImageTexture","imageTexture","cachedImage","getImageTexture","removeImageTexture","indexOf","purgeCache","removedCachedImage","_events","compileShader","gl","shaderSource","shaderType","shader","createShader","getShaderParameter","COMPILE_STATUS","isContextLost","infoLog","getShaderInfoLog","console","error","createProgram","vertexShader","fragmentShader","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","vertexShaderSrc","fragShaderSrc","VERTEX_SHADER","FRAGMENT_SHADER","renderWebImage","getImage","_renderColorImage","setCanvasSize","clientWidth","style","clientHeight","fitViewportToWindow","_fitToWindow2","_fitToWindow","getImageSize","imageSize","storedPixels","row","column","spIndex","removeImageLoadObject","putImageLoadObject","imageLoadObject","promise","imageCacheDict","cancelFn","loaded","sharedCacheKey","then","eventDetails","action","getImageLoadObject","decache","imagePromise","changeImageIdCacheSize","newCacheSize","cacheEntry","cacheSizeDifference","lookupTable","color","falseColor","origPixelData","storedColorPixelData","Uint8Array","sp","mapped","build","_requestAnimationFrame","_renderLabelMapImage","_renderPseudoColorImage","_renderGrayscaleImage","_renderWebImage","_canvasToPixel","_disable","_displayImage","_draw","_drawInvalidated","_enable","_enabledElementData","getElementData","removeElementData","_layers","_getDefaultViewportForImage","_getImage","_getPixels","_getStoredPixels","_getViewport","_imageLoader","loadImage","loadAndCacheImage","registerImageLoader","registerUnknownImageLoader","_invalidate","_invalidateImageId","_pageToPixel","_pixelToCanvas","_reset","_resize","_setViewport","_pixelDataToFalseColorData","_imageCache","_metaData","_index3","_index4","_falseColorMapping","convertImageToFalseColorImage","convertToFalseColorImage","restoreImage","_requestAnimationFrame2","_getTransform","_getTransform2","generateLut","getDefaultViewport","storedPixelDataToCanvasImageData","storedPixelDataToCanvasImageDataRGBA","storedColorPixelDataToCanvasImageData","getTransform","calculateTransform","initShaders","shaders","attributes","uniforms","vert","_vertexShader","frag","texCoordLocation","getAttribLocation","enableVertexAttribArray","positionLocation","resolutionLocation","getUniformLocation","initWebGL","initBuffers","updateRectangle","bufferData","ARRAY_BUFFER","Float32Array","STATIC_DRAW","handleLostContext","preventDefault","warn","handleRestoredContext","preserveDrawingBuffer","removeEventListener","addEventListener","getImageDataType","datatype","getShaderProgram","generateTexture","TEXTURE_FORMAT","uint8","LUMINANCE","int8","LUMINANCE_ALPHA","uint16","int16","RGB","TEXTURE_BYTES","imageDataType","format","texture","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","pixelStorei","UNPACK_ALIGNMENT","imageData","dataUtilities","storedPixelDataToImageData","texImage2D","UNSIGNED_BYTE","positionBuffer","createBuffer","bindBuffer","texCoordBuffer","renderQuad","parameters","clearColor","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","useProgram","vertexAttribPointer","FLOAT","uniformLocation","uniform","uniform1i","uniform1f","uniform2f","activeTexture","TEXTURE0","drawArrays","TRIANGLE_STRIP","u_resolution","wc","ww","failIfMajorPerformanceCaveat","WebGLRenderingContext","e","_int","_int2","_rgb","_uint","_uint2","abs","int16Shader","int16DataUtilities","int8Shader","int8DataUtilities","numStoredPixels","numOutputPixels","storedPixelData","rgbShader","rgbDataUtilities","uint16Shader","uint16DataUtilities","uint8Shader","uint8DataUtilities","pt","transformPoint","removeChild","oldImage","attrname","frameRate","lastImageTimeStamp","newImageEventData","s4","random","substring","ee","hasImageOrLayers","draw","timestamp","_drawImageSync2","appendChild","_resize2","_drawImageSync","lastRenderTime","_drawCompositeImage2","renderTimeInMs","_drawCompositeImage","getViewportRatio","baseLayerId","targetLayerId","originalViewportScale","activeLayer","renderLayers","save","isInvalid","globalAlpha","_layer$image","restore","allLayers","visibleLayers","resynced","lastSyncViewportsState","dataType","_getStoredPixels2","map","loadImageFromImageLoader","colonIndex","scheme","loader","imageLoaders","unknownImageLoader","errorObject","imageLoader","oldImageLoader","pageX","pageY","rect","getBoundingClientRect","clientX","pageXOffset","clientY","top","pageYOffset","MIN_WINDOW_WIDTH","MIN_VIEWPORT_SCALE","colorImage","grayscaleImage","webImage","addProvider","provider","priority","providers","removeProvider","getMetaData","result","getPixelValues","MIN_VALUE","pixel","getRestoreImageMethod","ensuresColormap","setTableRange","_pixelDataToFalseColorData2","pixelValues"],"mappings":"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MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAAO,GAAI,EAAG,EAAG,MAC9E,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MACnF,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,EAAG,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACrF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,E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O,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAC9F,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAChG,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAC7F,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAC/F,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAClG,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAChG,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAC/F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC7F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACrG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,OAGpBoB,cACEnX,KAAM,iBACNgW,UAAW,IACXD,SACG,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,GAAI,MAC9E,EAAG,EAAG,GAAI,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAClF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MACnF,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,EAAG,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACpF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MACxF,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,GAAI,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAAO,IAAK,EAAG,IAAK,MAC1F,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,IAAK,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAChG,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAAO,IAAK,GAAI,GAAI,MAC7F,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,GAAI,MAC5F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,IAAK,MACnG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,OAGpBqB,WACEpX,KAAM,cACNgW,UAAW,IACXD,SACG,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MACzE,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,EAAG,EAAG,EAAG,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAC7E,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MACnF,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MAAO,GAAI,EAAG,GAAI,MACnF,GAAI,EAAG,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACvF,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACxF,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,IAAK,MACzF,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAC7F,GAAI,GAAI,IAAK,MAAO,GAAI,GAAI,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACnG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MACvG,IAAK,IAAK,IAAK,MAAO,IAAK,IAAK,IAAK,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAC9F,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACxF,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MAAO,GAAI,GAAI,GAAI,MACxF,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAC7F,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,GAAI,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAC/F,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAClG,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,GAAI,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC/F,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAC7F,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,IAAK,EAAG,MAAO,IAAK,GAAI,EAAG,MAC5F,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MACxF,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EAAG,MAAO,IAAK,GAAI,EA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","file":"cornerstone.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstone-core\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstone-core\"] = factory();\n\telse\n\t\troot[\"cornerstone\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/*! cornerstone-core - 2.0.0 - 2017-12-08 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstone */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstone-core\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstone-core\"] = factory();\n\telse\n\t\troot[\"cornerstone\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 41);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getEnabledElement = getEnabledElement;\nexports.addEnabledElement = addEnabledElement;\nexports.getEnabledElementsByImageId = getEnabledElementsByImageId;\nexports.getEnabledElements = getEnabledElements;\nvar enabledElements = [];\n\n/**\n * A two-dimensional vector\n *\n * @typedef {Object} vec2\n * @param {Number} x - The x distance\n * @param {Number} y - The y distance\n */\n\n/**\n * VOI\n *\n * @typedef {Object} VOI\n * @param {Number} windowWidth - Window Width for display\n * @param {Number} windowCenter - Window Center for display\n */\n\n/**\n * Lookup Table Array\n *\n * @typedef {Object} LUT\n * @property {Number} firstValueMapped\n * @property {Number} numBitsPerEntry\n * @property {Array} lut\n */\n\n/**\n * Image Statistics Object\n *\n * @typedef {Object} ImageStats\n *\n * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image\n * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array\n * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context\n * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run\n * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image\n */\n\n/**\n * An Image Object in Cornerstone\n *\n * @typedef {Object} Image\n *\n * @property {string} imageId - The imageId associated with this image object\n * @property {Number} minPixelValue - the minimum stored pixel value in the image\n * @property {Number} maxPixelValue - the maximum stored pixel value in the image\n * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified\n * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified\n * @property {Number} windowCenter - the default windowCenter to apply to the image\n * @property {Number} windowWidth - the default windowWidth to apply to the image\n * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color\n * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images\n * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.\n * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats\n * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience\n * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience\n * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience\n * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience\n * @property {Boolean} color - true if pixel data is RGB, false if grayscale\n * @property {Object} lut - The Lookup Table\n * @property {Boolean} rgba - Is the color pixel data stored in RGBA?\n * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known\n * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or heigh of each pixel) in mm or undefined if not known\n * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1\n * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.\n * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping\n * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping\n * @property {ImageStats} [stats] - Statistics for the last redraw of the image\n * @property {Object} cachedLut - Cached Lookup Table for this image.\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * A Viewport Settings Object Cornerstone\n *\n * @typedef {Object} Viewport\n *\n * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x\n * @param {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.\n * @param {VOI} [voi] - an object with properties windowWidth and windowCenter.\n * @property {boolean} [invert=false] - Whether or not the image is inverted.\n * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.\n * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false\n * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false\n * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0\n * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none\n * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * An Enabled Element in Cornerstone\n *\n * @typedef {Object} EnabledElement\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement\n * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters\n * for each of the enabled element's layers\n * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean\n */\n\n/**\n * An Enabled Element Layer in Cornerstone\n *\n * @typedef {Object} EnabledElementLayer\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Object} [options] - Layer drawing options\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n */\n\n/**\n * An Image Load Object\n *\n * @typedef {Object} ImageLoadObject\n *\n * @property {Promise} promise - The Promise tracking the loading of this image\n * @property {Function|undefined} cancelFn - A function to cancel the image load request\n */\n\n/**\n * Retrieves a Cornerstone Enabled Element object\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n *\n * @returns {EnabledElement} A Cornerstone Enabled Element\n */\nfunction getEnabledElement(element) {\n if (element === undefined) {\n throw new Error('getEnabledElement: parameter element must not be undefined');\n }\n for (var i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n return enabledElements[i];\n }\n }\n\n throw new Error('element not enabled');\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object\n * @returns {void}\n */\nfunction addEnabledElement(enabledElement) {\n if (enabledElement === undefined) {\n throw new Error('getEnabledElement: enabledElement element must not be undefined');\n }\n\n enabledElements.push(enabledElement);\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {string} imageId A Cornerstone Image ID\n * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nfunction getEnabledElementsByImageId(imageId) {\n var ees = [];\n\n enabledElements.forEach(function (enabledElement) {\n if (enabledElement.image && enabledElement.image.imageId === imageId) {\n ees.push(enabledElement);\n }\n });\n\n return ees;\n}\n\n/**\n * Retrieve all of the currently enabled Cornerstone elements\n *\n * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nfunction getEnabledElements() {\n return enabledElements;\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = triggerEvent;\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nfunction triggerEvent(el, type) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n var event = void 0;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail: detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, context, scale) {\n if (enabledElement === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');\n }\n if (context === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');\n }\n\n var transform = (0, _calculateTransform2.default)(enabledElement, scale);\n\n context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);\n};\n\nvar _calculateTransform = __webpack_require__(22);\n\nvar _calculateTransform2 = _interopRequireDefault(_calculateTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n if (enabledElement.image === undefined && !enabledElement.layers.length) {\n throw new Error('updateImage: image has not been loaded yet');\n }\n\n (0, _drawImage2.default)(enabledElement, invalidated);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement) {\n var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n enabledElement.needsRedraw = true;\n if (invalidated) {\n enabledElement.invalid = true;\n }\n};\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (canvas, image) {\n if (canvas === undefined) {\n throw new Error('getDefaultViewport: parameter canvas must not be undefined');\n }\n\n if (image === undefined) {\n return {\n scale: 1,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false\n };\n }\n\n // Fit image to window\n var verticalScale = canvas.height / image.rows;\n var horizontalScale = canvas.width / image.columns;\n var scale = Math.min(horizontalScale, verticalScale);\n\n return {\n scale: scale,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: image.windowWidth,\n windowCenter: image.windowCenter\n },\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n voiLUT: image.voiLUT,\n colormap: image.colormap,\n labelmap: Boolean(image.labelmap)\n };\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _colormap = __webpack_require__(28);\n\nvar _lookupTable = __webpack_require__(29);\n\nvar _lookupTable2 = _interopRequireDefault(_lookupTable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n getColormap: _colormap.getColormap,\n getColormapsList: _colormap.getColormapsList,\n LookupTable: _lookupTable2.default\n};\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderColorImage = renderColorImage;\nexports.addColorLayer = addColorLayer;\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _generateColorLut = __webpack_require__(44);\n\nvar _generateColorLut2 = _interopRequireDefault(_generateColorLut);\n\nvar _storedColorPixelDataToCanvasImageData = __webpack_require__(19);\n\nvar _storedColorPixelDataToCanvasImageData2 = _interopRequireDefault(_storedColorPixelDataToCanvasImageData);\n\nvar _storedRGBAPixelDataToCanvasImageData = __webpack_require__(45);\n\nvar _storedRGBAPixelDataToCanvasImageData2 = _interopRequireDefault(_storedRGBAPixelDataToCanvasImageData);\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _index = __webpack_require__(13);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(12);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _initializeRenderCanvas = __webpack_require__(10);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _saveLastRendered = __webpack_require__(11);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getLut(image, viewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && image.cachedLut.invert === viewport.invert) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n (0, _generateColorLut2.default)(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n} /**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\n\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing\n if (enabledElement.viewport.voi.windowWidth === 255 && enabledElement.viewport.voi.windowCenter === 128 && enabledElement.viewport.invert === false && image.getCanvas && image.getCanvas()) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n var colorLut = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n (0, _storedRGBAPixelDataToCanvasImageData2.default)(image, colorLut, renderCanvasData.data);\n } else {\n (0, _storedColorPixelDataToCanvasImageData2.default)(image, colorLut, renderCanvasData.data);\n }\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderColorImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderColorImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderColorImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n var renderCanvas = void 0;\n\n if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = _index2.default.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\nfunction addColorLayer(layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addColorLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addColorLayer: image must be loaded before it can be drawn');\n }\n\n // All multi-layer images should include the alpha value\n image.rgba = true;\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement) {\n // For now we will calculate it every time it is requested.\n // In the future, we may want to cache it in the enabled element to speed things up.\n return (0, _calculateTransform2.default)(enabledElement);\n};\n\nvar _calculateTransform = __webpack_require__(22);\n\nvar _calculateTransform2 = _interopRequireDefault(_calculateTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, image) {\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n var canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n var renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n};\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement) {\n var imageId = enabledElement.image.imageId;\n var viewport = enabledElement.viewport;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap\n };\n\n return enabledElement.renderingTools;\n};\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, image) {\n var lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n var lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;\n\n return image.imageId !== lastRenderedImageId || !lastRenderedViewport || lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter || lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth || lastRenderedViewport.invert !== enabledElement.viewport.invert || lastRenderedViewport.rotation !== enabledElement.viewport.rotation || lastRenderedViewport.hflip !== enabledElement.viewport.hflip || lastRenderedViewport.vflip !== enabledElement.viewport.vflip || lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT || lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT || lastRenderedViewport.colormap !== enabledElement.viewport.colormap;\n};\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _renderer = __webpack_require__(46);\n\nvar _createProgramFromString = __webpack_require__(34);\n\nvar _createProgramFromString2 = _interopRequireDefault(_createProgramFromString);\n\nvar _textureCache = __webpack_require__(33);\n\nvar _textureCache2 = _interopRequireDefault(_textureCache);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mod = {\n createProgramFromString: _createProgramFromString2.default,\n renderer: {\n render: _renderer.render,\n initRenderer: _renderer.initRenderer,\n getRenderCanvas: _renderer.getRenderCanvas,\n isWebGLAvailable: _renderer.isWebGLAvailable\n },\n textureCache: _textureCache2.default\n};\n\nObject.defineProperty(mod, 'isWebGLInitialized', {\n enumerable: true,\n configurable: false,\n get: function get() {\n return _renderer.isWebGLInitialized;\n }\n});\n\nexports.default = mod;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EventTarget = function () {\n function EventTarget() {\n _classCallCheck(this, EventTarget);\n\n this.listeners = {};\n }\n\n _createClass(EventTarget, [{\n key: \"addEventListener\",\n value: function addEventListener(type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n }, {\n key: \"removeEventListener\",\n value: function removeEventListener(type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n var stack = this.listeners[type];\n\n for (var i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n }, {\n key: \"dispatchEvent\",\n value: function dispatchEvent(event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n\n var stack = this.listeners[event.type];\n\n for (var i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n }]);\n\n return EventTarget;\n}();\n\nvar events = new EventTarget();\n\nexports.default = events;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderGrayscaleImage = renderGrayscaleImage;\nexports.addGrayscaleLayer = addGrayscaleLayer;\n\nvar _storedPixelDataToCanvasImageData = __webpack_require__(18);\n\nvar _storedPixelDataToCanvasImageData2 = _interopRequireDefault(_storedPixelDataToCanvasImageData);\n\nvar _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(30);\n\nvar _storedPixelDataToCanvasImageDataRGBA2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataRGBA);\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _index = __webpack_require__(13);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _getLut = __webpack_require__(32);\n\nvar _getLut2 = _interopRequireDefault(_getLut);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(12);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _initializeRenderCanvas = __webpack_require__(10);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _saveLastRendered = __webpack_require__(11);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n var useAlphaChannel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n var lut = (0, _getLut2.default)(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // Gray scale image - apply the lut and put the resulting image onto the render canvas\n if (useAlphaChannel) {\n (0, _storedPixelDataToCanvasImageData2.default)(image, lut, renderCanvasData.data);\n } else {\n (0, _storedPixelDataToCanvasImageDataRGBA2.default)(image, lut, renderCanvasData.data);\n }\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderGrayscaleImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n var renderCanvas = void 0;\n\n if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = _index2.default.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\n/**\n * API function to draw a grayscale image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.\n This does not work if this layer is not the first layer in the enabledElement.\n * @returns {void}\n */\nfunction addGrayscaleLayer(layer, invalidated) {\n var useAlphaChannel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (layer === undefined) {\n throw new Error('addGrayscaleLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {\n var maxPixelValue = image.maxPixelValue;\n var minPixelValue = image.minPixelValue;\n var offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n var length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n var lut = image.cachedLut.lutArray;\n var mlutfn = (0, _getModalityLUT2.default)(image.slope, image.intercept, modalityLUT);\n var vlutfn = (0, _getVOILut2.default)(windowWidth, windowCenter, voiLUT);\n\n if (invert === true) {\n for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));\n }\n } else {\n for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {\n lut[_storedValue + -offset] = vlutfn(mlutfn(_storedValue));\n }\n }\n\n return lut;\n};\n\nvar _getModalityLUT = __webpack_require__(26);\n\nvar _getModalityLUT2 = _interopRequireDefault(_getModalityLUT);\n\nvar _getVOILut = __webpack_require__(27);\n\nvar _getVOILut2 = _interopRequireDefault(_getVOILut);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (callback) {\n return window.requestAnimationFrame(callback) || window.webkitRequestAnimationFrame(callback) || window.mozRequestAnimationFrame(callback) || window.oRequestAnimationFrame(callback) || window.msRequestAnimationFrame(callback) || requestFrame(callback);\n};\n\nfunction requestFrame(callback) {\n window.setTimeout(callback, 1000 / 60);\n}\n\n/**\n * Polyfills requestAnimationFrame for older browsers.\n *\n * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.\n *\n * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.\n */\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 3;\n var storedPixelDataIndex = 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = (0, _now2.default)();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = (0, _now2.default)();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + -minPixelValue]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataColorLUT(image, colorLut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var rgba = void 0;\n var clut = void 0;\n\n start = (0, _now2.default)();\n\n if (colorLut instanceof _index2.default.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n}\n\nexports.default = storedPixelDataToCanvasImageDataColorLUT;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT(image, grayscaleLut, colorLut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var grayscale = void 0;\n var rgba = void 0;\n var clut = void 0;\n\n start = (0, _now2.default)();\n\n if (colorLut instanceof _index2.default.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n}\n\nexports.default = storedPixelDataToCanvasImageDataPseudocolorLUT;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, scale) {\n\n var transform = new _transform.Transform();\n\n transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2);\n\n // Apply the rotation before scaling for non square pixels\n var angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n // Apply the scale\n var widthScale = enabledElement.viewport.scale;\n var heightScale = enabledElement.viewport.scale;\n\n if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {\n widthScale *= enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing;\n } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {\n heightScale *= enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing;\n }\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate(-angle * Math.PI / 180);\n }\n\n // Apply the pan offset\n transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y);\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Translate the origin back to the corner of the image so the event handlers can draw in image coordinate system\n transform.translate(-enabledElement.image.width / 2, -enabledElement.image.height / 2);\n\n return transform;\n};\n\nvar _transform = __webpack_require__(31);\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderLabelMapImage = renderLabelMapImage;\nexports.addLabelMapLayer = addLabelMapLayer;\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _initializeRenderCanvas = __webpack_require__(10);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _saveLastRendered = __webpack_require__(11);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(12);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _storedPixelDataToCanvasImageDataColorLUT = __webpack_require__(20);\n\nvar _storedPixelDataToCanvasImageDataColorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataColorLUT);\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && typeof colormap === 'string') {\n colormap = _index2.default.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderLabelMapImage: colormap not found.');\n }\n\n var colormapId = colormap.getId();\n\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n\n if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var colorLut = enabledElement.renderingTools.colorLut;\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n (0, _storedPixelDataToCanvasImageDataColorLUT2.default)(image, colorLut, renderCanvasData.data);\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a label map image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderLabelMapImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for label map pipeline\n var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n var width = image.width,\n height = image.height;\n\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction addLabelMapLayer(layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addLabelMapLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderPseudoColorImage = renderPseudoColorImage;\nexports.addPseudoColorLayer = addPseudoColorLayer;\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _initializeRenderCanvas = __webpack_require__(10);\n\nvar _initializeRenderCanvas2 = _interopRequireDefault(_initializeRenderCanvas);\n\nvar _getLut = __webpack_require__(32);\n\nvar _getLut2 = _interopRequireDefault(_getLut);\n\nvar _saveLastRendered = __webpack_require__(11);\n\nvar _saveLastRendered2 = _interopRequireDefault(_saveLastRendered);\n\nvar _doesImageNeedToBeRendered = __webpack_require__(12);\n\nvar _doesImageNeedToBeRendered2 = _interopRequireDefault(_doesImageNeedToBeRendered);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT);\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getRenderCanvas(enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n var renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && typeof colormap === 'string') {\n colormap = _index2.default.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n var colormapId = colormap.getId();\n\n if ((0, _doesImageNeedToBeRendered2.default)(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n (0, _initializeRenderCanvas2.default)(enabledElement, image);\n }\n\n // Get the lut to use\n var start = (0, _now2.default)();\n\n if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n var lut = (0, _getLut2.default)(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = (0, _now2.default)() - start;\n\n var colorLut = enabledElement.renderingTools.colorLut;\n var renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n (0, _storedPixelDataToCanvasImageDataPseudocolorLUT2.default)(image, lut, colorLut, renderCanvasData.data);\n\n start = (0, _now2.default)();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = (0, _now2.default)() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction renderPseudoColorImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n var width = image.width,\n height = image.height;\n\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = (0, _saveLastRendered2.default)(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nfunction addPseudoColorLayer(layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addPseudoColorLayer: layer parameter must not be undefined');\n }\n\n var image = layer.image;\n\n if (image === undefined) {\n throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n var context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = (0, _saveLastRendered2.default)(layer);\n}\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rescaleImage = rescaleImage;\nexports.addLayer = addLayer;\nexports.removeLayer = removeLayer;\nexports.getLayer = getLayer;\nexports.getLayers = getLayers;\nexports.getVisibleLayers = getVisibleLayers;\nexports.setActiveLayer = setActiveLayer;\nexports.setLayerImage = setLayerImage;\nexports.getActiveLayer = getActiveLayer;\n\nvar _guid = __webpack_require__(57);\n\nvar _guid2 = _interopRequireDefault(_guid);\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Helper function to trigger an event on a Cornerstone element with\n * a specific layerId\n *\n * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)\n * @param {EnabledElement} enabledElement The Cornerstone enabled element\n * @param {String} layerId The layer's unique identifier\n * @returns {void}\n */\nfunction triggerEvent(eventName, enabledElement, layerId) {\n var element = enabledElement.element;\n var eventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n enabledElement: enabledElement,\n layerId: layerId\n };\n\n (0, _triggerEvent2.default)(element, eventName, eventData);\n}\n\n/**\n * Rescale the target layer to the base layer based on the\n * relative size of each image and their pixel dimensions.\n *\n * This function will update the Viewport parameters of the\n * target layer to a new scale.\n *\n * @param {EnabledElementLayer} baseLayer The base layer\n * @param {EnabledElementLayer} targetLayer The target layer to rescale\n * @returns {void}\n */\nfunction rescaleImage(baseLayer, targetLayer) {\n if (baseLayer.layerId === targetLayer.layerId) {\n throw new Error('rescaleImage: both arguments represent the same layer');\n }\n\n var baseImage = baseLayer.image;\n var targetImage = targetLayer.image;\n\n // Return if these images don't have an imageId (e.g. for dynamic images)\n if (!baseImage.imageId || !targetImage.imageId) {\n return;\n }\n\n // Column pixel spacing need to be considered when calculating the\n // ratio between the layer added and base layer images\n var colRelative = targetImage.columnPixelSpacing * targetImage.width / (baseImage.columnPixelSpacing * baseImage.width);\n var viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;\n\n targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;\n}\n\n/**\n * Add a layer to a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image object to add as a new layer\n * @param {Object} options Options for the layer\n *\n * @returns {String} layerId The new layer's unique identifier\n */\nfunction addLayer(element, image, options) {\n var layerId = (0, _guid2.default)();\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var layers = enabledElement.layers;\n var viewport = void 0;\n\n if (image) {\n viewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (options && options.viewport) {\n viewport = Object.assign(viewport, options.viewport);\n }\n }\n\n // Set syncViewports to true by default when a new layer is added\n if (enabledElement.syncViewports !== false) {\n enabledElement.syncViewports = true;\n }\n\n var newLayer = {\n image: image,\n layerId: layerId,\n viewport: viewport,\n options: options || {},\n renderingTools: {}\n };\n\n // Rescale the new layer based on the base layer to make sure\n // they will have a proportional size (pixel spacing)\n if (layers.length && image) {\n rescaleImage(layers[0], newLayer);\n }\n\n layers.push(newLayer);\n\n triggerEvent('cornerstonelayeradded', enabledElement, layerId);\n\n // Set the layer as active if it's the first layer added\n if (layers.length === 1 && image) {\n setActiveLayer(element, layerId);\n }\n\n return layerId;\n}\n\n/**\n * Remove a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nfunction removeLayer(element, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var layers = enabledElement.layers;\n var index = enabledElement.layers.findIndex(function (layer) {\n return layer.layerId === layerId;\n });\n\n if (index !== -1) {\n layers.splice(index, 1);\n\n // If the current layer is active, and we have other layers,\n // switch to the first layer that remains in the array\n if (layerId === enabledElement.activeLayerId && layers.length) {\n setActiveLayer(element, layers[0].layerId);\n }\n\n triggerEvent('cornerstonelayerremoved', enabledElement, layerId);\n }\n}\n\n/**\n * Retrieve a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @return {EnabledElementLayer} The layer\n */\nfunction getLayer(element, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers.find(function (layer) {\n return layer.layerId === layerId;\n });\n}\n\n/**\n * Retrieve all layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nfunction getLayers(element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers;\n}\n\n/**\n * Retrieve all visible layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nfunction getVisibleLayers(element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers.filter(function (layer) {\n return layer.options && layer.options.visible !== false && layer.options.opacity !== 0;\n });\n}\n\n/**\n * Set the active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nfunction setActiveLayer(element, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n // Stop here if this layer is already active\n if (enabledElement.activeLayerId === layerId) {\n return;\n }\n\n var index = enabledElement.layers.findIndex(function (layer) {\n return layer.layerId === layerId;\n });\n\n if (index === -1) {\n throw new Error('setActiveLayer: layer not found in layers array');\n }\n\n var layer = enabledElement.layers[index];\n\n if (!layer.image) {\n throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');\n }\n\n enabledElement.activeLayerId = layerId;\n enabledElement.image = layer.image;\n enabledElement.viewport = layer.viewport;\n\n (0, _updateImage2.default)(element);\n triggerEvent('cornerstoneactivelayerchanged', enabledElement, layerId);\n}\n\n/**\n * Set a new image for a specific layerId\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image The image to be displayed in this layer\n * @param {String} [layerId] The unique identifier for the layer\n * @returns {void}\n */\nfunction setLayerImage(element, image, layerId) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var baseLayer = enabledElement.layers[0];\n\n var layer = void 0;\n\n if (layerId) {\n layer = getLayer(element, layerId);\n } else {\n layer = getActiveLayer(element);\n }\n\n if (!layer) {\n throw new Error('setLayerImage: Layer not found');\n }\n\n layer.image = image;\n\n if (!image) {\n layer.viewport = undefined;\n\n return;\n }\n\n if (!layer.viewport) {\n var defaultViewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (layer.options && layer.options.viewport) {\n layer.viewport = Object.assign(defaultViewport, layer.options.viewport);\n }\n\n if (baseLayer.layerId !== layerId) {\n rescaleImage(baseLayer, layer);\n }\n }\n}\n\n/**\n * Retrieve the currently active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @return {EnabledElementLayer} The currently active layer\n */\nfunction getActiveLayer(element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.layers.find(function (layer) {\n return layer.layerId === enabledElement.activeLayerId;\n });\n}\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (slope, intercept, modalityLUT) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n};\n\n/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n */\nfunction generateLinearModalityLUT(slope, intercept) {\n return function (storedPixelValue) {\n return storedPixelValue * slope + intercept;\n };\n}\n\nfunction generateNonLinearModalityLUT(modalityLUT) {\n var minValue = modalityLUT.lut[0];\n var maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n var maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return function (storedPixelValue) {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n */\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (windowWidth, windowCenter, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n};\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n */\n\n/**\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateLinearVOILUT(windowWidth, windowCenter) {\n return function (modalityLutValue) {\n return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateNonLinearVOILUT(voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n var bitsPerEntry = Math.max.apply(Math, _toConsumableArray(voiLUT.lut)).toString(2).length;\n var shift = bitsPerEntry - 8;\n var minValue = voiLUT.lut[0] >> shift;\n var maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n var maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n */\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getColormapsList = getColormapsList;\nexports.getColormap = getColormap;\n\nvar _lookupTable = __webpack_require__(29);\n\nvar _lookupTable2 = _interopRequireDefault(_lookupTable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar COLOR_TRANSPARENT = [0, 0, 0, 0];\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palattes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nvar colormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [[0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255], [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255], [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255], [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255], [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255], [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255], [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255], [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255], [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255], [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255], [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255], [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255], [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255], [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255], [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255], [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255], [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255], [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255], [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255], [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255], [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255], [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255], [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255], [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255], [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255], [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255], [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255], [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255], [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255], [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255], [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255], [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255], [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255], [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255], [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255], [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255], [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255], [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255], [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255], [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255], [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255], [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255], [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255], [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255], [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255], [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255], [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255], [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255], [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255], [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255], [255, 255, 255, 255]]\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [[0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255], [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255], [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255], [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255], [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255], [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255], [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255], [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255], [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255], [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255], [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255], [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255], [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255], [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255], [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255], [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255], [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255], [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255], [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255], [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255], [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255], [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255], [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255], [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255], [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255], [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255], [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255], [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255], [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255], [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255], [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255], [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255], [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255], [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255], [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255], [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255], [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255], [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255], [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255], [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255], [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255], [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255], [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255], [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255], [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255], [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255], [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255], [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255], [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255], [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255], [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255], [255, 255, 255, 255]]\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [[0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255], [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255], [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255], [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255], [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255], [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255], [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255], [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255], [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255], [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255], [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255], [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255], [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255], [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255], [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255], [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255], [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255], [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255], [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255], [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255], [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255], [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255], [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255], [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255], [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255], [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255], [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255], [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255], [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255], [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255], [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255], [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255], [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255], [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255], [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255], [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255], [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255], [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255], [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255], [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255], [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255], [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255], [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255], [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255], [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255], [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255], [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255], [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255], [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255], [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255], [255, 255, 255, 255]]\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [[0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]]\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 1, 1]]\n }\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],\n green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],\n blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]\n }\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750], [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0], [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750], [0.857143, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1], [0.507937, 1, 1], [0.666667, 0.062500, 0.062500], [0.682540, 0, 0], [1, 0, 0]],\n blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500], [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500], [1, 0.09375, 0.09375]]\n }\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],\n blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]\n }\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 1, 1], [1, 0, 0]],\n blue: [[0, 1, 1], [1, 1, 1]]\n }\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0, 0]]\n }\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0.5, 0.5], [1, 1, 1]],\n blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]\n }\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 0, 0]]\n }\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 0, 0]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0.5, 0.5]]\n }\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],\n blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]\n }\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 0.7812, 0.7812]],\n blue: [[0, 0, 0], [1, 0.4975, 0.4975]]\n }\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0], [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1], [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80], [1, 0.80, 0.80]],\n green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000], [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000], [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1], [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000], [0.80, 0.6000, 0.6000], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],\n blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667], [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667], [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0], [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0], [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]\n }\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388], [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478], [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608], [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204], [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162], [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281], [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949], [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556], [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179], [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518], [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803], [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177], [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866], [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617], [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542], [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934], [1, 0.705673158, 0.705673158]],\n green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838], [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618], [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092], [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772], [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107], [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712], [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879], [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984], [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047], [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443], [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809], [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156], [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968], [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467], [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446], [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067], [1, 0.01555616, 0.01555616]],\n blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763], [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899], [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588], [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814], [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203], [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227], [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269], [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838], [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546], [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146], [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763], [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762], [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684], [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596], [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199], [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123], [1, 0.150232812, 0.150232812]]\n }\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991], [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429], [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256], [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502], [1, 0.031372550874948502, 0.031372550874948502]],\n green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449], [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144], [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698], [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169], [1, 0.18823529779911041, 0.18823529779911041]],\n blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359], [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171], [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162], [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]\n }\n }\n};\n\n// Generate linearly spaced vectors\n// http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\nfunction linspace(a, b, n) {\n n = n === null ? 100 : n;\n\n var increment = (b - a) / (n - 1);\n var vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n// Return the number of elements smaller than \"elem\" (binary search)\nfunction getRank(array, elem) {\n var left = 0;\n var right = array.length - 1;\n\n while (left <= right) {\n var mid = left + Math.floor((right - left) / 2);\n var midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n// Find the indices into a sorted array a such that, if the corresponding elements\n// In v were inserted before the indices, the order of a would be preserved.\n// http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\nfunction searchSorted(inputArray, values) {\n var i = void 0;\n var indexes = [];\n var len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n// Create an *N* -element 1-d lookup table\n//\n// *Data* represented by a list of x,y0,y1 mapping correspondences. Each element in this\n// List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n// A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n// Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n// The value of y for values of x <= to that given, and y1 is the value to be used for x >\n// Than that given). The list must start with x=0, end with x=1, and all values of x must be\n// In increasing order. Values between the given mapping points are determined by simple linear\n// Interpolation.\n//\n// The function returns an array \"result\" where result[x*(N-1)] gives the closest value for\n// Values of x between 0 and 1.\nfunction makeMappingArray(N, data, gamma) {\n var i = void 0;\n var x = [];\n var y0 = [];\n var y1 = [];\n var lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n var element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n var xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n var xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n var index = xLinSpaceIndexes[i];\n var colorPercent = (xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]);\n var colorDelta = y0[index] - y1[index - 1];\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n// Colormap based on lookup tables using linear segments.\n//\n// The lookup table is generated using linear interpolation for each\n// Primary color, with the 0-1 domain divided into any number of\n// Segments.\n//\n// https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\nfunction createLinearSegmentedColormap(segmentedData, N, gamma) {\n var i = void 0;\n var lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n var redLut = makeMappingArray(N, segmentedData.red, gamma);\n var greenLut = makeMappingArray(N, segmentedData.green, gamma);\n var blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n var red = Math.round(redLut[i] * 255);\n var green = Math.round(greenLut[i] * 255);\n var blue = Math.round(blueLut[i] * 255);\n var rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/*\n* Return all colormaps (id and name) available\n*/\nfunction getColormapsList() {\n var colormaps = [];\n var keys = Object.keys(colormapsData);\n\n keys.forEach(function (key) {\n if (colormapsData.hasOwnProperty(key)) {\n var colormap = colormapsData[key];\n\n colormaps.push({\n id: key,\n name: colormap.name\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n var aName = a.name.toLowerCase();\n var bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n *\n * @returns {*} The Colormap Object\n */\nfunction getColormap(id, colormapData) {\n var colormap = colormapsData[id];\n\n if (!colormap) {\n colormap = colormapsData[id] = colormapData || {\n name: '',\n colors: []\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);\n }\n\n return {\n getId: function getId() {\n return id;\n },\n getColorSchemeName: function getColorSchemeName() {\n return colormap.name;\n },\n setColorSchemeName: function setColorSchemeName(name) {\n colormap.name = name;\n },\n getNumberOfColors: function getNumberOfColors() {\n return colormap.colors.length;\n },\n setNumberOfColors: function setNumberOfColors(numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n getColor: function getColor(index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n getColorRepeating: function getColorRepeating(index) {\n var numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n setColor: function setColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n addColor: function addColor(rgba) {\n colormap.colors.push(rgba);\n },\n insertColor: function insertColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n removeColor: function removeColor(index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n clearColors: function clearColors() {\n colormap.colors = [];\n },\n buildLookupTable: function buildLookupTable(lut) {\n if (!lut) {\n return;\n }\n\n var numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (var i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n createLookupTable: function createLookupTable() {\n var lut = new _lookupTable2.default();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n isValidIndex: function isValidIndex(index) {\n return index >= 0 && index < colormap.colors.length;\n }\n };\n}\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nvar BELOW_RANGE_COLOR_INDEX = 0;\nvar ABOVE_RANGE_COLOR_INDEX = 1;\nvar NAN_COLOR_INDEX = 2;\n\nfunction HSVToRGB(hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n var rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n var hueCase = Math.floor(hue * 6);\n var frac = 6 * hue - hueCase;\n var lx = val * (1 - sat);\n var ly = val * (1 - sat * frac);\n var lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\nvar LookupTable = function () {\n function LookupTable() {\n _classCallCheck(this, LookupTable);\n\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n _createClass(LookupTable, [{\n key: 'setNumberOfTableValues',\n value: function setNumberOfTableValues(number) {\n this.NumberOfColors = number;\n }\n }, {\n key: 'setRamp',\n value: function setRamp(ramp) {\n this.Ramp = ramp;\n }\n }, {\n key: 'setTableRange',\n value: function setTableRange(start, end) {\n // Set/Get the minimum/maximum scalar values for scalar mapping.\n // Scalar values less than minimum range value are clamped to minimum range value.\n // Scalar values greater than maximum range value are clamped to maximum range value.\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n }, {\n key: 'setHueRange',\n value: function setHueRange(start, end) {\n // Set the range in hue (using automatic generation). Hue ranges between [0,1].\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n }, {\n key: 'setSaturationRange',\n value: function setSaturationRange(start, end) {\n // Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n }, {\n key: 'setValueRange',\n value: function setValueRange(start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n }, {\n key: 'setRange',\n value: function setRange(start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n }, {\n key: 'setAlphaRange',\n value: function setAlphaRange(start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n }, {\n key: 'getColor',\n value: function getColor(scalar) {\n // Map one value through the lookup table and return the color as an\n // RGB array of doubles between 0 and 1.\n return this.mapValue(scalar);\n }\n }, {\n key: 'build',\n value: function build(force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n var maxIndex = this.NumberOfColors - 1;\n\n var hinc = void 0,\n sinc = void 0,\n vinc = void 0,\n ainc = void 0;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (var i = 0; i <= maxIndex; i++) {\n var hue = this.HueRange[0] + i * hinc;\n var sat = this.SaturationRange[0] + i * sinc;\n var val = this.ValueRange[0] + i * vinc;\n var alpha = this.AlphaRange[0] + i * ainc;\n\n var rgb = HSVToRGB(hue, sat, val);\n var c_rgba = [];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));\n c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));\n c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error('Invalid Ramp value (' + this.Ramp + ')');\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n }, {\n key: 'buildSpecialColors',\n value: function buildSpecialColors() {\n var numberOfColors = this.NumberOfColors;\n var belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n var aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n var nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n // Given a scalar value v, return an rgba color value from lookup table.\n\n }, {\n key: 'mapValue',\n value: function mapValue(v) {\n var index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n }, {\n key: 'getIndex',\n value: function getIndex(v) {\n var p = {};\n\n p.Range = [];\n p.MaxIndex = this.NumberOfColors - 1;\n\n // This was LookupShiftAndScale\n p.Shift = -this.TableRange[0];\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n var index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n }, {\n key: 'setTableValue',\n value: function setTableValue(index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error('Can\\'t set the table value for negative index (' + index + ')');\n }\n\n if (index >= this.NumberOfColors) {\n new Error('Index ' + index + ' is greater than the number of colors ' + this.NumberOfColors);\n }\n\n this.Table[index] = rgba;\n\n if (index === 0 || index === this.NumberOfColors - 1) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n }]);\n\n return LookupTable;\n}();\n\nexports.default = LookupTable;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var numPixels = pixelData.length;\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var pixelValue = void 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = (0, _now2.default)();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nvar Transform = exports.Transform = function () {\n function Transform() {\n _classCallCheck(this, Transform);\n\n this.reset();\n }\n\n _createClass(Transform, [{\n key: \"reset\",\n value: function reset() {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n }, {\n key: \"clone\",\n value: function clone() {\n var transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n }, {\n key: \"multiply\",\n value: function multiply(matrix) {\n var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n }, {\n key: \"invert\",\n value: function invert() {\n var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n var m0 = this.m[3] * d;\n var m1 = -this.m[1] * d;\n var m2 = -this.m[2] * d;\n var m3 = this.m[0] * d;\n var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n }, {\n key: \"rotate\",\n value: function rotate(rad) {\n var c = Math.cos(rad);\n var s = Math.sin(rad);\n var m11 = this.m[0] * c + this.m[2] * s;\n var m12 = this.m[1] * c + this.m[3] * s;\n var m21 = this.m[0] * -s + this.m[2] * c;\n var m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n }, {\n key: \"translate\",\n value: function translate(x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n }, {\n key: \"scale\",\n value: function scale(sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n }, {\n key: \"transformPoint\",\n value: function transformPoint(px, py) {\n var x = px;\n var y = py;\n\n px = x * this.m[0] + y * this.m[2] + this.m[4];\n py = x * this.m[1] + y * this.m[3] + this.m[5];\n\n return {\n x: px,\n y: py\n };\n }\n }]);\n\n return Transform;\n}();\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, viewport, invalidated) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && (0, _lutMatches2.default)(image.cachedLut.modalityLUT, viewport.modalityLUT) && (0, _lutMatches2.default)(image.cachedLut.voiLUT, viewport.voiLUT) && image.cachedLut.invert === viewport.invert && invalidated !== true) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n (0, _generateLut2.default)(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n};\n\nvar _lutMatches = __webpack_require__(43);\n\nvar _lutMatches2 = _interopRequireDefault(_lutMatches);\n\nvar _generateLut = __webpack_require__(16);\n\nvar _generateLut2 = _interopRequireDefault(_generateLut);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(14);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module deals with caching image textures in VRAM for WebGL\r\n */\n\nvar imageCache = {};\n\nvar cachedImages = [];\n\nvar maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB\nvar cacheSizeInBytes = 0;\n\nfunction getCacheInfo() {\n return {\n maximumSizeInBytes: maximumSizeInBytes,\n cacheSizeInBytes: cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\nfunction purgeCacheIfNecessary() {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare(a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary\n while (cacheSizeInBytes > maximumSizeInBytes) {\n var lastCachedImage = cachedImages[cachedImages.length - 1];\n\n cacheSizeInBytes -= lastCachedImage.sizeInBytes;\n delete imageCache[lastCachedImage.imageId];\n cachedImages.pop();\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstonewebgltextureremoved', { imageId: lastCachedImage.imageId });\n }\n\n var cacheInfo = getCacheInfo();\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstonewebgltexturecachefull', cacheInfo);\n}\n\nfunction setMaximumSizeBytes(numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n purgeCacheIfNecessary();\n}\n\nfunction putImageTexture(image, imageTexture) {\n var imageId = image.imageId;\n\n if (image === undefined) {\n throw new Error('putImageTexture: image must not be undefined');\n }\n\n if (imageId === undefined) {\n throw new Error('putImageTexture: imageId must not be undefined');\n }\n\n if (imageTexture === undefined) {\n throw new Error('putImageTexture: imageTexture must not be undefined');\n }\n\n if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {\n throw new Error('putImageTexture: imageId already in cache');\n }\n\n var cachedImage = {\n imageId: imageId,\n imageTexture: imageTexture,\n timeStamp: new Date(),\n sizeInBytes: imageTexture.sizeInBytes\n };\n\n imageCache[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n if (imageTexture.sizeInBytes === undefined) {\n throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');\n }\n if (imageTexture.sizeInBytes.toFixed === undefined) {\n throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');\n }\n cacheSizeInBytes += cachedImage.sizeInBytes;\n purgeCacheIfNecessary();\n}\n\nfunction getImageTexture(imageId) {\n if (imageId === undefined) {\n throw new Error('getImageTexture: imageId must not be undefined');\n }\n var cachedImage = imageCache[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = new Date();\n\n return cachedImage.imageTexture;\n}\n\nfunction removeImageTexture(imageId) {\n if (imageId === undefined) {\n throw new Error('removeImageTexture: imageId must not be undefined');\n }\n var cachedImage = imageCache[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImageTexture: imageId must not be undefined');\n }\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n delete imageCache[imageId];\n\n return cachedImage.imageTexture;\n}\n\nfunction purgeCache() {\n while (cachedImages.length > 0) {\n var removedCachedImage = cachedImages.pop();\n\n delete imageCache[removedCachedImage.imageId];\n }\n cacheSizeInBytes = 0;\n}\n\nexports.default = {\n purgeCache: purgeCache,\n getImageTexture: getImageTexture,\n putImageTexture: putImageTexture,\n removeImageTexture: removeImageTexture,\n setMaximumSizeBytes: setMaximumSizeBytes\n};\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (gl, vertexShaderSrc, fragShaderSrc) {\n var vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);\n var fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);\n\n return createProgram(gl, vertexShader, fragShader);\n};\n\n/**\n * Creates and compiles a shader.\n *\n * @param {!WebGLRenderingContext} gl The WebGL Context.\n * @param {string} shaderSource The GLSL source code for the shader.\n * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.\n *\n * @return {!WebGLShader} The shader.\n */\nfunction compileShader(gl, shaderSource, shaderType) {\n\n // Create the shader object\n var shader = gl.createShader(shaderType);\n\n // Set the shader source code.\n gl.shaderSource(shader, shaderSource);\n\n // Compile the shader\n gl.compileShader(shader);\n\n // Check if it compiled\n var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong during compilation; get the error\n var infoLog = gl.getShaderInfoLog(shader);\n\n console.error(\"Could not compile shader:\\n\" + infoLog);\n }\n\n return shader;\n}\n\n/**\n * Creates a program from 2 shaders.\n *\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShader A vertex shader.\n * @param {!WebGLShader} fragmentShader A fragment shader.\n * @return {!WebGLProgram} A program.\n */\nfunction createProgram(gl, vertexShader, fragmentShader) {\n\n // Create a program.\n var program = gl.createProgram();\n\n // Attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n // Link the program.\n gl.linkProgram(program);\n\n // Check if it linked.\n var success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong with the link\n var infoLog = gl.getProgramInfoLog(program);\n\n console.error(\"WebGL program filed to link:\\n\" + infoLog);\n }\n\n return program;\n}\n\n/**\n * Creates a program from 2 shaders source (Strings)\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShaderSrc Vertex shader string\n * @param {!WebGLShader} fragShaderSrc Fragment shader string\n * @return {!WebGLProgram} A program\n */\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.renderWebImage = renderWebImage;\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nvar _renderColorImage = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * API function to draw a standard web image (PNG, JPG) to an enabledImage\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\n/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nfunction renderWebImage(enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderWebImage: enabledElement parameter must not be undefined');\n }\n\n var image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderWebImage: image must be loaded before it can be drawn');\n }\n\n // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image\n // Directly. If any of those are changed, we call renderColorImage() to apply the lut\n if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth && enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter && enabledElement.viewport.invert === false) {\n\n // Get the canvas context and reset the transform\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n (0, _setToPixelCoordinateSystem2.default)(enabledElement, context);\n\n context.drawImage(image.getImage(), 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n } else {\n (0, _renderColorImage.renderColorImage)(enabledElement, invalidated);\n }\n}\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, fitViewportToWindow) {\n\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n setCanvasSize(element, enabledElement.canvas);\n\n var eventData = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'cornerstoneelementresized', eventData);\n\n if (enabledElement.image === undefined) {\n return;\n }\n\n if (fitViewportToWindow === true) {\n (0, _fitToWindow2.default)(element);\n } else {\n (0, _updateImage2.default)(element);\n }\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _fitToWindow = __webpack_require__(37);\n\nvar _fitToWindow2 = _interopRequireDefault(_fitToWindow);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\nfunction setCanvasSize(element, canvas) {\n // The device pixel ratio is 1.0 for normal displays and > 1.0\n // For high DPI displays like Retina\n /*\r\n This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas\r\n is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to\r\n a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel\r\n produces incorrect results. I couldn't find any way to determine when the DPI changed other than\r\n by polling which is not very clean. If anyone has any ideas here, please let me know, but for now\r\n we will disable this functionality. We may want\r\n to add a mechanism to optionally enable this functionality if we can determine it is safe to do\r\n so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing\r\n to be cautious here since I would rather not have bug reports or safety issues related to this\r\n scenario.\r\n var devicePixelRatio = window.devicePixelRatio;\r\n if(devicePixelRatio === undefined) {\r\n devicePixelRatio = 1.0;\r\n }\r\n */\n\n // Avoid setting the same value because it flashes the canvas with IE and Edge\n if (canvas.width !== element.clientWidth) {\n canvas.width = element.clientWidth;\n canvas.style.width = element.clientWidth + 'px';\n }\n // Avoid setting the same value because it flashes the canvas with IE and Edge\n if (canvas.height !== element.clientHeight) {\n canvas.height = element.clientHeight;\n canvas.style.height = element.clientHeight + 'px';\n }\n}\n\n/**\r\n * Resizes an enabled element and optionally fits the image to window\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {Boolean} fitViewportToWindow true to refit, false to leave viewport parameters as they are\r\n * @returns {void}\r\n */\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var imageSize = getImageSize(enabledElement);\n\n var verticalScale = enabledElement.canvas.height / imageSize.height;\n var horizontalScale = enabledElement.canvas.width / imageSize.width;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = Math.min(horizontalScale, verticalScale);\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @return {{width, height}} The Image dimensions\n */\nfunction getImageSize(enabledElement) {\n if (enabledElement.viewport.rotation === 0 || enabledElement.viewport.rotation === 180) {\n return {\n width: enabledElement.image.width,\n height: enabledElement.image.height\n };\n }\n\n return {\n width: enabledElement.image.height,\n height: enabledElement.image.width\n };\n}\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param {HTMLElement} element The Cornerstone element to update\n * @returns {void}\n */\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (element === undefined) {\n throw new Error('getStoredPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var storedPixels = [];\n var index = 0;\n var pixelData = enabledElement.image.getPixelData();\n\n for (var row = 0; row < height; row++) {\n for (var column = 0; column < width; column++) {\n var spIndex = (row + y) * enabledElement.image.columns + (column + x);\n\n storedPixels[index++] = pixelData[spIndex];\n }\n }\n\n return storedPixels;\n};\n\nvar _enabledElements = __webpack_require__(0);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.cachedImages = undefined;\nexports.setMaximumSizeBytes = setMaximumSizeBytes;\nexports.putImageLoadObject = putImageLoadObject;\nexports.getImageLoadObject = getImageLoadObject;\nexports.removeImageLoadObject = removeImageLoadObject;\nexports.getCacheInfo = getCacheInfo;\nexports.purgeCache = purgeCache;\nexports.changeImageIdCacheSize = changeImageIdCacheSize;\n\nvar _events = __webpack_require__(14);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * This module deals with caching images\n */\nvar maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB\nvar cacheSizeInBytes = 0;\n\n// Dictionary of imageId to cachedImage objects\nvar imageCacheDict = {};\n\n// Array of cachedImage objects\nvar cachedImages = exports.cachedImages = [];\n\nfunction setMaximumSizeBytes(numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachemaximumsizechanged');\n\n purgeCacheIfNecessary();\n}\n\nfunction purgeCacheIfNecessary() {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare(a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary)\n while (cacheSizeInBytes > maximumSizeInBytes) {\n var lastCachedImage = cachedImages[cachedImages.length - 1];\n var imageId = lastCachedImage.imageId;\n\n removeImageLoadObject(imageId);\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachepromiseremoved', { imageId: imageId });\n }\n\n var cacheInfo = getCacheInfo();\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachefull', cacheInfo);\n}\n\nfunction putImageLoadObject(imageId, imageLoadObject) {\n if (imageId === undefined) {\n throw new Error('putImageLoadObject: imageId must not be undefined');\n }\n if (imageLoadObject.promise === undefined) {\n throw new Error('putImageLoadObject: imageLoadObject.promise must not be undefined');\n }\n if (imageCacheDict.hasOwnProperty(imageId) === true) {\n throw new Error('putImageLoadObject: imageId already in cache');\n }\n if (imageLoadObject.cancelFn && typeof imageLoadObject.cancelFn !== 'function') {\n throw new Error('putImageLoadObject: imageLoadObject.cancelFn must be a function');\n }\n\n var cachedImage = {\n loaded: false,\n imageId: imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imageLoadObject: imageLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0\n };\n\n imageCacheDict[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n imageLoadObject.promise.then(function (image) {\n if (cachedImages.indexOf(cachedImage) === -1) {\n // If the image has been purged before being loaded, we stop here.\n return;\n }\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n\n if (image.sizeInBytes === undefined) {\n throw new Error('putImageLoadObject: image.sizeInBytes must not be undefined');\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error('putImageLoadObject: image.sizeInBytes is not a number');\n }\n\n cachedImage.sizeInBytes = image.sizeInBytes;\n cacheSizeInBytes += cachedImage.sizeInBytes;\n\n var eventDetails = {\n action: 'addImage',\n image: cachedImage\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachechanged', eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n\n purgeCacheIfNecessary();\n }, function () {\n var cachedImage = imageCacheDict[imageId];\n\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n delete imageCacheDict[imageId];\n });\n}\n\nfunction getImageLoadObject(imageId) {\n if (imageId === undefined) {\n throw new Error('getImageLoadObject: imageId must not be undefined');\n }\n var cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imageLoadObject;\n}\n\nfunction removeImageLoadObject(imageId) {\n if (imageId === undefined) {\n throw new Error('removeImageLoadObject: imageId must not be undefined');\n }\n var cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImageLoadObject: imageId was not present in imageCache');\n }\n\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n\n var eventDetails = {\n action: 'deleteImage',\n image: cachedImage\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachechanged', eventDetails);\n decache(cachedImage.imageLoadObject.promise);\n\n delete imageCacheDict[imageId];\n}\n\nfunction getCacheInfo() {\n return {\n maximumSizeInBytes: maximumSizeInBytes,\n cacheSizeInBytes: cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\n// This method should only be called by `removeImageLoadObject` because it's\n// The one that knows how to deal with shared cache keys and cache size.\nfunction decache(imagePromise) {\n imagePromise.then(function (image) {\n if (image.decache) {\n image.decache();\n }\n });\n}\n\nfunction purgeCache() {\n while (cachedImages.length > 0) {\n var removedCachedImage = cachedImages[0];\n\n removeImageLoadObject(removedCachedImage.imageId);\n }\n}\n\nfunction changeImageIdCacheSize(imageId, newCacheSize) {\n var cacheEntry = imageCacheDict[imageId];\n\n if (cacheEntry) {\n cacheEntry.imageLoadObject.promise.then(function (image) {\n var cacheSizeDifference = newCacheSize - image.sizeInBytes;\n\n image.sizeInBytes = newCacheSize;\n cacheEntry.sizeInBytes = newCacheSize;\n cacheSizeInBytes += cacheSizeDifference;\n\n var eventDetails = {\n action: 'changeImageSize',\n image: image\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimagecachechanged', eventDetails);\n });\n }\n}\n\nexports.default = {\n imageCache: imageCacheDict,\n cachedImages: cachedImages,\n setMaximumSizeBytes: setMaximumSizeBytes,\n putImageLoadObject: putImageLoadObject,\n getImageLoadObject: getImageLoadObject,\n removeImageLoadObject: removeImageLoadObject,\n getCacheInfo: getCacheInfo,\n purgeCache: purgeCache,\n changeImageIdCacheSize: changeImageIdCacheSize\n};\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lookupTable) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var numPixels = image.width * image.height;\n var origPixelData = image.origPixelData || image.getPixelData();\n var storedColorPixelData = new Uint8Array(numPixels * 4);\n var sp = void 0;\n var mapped = void 0;\n\n image.color = true;\n image.falseColor = true;\n image.origPixelData = origPixelData;\n\n if (lookupTable instanceof _index2.default.LookupTable) {\n lookupTable.build();\n\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n mapped = lookupTable.mapValue(sp);\n storedColorPixelData[canvasImageDataIndex++] = mapped[0];\n storedColorPixelData[canvasImageDataIndex++] = mapped[1];\n storedColorPixelData[canvasImageDataIndex++] = mapped[2];\n storedColorPixelData[canvasImageDataIndex++] = mapped[3];\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][3]; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha\n }\n }\n\n image.rgba = true;\n image.cachedLut = undefined;\n image.render = undefined;\n image.slope = 1;\n image.intercept = 0;\n image.minPixelValue = 0;\n image.maxPixelValue = 255;\n image.windowWidth = 255;\n image.windowCenter = 128;\n image.getPixelData = function () {\n return storedColorPixelData;\n };\n};\n\nvar _index = __webpack_require__(7);\n\nvar _index2 = _interopRequireDefault(_index);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _drawImage = __webpack_require__(5);\n\nObject.defineProperty(exports, 'drawImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawImage).default;\n }\n});\n\nvar _generateLut = __webpack_require__(16);\n\nObject.defineProperty(exports, 'generateLut', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_generateLut).default;\n }\n});\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nObject.defineProperty(exports, 'getDefaultViewport', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getDefaultViewport).default;\n }\n});\n\nvar _requestAnimationFrame = __webpack_require__(17);\n\nObject.defineProperty(exports, 'requestAnimationFrame', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_requestAnimationFrame).default;\n }\n});\n\nvar _storedPixelDataToCanvasImageData = __webpack_require__(18);\n\nObject.defineProperty(exports, 'storedPixelDataToCanvasImageData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedPixelDataToCanvasImageData).default;\n }\n});\n\nvar _storedColorPixelDataToCanvasImageData = __webpack_require__(19);\n\nObject.defineProperty(exports, 'storedColorPixelDataToCanvasImageData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedColorPixelDataToCanvasImageData).default;\n }\n});\n\nvar _storedPixelDataToCanvasImageDataColorLUT = __webpack_require__(20);\n\nObject.defineProperty(exports, 'storedPixelDataToCanvasImageDataColorLUT', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedPixelDataToCanvasImageDataColorLUT).default;\n }\n});\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21);\n\nObject.defineProperty(exports, 'storedPixelDataToCanvasImageDataPseudocolorLUT', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT).default;\n }\n});\n\nvar _index = __webpack_require__(42);\n\nObject.defineProperty(exports, 'internal', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index).default;\n }\n});\n\nvar _renderLabelMapImage = __webpack_require__(23);\n\nObject.defineProperty(exports, 'renderLabelMapImage', {\n enumerable: true,\n get: function get() {\n return _renderLabelMapImage.renderLabelMapImage;\n }\n});\n\nvar _renderPseudoColorImage = __webpack_require__(24);\n\nObject.defineProperty(exports, 'renderPseudoColorImage', {\n enumerable: true,\n get: function get() {\n return _renderPseudoColorImage.renderPseudoColorImage;\n }\n});\n\nvar _renderColorImage = __webpack_require__(8);\n\nObject.defineProperty(exports, 'renderColorImage', {\n enumerable: true,\n get: function get() {\n return _renderColorImage.renderColorImage;\n }\n});\n\nvar _renderGrayscaleImage = __webpack_require__(15);\n\nObject.defineProperty(exports, 'renderGrayscaleImage', {\n enumerable: true,\n get: function get() {\n return _renderGrayscaleImage.renderGrayscaleImage;\n }\n});\n\nvar _renderWebImage = __webpack_require__(35);\n\nObject.defineProperty(exports, 'renderWebImage', {\n enumerable: true,\n get: function get() {\n return _renderWebImage.renderWebImage;\n }\n});\n\nvar _canvasToPixel = __webpack_require__(54);\n\nObject.defineProperty(exports, 'canvasToPixel', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_canvasToPixel).default;\n }\n});\n\nvar _disable = __webpack_require__(55);\n\nObject.defineProperty(exports, 'disable', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_disable).default;\n }\n});\n\nvar _displayImage = __webpack_require__(56);\n\nObject.defineProperty(exports, 'displayImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_displayImage).default;\n }\n});\n\nvar _draw = __webpack_require__(58);\n\nObject.defineProperty(exports, 'draw', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_draw).default;\n }\n});\n\nvar _drawInvalidated = __webpack_require__(59);\n\nObject.defineProperty(exports, 'drawInvalidated', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawInvalidated).default;\n }\n});\n\nvar _enable = __webpack_require__(60);\n\nObject.defineProperty(exports, 'enable', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_enable).default;\n }\n});\n\nvar _enabledElementData = __webpack_require__(63);\n\nObject.defineProperty(exports, 'getElementData', {\n enumerable: true,\n get: function get() {\n return _enabledElementData.getElementData;\n }\n});\nObject.defineProperty(exports, 'removeElementData', {\n enumerable: true,\n get: function get() {\n return _enabledElementData.removeElementData;\n }\n});\n\nvar _enabledElements = __webpack_require__(0);\n\nObject.defineProperty(exports, 'getEnabledElement', {\n enumerable: true,\n get: function get() {\n return _enabledElements.getEnabledElement;\n }\n});\nObject.defineProperty(exports, 'addEnabledElement', {\n enumerable: true,\n get: function get() {\n return _enabledElements.addEnabledElement;\n }\n});\nObject.defineProperty(exports, 'getEnabledElementsByImageId', {\n enumerable: true,\n get: function get() {\n return _enabledElements.getEnabledElementsByImageId;\n }\n});\nObject.defineProperty(exports, 'getEnabledElements', {\n enumerable: true,\n get: function get() {\n return _enabledElements.getEnabledElements;\n }\n});\n\nvar _layers = __webpack_require__(25);\n\nObject.defineProperty(exports, 'addLayer', {\n enumerable: true,\n get: function get() {\n return _layers.addLayer;\n }\n});\nObject.defineProperty(exports, 'removeLayer', {\n enumerable: true,\n get: function get() {\n return _layers.removeLayer;\n }\n});\nObject.defineProperty(exports, 'getLayer', {\n enumerable: true,\n get: function get() {\n return _layers.getLayer;\n }\n});\nObject.defineProperty(exports, 'getLayers', {\n enumerable: true,\n get: function get() {\n return _layers.getLayers;\n }\n});\nObject.defineProperty(exports, 'getVisibleLayers', {\n enumerable: true,\n get: function get() {\n return _layers.getVisibleLayers;\n }\n});\nObject.defineProperty(exports, 'setActiveLayer', {\n enumerable: true,\n get: function get() {\n return _layers.setActiveLayer;\n }\n});\nObject.defineProperty(exports, 'getActiveLayer', {\n enumerable: true,\n get: function get() {\n return _layers.getActiveLayer;\n }\n});\nObject.defineProperty(exports, 'setLayerImage', {\n enumerable: true,\n get: function get() {\n return _layers.setLayerImage;\n }\n});\n\nvar _fitToWindow = __webpack_require__(37);\n\nObject.defineProperty(exports, 'fitToWindow', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_fitToWindow).default;\n }\n});\n\nvar _getDefaultViewportForImage = __webpack_require__(64);\n\nObject.defineProperty(exports, 'getDefaultViewportForImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getDefaultViewportForImage).default;\n }\n});\n\nvar _getImage = __webpack_require__(65);\n\nObject.defineProperty(exports, 'getImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getImage).default;\n }\n});\n\nvar _getPixels = __webpack_require__(66);\n\nObject.defineProperty(exports, 'getPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getPixels).default;\n }\n});\n\nvar _getStoredPixels = __webpack_require__(38);\n\nObject.defineProperty(exports, 'getStoredPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getStoredPixels).default;\n }\n});\n\nvar _getViewport = __webpack_require__(67);\n\nObject.defineProperty(exports, 'getViewport', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getViewport).default;\n }\n});\n\nvar _imageLoader = __webpack_require__(68);\n\nObject.defineProperty(exports, 'loadImage', {\n enumerable: true,\n get: function get() {\n return _imageLoader.loadImage;\n }\n});\nObject.defineProperty(exports, 'loadAndCacheImage', {\n enumerable: true,\n get: function get() {\n return _imageLoader.loadAndCacheImage;\n }\n});\nObject.defineProperty(exports, 'registerImageLoader', {\n enumerable: true,\n get: function get() {\n return _imageLoader.registerImageLoader;\n }\n});\nObject.defineProperty(exports, 'registerUnknownImageLoader', {\n enumerable: true,\n get: function get() {\n return _imageLoader.registerUnknownImageLoader;\n }\n});\n\nvar _invalidate = __webpack_require__(69);\n\nObject.defineProperty(exports, 'invalidate', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_invalidate).default;\n }\n});\n\nvar _invalidateImageId = __webpack_require__(70);\n\nObject.defineProperty(exports, 'invalidateImageId', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_invalidateImageId).default;\n }\n});\n\nvar _pageToPixel = __webpack_require__(71);\n\nObject.defineProperty(exports, 'pageToPixel', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pageToPixel).default;\n }\n});\n\nvar _pixelToCanvas = __webpack_require__(72);\n\nObject.defineProperty(exports, 'pixelToCanvas', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pixelToCanvas).default;\n }\n});\n\nvar _reset = __webpack_require__(73);\n\nObject.defineProperty(exports, 'reset', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_reset).default;\n }\n});\n\nvar _resize = __webpack_require__(36);\n\nObject.defineProperty(exports, 'resize', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_resize).default;\n }\n});\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nObject.defineProperty(exports, 'setToPixelCoordinateSystem', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setToPixelCoordinateSystem).default;\n }\n});\n\nvar _setViewport = __webpack_require__(74);\n\nObject.defineProperty(exports, 'setViewport', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setViewport).default;\n }\n});\n\nvar _updateImage = __webpack_require__(4);\n\nObject.defineProperty(exports, 'updateImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_updateImage).default;\n }\n});\n\nvar _pixelDataToFalseColorData = __webpack_require__(40);\n\nObject.defineProperty(exports, 'pixelDataToFalseColorData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pixelDataToFalseColorData).default;\n }\n});\n\nvar _index2 = __webpack_require__(75);\n\nObject.defineProperty(exports, 'rendering', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index2).default;\n }\n});\n\nvar _imageCache = __webpack_require__(39);\n\nObject.defineProperty(exports, 'imageCache', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_imageCache).default;\n }\n});\n\nvar _metaData = __webpack_require__(76);\n\nObject.defineProperty(exports, 'metaData', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_metaData).default;\n }\n});\n\nvar _index3 = __webpack_require__(13);\n\nObject.defineProperty(exports, 'webGL', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index3).default;\n }\n});\n\nvar _index4 = __webpack_require__(7);\n\nObject.defineProperty(exports, 'colors', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index4).default;\n }\n});\n\nvar _falseColorMapping = __webpack_require__(77);\n\nObject.defineProperty(exports, 'convertImageToFalseColorImage', {\n enumerable: true,\n get: function get() {\n return _falseColorMapping.convertImageToFalseColorImage;\n }\n});\nObject.defineProperty(exports, 'convertToFalseColorImage', {\n enumerable: true,\n get: function get() {\n return _falseColorMapping.convertToFalseColorImage;\n }\n});\nObject.defineProperty(exports, 'restoreImage', {\n enumerable: true,\n get: function get() {\n return _falseColorMapping.restoreImage;\n }\n});\n\nvar _events = __webpack_require__(14);\n\nObject.defineProperty(exports, 'events', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_events).default;\n }\n});\n\nvar _triggerEvent = __webpack_require__(2);\n\nObject.defineProperty(exports, 'triggerEvent', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_triggerEvent).default;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nvar _generateLut = __webpack_require__(16);\n\nvar _generateLut2 = _interopRequireDefault(_generateLut);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _requestAnimationFrame = __webpack_require__(17);\n\nvar _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);\n\nvar _storedPixelDataToCanvasImageData = __webpack_require__(18);\n\nvar _storedPixelDataToCanvasImageData2 = _interopRequireDefault(_storedPixelDataToCanvasImageData);\n\nvar _storedPixelDataToCanvasImageDataRGBA = __webpack_require__(30);\n\nvar _storedPixelDataToCanvasImageDataRGBA2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataRGBA);\n\nvar _storedColorPixelDataToCanvasImageData = __webpack_require__(19);\n\nvar _storedColorPixelDataToCanvasImageData2 = _interopRequireDefault(_storedColorPixelDataToCanvasImageData);\n\nvar _storedPixelDataToCanvasImageDataColorLUT = __webpack_require__(20);\n\nvar _storedPixelDataToCanvasImageDataColorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataColorLUT);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT = __webpack_require__(21);\n\nvar _storedPixelDataToCanvasImageDataPseudocolorLUT2 = _interopRequireDefault(_storedPixelDataToCanvasImageDataPseudocolorLUT);\n\nvar _getTransform = __webpack_require__(9);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nvar _calculateTransform = __webpack_require__(22);\n\nvar _calculateTransform2 = _interopRequireDefault(_calculateTransform);\n\nvar _transform = __webpack_require__(31);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n drawImage: _drawImage2.default,\n generateLut: _generateLut2.default,\n getDefaultViewport: _getDefaultViewport2.default,\n requestAnimationFrame: _requestAnimationFrame2.default,\n storedPixelDataToCanvasImageData: _storedPixelDataToCanvasImageData2.default,\n storedPixelDataToCanvasImageDataRGBA: _storedPixelDataToCanvasImageDataRGBA2.default,\n storedPixelDataToCanvasImageDataColorLUT: _storedPixelDataToCanvasImageDataColorLUT2.default,\n storedPixelDataToCanvasImageDataPseudocolorLUT: _storedPixelDataToCanvasImageDataPseudocolorLUT2.default,\n storedColorPixelDataToCanvasImageData: _storedColorPixelDataToCanvasImageData2.default,\n getTransform: _getTransform2.default,\n calculateTransform: _calculateTransform2.default,\n Transform: _transform.Transform\n};\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (a, b) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return a.id === b.id;\n};\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, windowWidth, windowCenter, invert, voiLUT) {\n var maxPixelValue = image.maxPixelValue;\n var minPixelValue = image.minPixelValue;\n var offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n var length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n var lut = image.cachedLut.lutArray;\n var vlutfn = (0, _getVOILut2.default)(windowWidth, windowCenter, voiLUT);\n\n if (invert === true) {\n for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + -offset] = 255 - vlutfn(storedValue);\n }\n } else {\n for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {\n lut[_storedValue + -offset] = vlutfn(_storedValue);\n }\n }\n\n return lut;\n};\n\nvar _getVOILut = __webpack_require__(27);\n\nvar _getVOILut2 = _interopRequireDefault(_getVOILut);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, lut, canvasImageDataData) {\n\n var start = (0, _now2.default)();\n var pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = (0, _now2.default)() - start;\n\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n var numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = (0, _now2.default)();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = (0, _now2.default)() - start;\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isWebGLInitialized = undefined;\nexports.getRenderCanvas = getRenderCanvas;\nexports.initRenderer = initRenderer;\nexports.render = render;\nexports.isWebGLAvailable = isWebGLAvailable;\n\nvar _index = __webpack_require__(47);\n\nvar _vertexShader = __webpack_require__(53);\n\nvar _textureCache = __webpack_require__(33);\n\nvar _textureCache2 = _interopRequireDefault(_textureCache);\n\nvar _createProgramFromString = __webpack_require__(34);\n\nvar _createProgramFromString2 = _interopRequireDefault(_createProgramFromString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-bitwise: 0 */\n\nvar renderCanvas = document.createElement('canvas');\nvar gl = void 0;\nvar texCoordBuffer = void 0;\nvar positionBuffer = void 0;\nvar isWebGLInitialized = false;\n\nexports.isWebGLInitialized = isWebGLInitialized;\nfunction getRenderCanvas() {\n return renderCanvas;\n}\n\nfunction initShaders() {\n for (var id in _index.shaders) {\n // Console.log(\"WEBGL: Loading shader\", id);\n var shader = _index.shaders[id];\n\n shader.attributes = {};\n shader.uniforms = {};\n shader.vert = _vertexShader.vertexShader;\n\n shader.program = (0, _createProgramFromString2.default)(gl, shader.vert, shader.frag);\n\n shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');\n gl.enableVertexAttribArray(shader.attributes.texCoordLocation);\n\n shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');\n gl.enableVertexAttribArray(shader.attributes.positionLocation);\n\n shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');\n }\n}\n\nfunction initRenderer() {\n if (isWebGLInitialized === true) {\n // Console.log(\"WEBGL Renderer already initialized\");\n return;\n }\n\n if (initWebGL(renderCanvas)) {\n initBuffers();\n initShaders();\n // Console.log(\"WEBGL Renderer initialized!\");\n exports.isWebGLInitialized = isWebGLInitialized = true;\n }\n}\n\nfunction updateRectangle(gl, width, height) {\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([width, height, 0, height, width, 0, 0, 0]), gl.STATIC_DRAW);\n}\n\nfunction handleLostContext(event) {\n event.preventDefault();\n console.warn('WebGL Context Lost!');\n}\n\nfunction handleRestoredContext(event) {\n event.preventDefault();\n exports.isWebGLInitialized = isWebGLInitialized = false;\n _textureCache2.default.purgeCache();\n initRenderer();\n // Console.log('WebGL Context Restored.');\n}\n\nfunction initWebGL(canvas) {\n\n gl = null;\n try {\n // Try to grab the standard context. If it fails, fallback to experimental.\n var options = {\n preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element\n };\n\n // ---------------- Testing purposes -------------\n // If (debug === true && WebGLDebugUtils) {\n // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);\n // }\n // ---------------- Testing purposes -------------\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n // Set up event listeners for context lost / context restored\n canvas.removeEventListener('webglcontextlost', handleLostContext, false);\n canvas.addEventListener('webglcontextlost', handleLostContext, false);\n\n canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);\n canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);\n } catch (error) {\n throw new Error('Error creating WebGL context');\n }\n\n // If we don't have a GL context, give up now\n if (!gl) {\n console.error('Unable to initialize WebGL. Your browser may not support it.');\n gl = null;\n }\n\n return gl;\n}\n\nfunction getImageDataType(image) {\n if (image.color) {\n return 'rgb';\n }\n\n var datatype = 'int';\n\n if (image.minPixelValue >= 0) {\n datatype = 'u' + datatype;\n }\n\n if (image.maxPixelValue > 255) {\n datatype += '16';\n } else {\n datatype += '8';\n }\n\n return datatype;\n}\n\nfunction getShaderProgram(image) {\n\n var datatype = getImageDataType(image);\n // We need a mechanism for\n // Choosing the shader based on the image datatype\n // Console.log(\"Datatype: \" + datatype);\n\n if (_index.shaders.hasOwnProperty(datatype)) {\n return _index.shaders[datatype];\n }\n\n return _index.shaders.rgb;\n}\n\nfunction generateTexture(image) {\n var TEXTURE_FORMAT = {\n uint8: gl.LUMINANCE,\n int8: gl.LUMINANCE_ALPHA,\n uint16: gl.LUMINANCE_ALPHA,\n int16: gl.RGB,\n rgb: gl.RGB\n };\n\n var TEXTURE_BYTES = {\n int8: 1, // Luminance\n uint16: 2, // Luminance + Alpha\n int16: 3, // RGB\n rgb: 3 // RGB\n };\n\n var imageDataType = getImageDataType(image);\n var format = TEXTURE_FORMAT[imageDataType];\n\n // GL texture configuration\n var texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n var imageData = _index.dataUtilities[imageDataType].storedPixelDataToImageData(image, image.width, image.height);\n\n gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData);\n\n // Calculate the size in bytes of this image in memory\n var sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];\n\n return {\n texture: texture,\n sizeInBytes: sizeInBytes\n };\n}\n\nfunction getImageTexture(image) {\n var imageTexture = _textureCache2.default.getImageTexture(image.imageId);\n\n if (!imageTexture) {\n // Console.log(\"Generating texture for imageid: \", image.imageId);\n imageTexture = generateTexture(image);\n _textureCache2.default.putImageTexture(image, imageTexture);\n }\n\n return imageTexture.texture;\n}\n\nfunction initBuffers() {\n positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW);\n\n texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0]), gl.STATIC_DRAW);\n}\n\nfunction renderQuad(shader, parameters, texture, width, height) {\n gl.clearColor(1.0, 0.0, 0.0, 1.0);\n gl.viewport(0, 0, width, height);\n\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(shader.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n for (var key in parameters) {\n var uniformLocation = gl.getUniformLocation(shader.program, key);\n\n if (!uniformLocation) {\n continue;\n\n // Disabling this error for now since RGB requires minPixelValue\n // but the other shaders do not.\n // throw `Could not access location for uniform: ${key}`;\n }\n\n var uniform = parameters[key];\n\n var type = uniform.type;\n var value = uniform.value;\n\n if (type === 'i') {\n gl.uniform1i(uniformLocation, value);\n } else if (type === 'f') {\n gl.uniform1f(uniformLocation, value);\n } else if (type === '2f') {\n gl.uniform2f(uniformLocation, value[0], value[1]);\n }\n }\n\n updateRectangle(gl, width, height);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n}\n\nfunction render(enabledElement) {\n // Resize the canvas\n var image = enabledElement.image;\n\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n var viewport = enabledElement.viewport;\n\n // Render the current image\n var shader = getShaderProgram(image);\n var texture = getImageTexture(image);\n var parameters = {\n u_resolution: { type: '2f',\n value: [image.width, image.height] },\n wc: { type: 'f',\n value: viewport.voi.windowCenter },\n ww: { type: 'f',\n value: viewport.voi.windowWidth },\n slope: { type: 'f',\n value: image.slope },\n intercept: { type: 'f',\n value: image.intercept },\n minPixelValue: { type: 'f',\n value: image.minPixelValue },\n invert: { type: 'i',\n value: viewport.invert ? 1 : 0 }\n };\n\n renderQuad(shader, parameters, texture, image.width, image.height);\n\n return renderCanvas;\n}\n\nfunction isWebGLAvailable() {\n // Adapted from\n // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas\n\n var options = {\n failIfMajorPerformanceCaveat: true\n };\n\n try {\n var canvas = document.createElement('canvas');\n\n return Boolean(window.WebGLRenderingContext) && (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));\n } catch (e) {\n return false;\n }\n}\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.dataUtilities = exports.shaders = undefined;\n\nvar _int = __webpack_require__(48);\n\nvar _int2 = __webpack_require__(49);\n\nvar _rgb = __webpack_require__(50);\n\nvar _uint = __webpack_require__(51);\n\nvar _uint2 = __webpack_require__(52);\n\nvar shaders = {\n int16: _int.int16Shader,\n int8: _int2.int8Shader,\n rgb: _rgb.rgbShader,\n uint16: _uint.uint16Shader,\n uint8: _uint2.uint8Shader\n};\n\nvar dataUtilities = {\n int16: _int.int16DataUtilities,\n int8: _int2.int8DataUtilities,\n rgb: _rgb.rgbDataUtilities,\n uint16: _uint.uint16DataUtilities,\n uint8: _uint2.uint8DataUtilities\n};\n\nexports.shaders = shaders;\nexports.dataUtilities = dataUtilities;\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* eslint no-bitwise: 0 */\n\nvar int16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack int16 into three uint8 channels (r, g, b)\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack int16 into three uint8 channels (r, g, b)\n var pixelData = image.getPixelData();\n var numberOfChannels = 3;\n var data = new Uint8Array(image.width * image.height * numberOfChannels);\n var offset = 0;\n\n for (var i = 0; i < pixelData.length; i++) {\n var val = Math.abs(pixelData[i]);\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nvar int16DataUtilities = exports.int16DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nint16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.0 + color.g*65536.0;' + 'if (color.b == 0.0)' + 'intensity = -intensity;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.int16Shader = int16Shader;\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar int8Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Store data in Uint8Array\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n // Transfer image data to alpha channel of WebGL texture\n // Store data in Uint8Array\n var pixelData = image.getPixelData();\n var numberOfChannels = 2;\n var data = new Uint8Array(image.width * image.height * numberOfChannels);\n var offset = 0;\n\n for (var i = 0; i < pixelData.length; i++) {\n data[offset++] = pixelData[i];\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nvar int8DataUtilities = exports.int8DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nint8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.;' + 'if (color.a == 0.0)' + 'intensity = -intensity;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.int8Shader = int8Shader;\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar rgbShader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack RGB images into a 3-channel RGB texture\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n var minPixelValue = image.minPixelValue;\n var canvasImageDataIndex = 0;\n var storedPixelDataIndex = 0;\n // Only 3 channels, since we use WebGL's RGB texture format\n var numStoredPixels = image.width * image.height * 4;\n var numOutputPixels = image.width * image.height * 3;\n var storedPixelData = image.getPixelData();\n var data = new Uint8Array(numOutputPixels);\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n } else {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n }\n\n return data;\n}\n\nvar rgbDataUtilities = exports.rgbDataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nrgbShader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform float minPixelValue;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n\n// Get texture\n'vec3 color = texture2D(u_image, v_texCoord).xyz;' +\n\n// Rescale based on slope and intercept\n'color = color * 256.0 * slope + intercept;' +\n\n// Apply window settings\n'float center0 = wc - 0.5 - minPixelValue;' + 'float width0 = max(ww, 1.0);' + 'color = (color - center0) / width0 + 0.5;' +\n\n// RGBA output\n'gl_FragColor = vec4(color, 1);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' + '}';\n\nexports.rgbShader = rgbShader;\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* eslint no-bitwise: 0 */\n\nvar uint16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * For uint16 pack uint16 into two uint8 channels (r and a).\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack uint16 into two uint8 channels (r and a)\n var pixelData = image.getPixelData();\n var numberOfChannels = 2;\n var data = new Uint8Array(image.width * image.height * numberOfChannels);\n var offset = 0;\n\n for (var i = 0; i < pixelData.length; i++) {\n var val = pixelData[i];\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n }\n\n return data;\n}\n\nvar uint16DataUtilities = exports.uint16DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nuint16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.0 + color.a*65536.0;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.uint16Shader = uint16Shader;\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar uint8Shader = {};\n\n/**\n * Convert stored pixel data to image data. Here we will store\n * all data in the alpha channel.\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData(image) {\n // Transfer image data to alpha channel of WebGL texture\n return image.getPixelData();\n}\n\nvar uint8DataUtilities = exports.uint8DataUtilities = {\n storedPixelDataToImageData: storedPixelDataToImageData\n};\n\nuint8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' +\n// Get texture\n'vec4 color = texture2D(u_image, v_texCoord);' +\n\n// Calculate luminance from packed texture\n'float intensity = color.r*256.0;' +\n\n// Rescale based on slope and window settings\n'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n// Clamp intensity\n'intensity = clamp(intensity, 0.0, 1.0);' +\n\n// RGBA output\n'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n// Apply any inversion necessary\n'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';\n\nexports.uint8Shader = uint8Shader;\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar vertexShader = exports.vertexShader = 'attribute vec2 a_position;' + 'attribute vec2 a_texCoord;' + 'uniform vec2 u_resolution;' + 'varying vec2 v_texCoord;' + 'void main() {' + 'vec2 zeroToOne = a_position / u_resolution;' + 'vec2 zeroToTwo = zeroToOne * 2.0;' + 'vec2 clipSpace = zeroToTwo - 1.0;' + 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' + 'v_texCoord = a_texCoord;' + '}';\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, pt) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var transform = (0, _getTransform2.default)(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getTransform = __webpack_require__(9);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n if (element === undefined) {\n throw new Error('disable: element must not be undefined');\n }\n\n // Search for this element in this list of enabled elements\n var enabledElements = (0, _enabledElements.getEnabledElements)();\n\n for (var i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n // We found it!\n\n // Fire an event so dependencies can cleanup\n var eventData = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'cornerstoneelementdisabled', eventData);\n\n // Remove the child DOM elements that we created (e.g.canvas)\n enabledElements[i].element.removeChild(enabledElements[i].canvas);\n enabledElements[i].canvas = undefined;\n\n // Remove this element from the list of enabled elements\n enabledElements.splice(i, 1);\n\n break;\n }\n }\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, image, viewport) {\n if (element === undefined) {\n throw new Error('displayImage: parameter element must not be undefined');\n }\n if (image === undefined) {\n throw new Error('displayImage: parameter image must not be undefined');\n }\n\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var oldImage = enabledElement.image;\n\n enabledElement.image = image;\n\n if (enabledElement.layers && enabledElement.layers.length) {\n (0, _layers.setLayerImage)(element, image);\n }\n\n if (enabledElement.viewport === undefined) {\n enabledElement.viewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n }\n\n // Merge viewport\n if (viewport) {\n for (var attrname in viewport) {\n if (viewport[attrname] !== null) {\n enabledElement.viewport[attrname] = viewport[attrname];\n }\n }\n }\n\n var frameRate = void 0;\n\n if (enabledElement.lastImageTimeStamp !== undefined) {\n var timeSinceLastImage = (0, _now2.default)() - enabledElement.lastImageTimeStamp;\n\n frameRate = (1000 / timeSinceLastImage).toFixed();\n }\n\n enabledElement.lastImageTimeStamp = (0, _now2.default)();\n\n var newImageEventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n oldImage: oldImage,\n enabledElement: enabledElement,\n frameRate: frameRate\n };\n\n (0, _triggerEvent2.default)(enabledElement.element, 'cornerstonenewimage', newImageEventData);\n\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _layers = __webpack_require__(25);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n return s4() + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + s4() + s4();\n};\n\nfunction s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n}\n\n/**\n * Generate a unique identifier\n *\n * @return {string} A unique identifier\n */\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('draw: image has not been loaded yet');\n }\n\n (0, _drawImage2.default)(enabledElement);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var enabledElements = (0, _enabledElements.getEnabledElements)();\n\n for (var i = 0; i < enabledElements.length; i++) {\n var ee = enabledElements[i];\n\n if (ee.invalid === true) {\n (0, _drawImage2.default)(ee, true);\n }\n }\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, options) {\n if (element === undefined) {\n throw new Error('enable: parameter element cannot be undefined');\n }\n\n // If this enabled element has the option set for WebGL, we should\n // Check if this device actually supports it\n if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {\n if (_index2.default.renderer.isWebGLAvailable()) {\n // If WebGL is available on the device, initialize the renderer\n // And return the renderCanvas from the WebGL rendering path\n _index2.default.renderer.initRenderer();\n options.renderer = 'webgl';\n } else {\n // If WebGL is not available on this device, we will fall back\n // To using the Canvas renderer\n console.error('WebGL not available, falling back to Canvas renderer');\n delete options.renderer;\n }\n }\n\n var canvas = document.createElement('canvas');\n\n element.appendChild(canvas);\n\n var enabledElement = {\n element: element,\n canvas: canvas,\n image: undefined, // Will be set once image is loaded\n invalid: false, // True if image needs to be drawn, false if not\n needsRedraw: true,\n options: options,\n layers: [],\n data: {},\n renderingTools: {}\n };\n\n (0, _enabledElements.addEnabledElement)(enabledElement);\n\n (0, _resize2.default)(element, true);\n\n /**\r\n * Draw the image immediately\r\n *\r\n * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks\r\n * @returns {void}\r\n */\n function draw(timestamp) {\n if (enabledElement.canvas === undefined) {\n return;\n }\n\n var eventDetails = {\n enabledElement: enabledElement,\n timestamp: timestamp\n };\n\n (0, _triggerEvent2.default)(enabledElement.element, 'cornerstoneprerender', eventDetails);\n\n if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {\n (0, _drawImageSync2.default)(enabledElement, enabledElement.invalid);\n }\n\n (0, _requestAnimationFrame2.default)(draw);\n }\n\n draw();\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _resize = __webpack_require__(36);\n\nvar _resize2 = _interopRequireDefault(_resize);\n\nvar _drawImageSync = __webpack_require__(61);\n\nvar _drawImageSync2 = _interopRequireDefault(_drawImageSync);\n\nvar _requestAnimationFrame = __webpack_require__(17);\n\nvar _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);\n\nvar _index = __webpack_require__(13);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n */\n\nfunction hasImageOrLayers(enabledElement) {\n return enabledElement.image !== undefined || enabledElement.layers.length;\n}\n\n/**\r\n * Enable an HTML Element for use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @param {Object} options Options for the enabledElement\r\n *\r\n * @return {void}\r\n */\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, invalidated) {\n var image = enabledElement.image;\n var element = enabledElement.element;\n var layers = enabledElement.layers || [];\n\n // Check if enabledElement can be redrawn\n if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {\n return;\n }\n\n // Start measuring the time needed to draw the image/layers\n var start = (0, _now2.default)();\n\n image.stats = {\n lastGetPixelDataTime: -1.0,\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\n lastPutImageDataTime: -1.0,\n lastRenderTime: -1.0,\n lastLutGenerateTime: -1.0\n };\n\n if (layers && layers.length) {\n (0, _drawCompositeImage2.default)(enabledElement, invalidated);\n } else if (image) {\n var render = image.render;\n\n if (!render) {\n if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '' && enabledElement.image.labelmap === true) {\n render = _renderLabelMapImage.renderLabelMapImage;\n } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {\n render = _renderPseudoColorImage.renderPseudoColorImage;\n } else if (image.color) {\n render = _renderColorImage.renderColorImage;\n } else {\n render = _renderGrayscaleImage.renderGrayscaleImage;\n }\n }\n\n render(enabledElement, invalidated);\n }\n\n // Calculate how long it took to draw the image/layers\n var renderTimeInMs = (0, _now2.default)() - start;\n\n var eventData = {\n viewport: enabledElement.viewport,\n element: element,\n image: image,\n enabledElement: enabledElement,\n canvasContext: enabledElement.canvas.getContext('2d'),\n renderTimeInMs: renderTimeInMs\n };\n\n image.stats.lastRenderTime = renderTimeInMs;\n\n enabledElement.invalid = false;\n enabledElement.needsRedraw = false;\n\n (0, _triggerEvent2.default)(element, 'cornerstoneimagerendered', eventData);\n};\n\nvar _now = __webpack_require__(1);\n\nvar _now2 = _interopRequireDefault(_now);\n\nvar _drawCompositeImage = __webpack_require__(62);\n\nvar _drawCompositeImage2 = _interopRequireDefault(_drawCompositeImage);\n\nvar _renderColorImage = __webpack_require__(8);\n\nvar _renderGrayscaleImage = __webpack_require__(15);\n\nvar _renderPseudoColorImage = __webpack_require__(24);\n\nvar _renderLabelMapImage = __webpack_require__(23);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, invalidated) {\n var element = enabledElement.element;\n var allLayers = (0, _layers.getLayers)(element);\n var activeLayer = (0, _layers.getActiveLayer)(element);\n var visibleLayers = (0, _layers.getVisibleLayers)(element);\n var resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports;\n\n // This state will help us to determine if the user has re-synced the\n // layers allowing us to make a new copy of the viewports\n enabledElement.lastSyncViewportsState = enabledElement.syncViewports;\n\n // Stores a copy of all viewports if the user has just synced them then we can use the\n // copies to calculate anything later (ratio, translation offset, rotation offset, etc)\n if (resynced) {\n allLayers.forEach(function (layer) {\n if (layer.viewport) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n });\n }\n\n // Sync all viewports in case it's activated\n if (enabledElement.syncViewports === true) {\n syncViewports(visibleLayers, activeLayer);\n }\n\n // Get the enabled element's canvas so we can draw to it\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Render all visible layers\n renderLayers(context, visibleLayers, invalidated);\n};\n\nvar _layers = __webpack_require__(25);\n\nvar _renderGrayscaleImage = __webpack_require__(15);\n\nvar _renderColorImage = __webpack_require__(8);\n\nvar _renderPseudoColorImage = __webpack_require__(24);\n\nvar _renderLabelMapImage = __webpack_require__(23);\n\nvar _setToPixelCoordinateSystem = __webpack_require__(3);\n\nvar _setToPixelCoordinateSystem2 = _interopRequireDefault(_setToPixelCoordinateSystem);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This is used to keep each of the layers' viewports in sync with the active layer\nvar originalViewportScale = {};\n\nfunction getViewportRatio(baseLayerId, targetLayerId) {\n return originalViewportScale[targetLayerId] / originalViewportScale[baseLayerId];\n}\n\n// Sync all viewports based on active layer's viewport\nfunction syncViewports(layers, activeLayer) {\n // If we intend to keep the viewport's scale, translation and rotation in sync,\n // loop through the layers\n layers.forEach(function (layer) {\n // Don't do anything to the active layer\n // Don't do anything if this layer has no viewport\n if (layer === activeLayer || !layer.viewport || !activeLayer.viewport) {\n return;\n }\n\n if (!originalViewportScale[layer.layerId]) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n\n var viewportRatio = getViewportRatio(activeLayer.layerId, layer.layerId);\n\n // Update the layer's translation and scale to keep them in sync with the first image\n // based on the ratios between the images\n layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;\n layer.viewport.rotation = activeLayer.viewport.rotation;\n layer.viewport.translation = {\n x: activeLayer.viewport.translation.x / viewportRatio,\n y: activeLayer.viewport.translation.y / viewportRatio\n };\n layer.viewport.hflip = activeLayer.viewport.hflip;\n layer.viewport.vflip = activeLayer.viewport.vflip;\n });\n}\n\n/**\n * Internal function to render all layers for a Cornerstone enabled element\n *\n * @param {CanvasRenderingContext2D} context Canvas context to draw upon\n * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element\n * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn\n * @returns {void}\n */\nfunction renderLayers(context, layers, invalidated) {\n // Loop through each layer and draw it to the canvas\n layers.forEach(function (layer, index) {\n if (!layer.image) {\n return;\n }\n\n context.save();\n\n // Set the layer's canvas to the pixel coordinate system\n layer.canvas = context.canvas;\n (0, _setToPixelCoordinateSystem2.default)(layer, context);\n\n // Render into the layer's canvas\n var colormap = layer.viewport.colormap || layer.options.colormap;\n var labelmap = layer.viewport.labelmap;\n var isInvalid = layer.invalid || invalidated;\n\n if (colormap && colormap !== '' && labelmap === true) {\n (0, _renderLabelMapImage.addLabelMapLayer)(layer, isInvalid);\n } else if (colormap && colormap !== '') {\n (0, _renderPseudoColorImage.addPseudoColorLayer)(layer, isInvalid);\n } else if (layer.image.color === true) {\n (0, _renderColorImage.addColorLayer)(layer, isInvalid);\n } else {\n // If this is the base layer, use the alpha channel for rendering of the grayscale image\n var useAlphaChannel = index === 0;\n\n (0, _renderGrayscaleImage.addGrayscaleLayer)(layer, isInvalid, useAlphaChannel);\n }\n\n // Apply any global opacity settings that have been defined for this layer\n if (layer.options && layer.options.opacity) {\n context.globalAlpha = layer.options.opacity;\n } else {\n context.globalAlpha = 1;\n }\n\n if (layer.options && layer.options.fillStyle) {\n context.fillStyle = layer.options.fillStyle;\n }\n\n // Set the pixelReplication property before drawing from the layer into the\n // composite canvas\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Draw from the current layer's canvas onto the enabled element's canvas\n var _layer$image = layer.image,\n width = _layer$image.width,\n height = _layer$image.height;\n\n\n context.drawImage(layer.canvas, 0, 0, width, height, 0, 0, width, height);\n context.restore();\n\n layer.invalid = false;\n });\n}\n\n/**\n * Internal API function to draw a composite image to a given enabled element\n *\n * @param {EnabledElement} enabledElement An enabled element to draw into\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getElementData = getElementData;\nexports.removeElementData = removeElementData;\n\nvar _enabledElements = __webpack_require__(0);\n\n/**\n * Retrieves any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n * @returns {*} Whatever data is stored for this enabled element\n */\nfunction getElementData(element, dataType) {\n var ee = (0, _enabledElements.getEnabledElement)(element);\n\n if (ee.data.hasOwnProperty(dataType) === false) {\n ee.data[dataType] = {};\n }\n\n return ee.data[dataType];\n}\n\n/**\n * Clears any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n *\n * @returns {void}\n */\nfunction removeElementData(element, dataType) {\n var ee = (0, _enabledElements.getEnabledElement)(element);\n\n delete ee.data[dataType];\n}\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, image) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return (0, _getDefaultViewport2.default)(enabledElement.canvas, image);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return enabledElement.image;\n};\n\nvar _enabledElements = __webpack_require__(0);\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n var storedPixels = (0, _getStoredPixels2.default)(element, x, y, width, height);\n var ee = (0, _enabledElements.getEnabledElement)(element);\n var mlutfn = (0, _getModalityLUT2.default)(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);\n\n return storedPixels.map(mlutfn);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getStoredPixels = __webpack_require__(38);\n\nvar _getStoredPixels2 = _interopRequireDefault(_getStoredPixels);\n\nvar _getModalityLUT = __webpack_require__(26);\n\nvar _getModalityLUT2 = _interopRequireDefault(_getModalityLUT);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var viewport = enabledElement.viewport;\n\n if (viewport === undefined) {\n return;\n }\n\n // Return a copy of the viewport\n return Object.assign({}, viewport);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.loadImage = loadImage;\nexports.loadAndCacheImage = loadAndCacheImage;\nexports.registerImageLoader = registerImageLoader;\nexports.registerUnknownImageLoader = registerUnknownImageLoader;\n\nvar _imageCache = __webpack_require__(39);\n\nvar _events = __webpack_require__(14);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * This module deals with ImageLoaders, loading images and caching images\r\n */\n\nvar imageLoaders = {};\n\nvar unknownImageLoader = void 0;\n\n/**\r\n * Load an image using a registered Cornerstone Image Loader.\r\n *\r\n * The image loader that is used will be\r\n * determined by the image loader scheme matching against the imageId.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails\r\n */\nfunction loadImageFromImageLoader(imageId, options) {\n var colonIndex = imageId.indexOf(':');\n var scheme = imageId.substring(0, colonIndex);\n var loader = imageLoaders[scheme];\n\n if (loader === undefined || loader === null) {\n if (unknownImageLoader !== undefined) {\n return unknownImageLoader(imageId);\n }\n\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\n }\n\n var imageLoadObject = loader(imageId, options);\n\n // Broadcast an image loaded event once the image is loaded\n imageLoadObject.promise.then(function (image) {\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimageloaded', { image: image });\n }, function (error) {\n var errorObject = {\n imageId: imageId,\n error: error\n };\n\n (0, _triggerEvent2.default)(_events2.default, 'cornerstoneimageloadfailed', errorObject);\n });\n\n return imageLoadObject;\n}\n\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails\r\n */\nfunction loadImage(imageId, options) {\n if (imageId === undefined) {\n throw new Error('loadImage: parameter imageId must not be undefined');\n }\n\n var imageLoadObject = (0, _imageCache.getImageLoadObject)(imageId);\n\n if (imageLoadObject !== undefined) {\n return imageLoadObject.promise;\n }\n\n return loadImageFromImageLoader(imageId, options).promise;\n}\n\n//\n\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Object} Image Loader Object (TODO: define a JSDoc type for this)\r\n */\nfunction loadAndCacheImage(imageId, options) {\n if (imageId === undefined) {\n throw new Error('loadAndCacheImage: parameter imageId must not be undefined');\n }\n\n var imageLoadObject = (0, _imageCache.getImageLoadObject)(imageId);\n\n if (imageLoadObject !== undefined) {\n return imageLoadObject.promise;\n }\n\n imageLoadObject = loadImageFromImageLoader(imageId, options);\n\n (0, _imageCache.putImageLoadObject)(imageId, imageLoadObject);\n\n return imageLoadObject.promise;\n}\n\n/**\r\n * Registers an imageLoader plugin with cornerstone for the specified scheme\r\n *\r\n * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\r\n * @param {Function} imageLoader A Cornerstone Image Loader function\r\n * @returns {void}\r\n */\nfunction registerImageLoader(scheme, imageLoader) {\n imageLoaders[scheme] = imageLoader;\n}\n\n/**\r\n * Registers a new unknownImageLoader and returns the previous one\r\n *\r\n * @param {Function} imageLoader A Cornerstone Image Loader\r\n *\r\n * @returns {Function|Undefined} The previous Unknown Image Loader\r\n */\nfunction registerUnknownImageLoader(imageLoader) {\n var oldImageLoader = unknownImageLoader;\n\n unknownImageLoader = imageLoader;\n\n return oldImageLoader;\n}\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n enabledElement.invalid = true;\n enabledElement.needsRedraw = true;\n var eventData = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, 'cornerstoneinvalidated', eventData);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _triggerEvent = __webpack_require__(2);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (imageId) {\n\n var enabledElements = (0, _enabledElements.getEnabledElementsByImageId)(imageId);\n\n enabledElements.forEach(function (enabledElement) {\n (0, _drawImage2.default)(enabledElement, true);\n });\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _drawImage = __webpack_require__(5);\n\nvar _drawImage2 = _interopRequireDefault(_drawImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, pageX, pageY) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('image has not been loaded yet');\n }\n\n // Convert the pageX and pageY to the canvas client coordinates\n var rect = element.getBoundingClientRect();\n var clientX = pageX - rect.left - window.pageXOffset;\n var clientY = pageY - rect.top - window.pageYOffset;\n\n var pt = { x: clientX,\n y: clientY };\n var transform = (0, _getTransform2.default)(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getTransform = __webpack_require__(9);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, pt) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n var transform = (0, _getTransform2.default)(enabledElement);\n\n return transform.transformPoint(pt.x, pt.y);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getTransform = __webpack_require__(9);\n\nvar _getTransform2 = _interopRequireDefault(_getTransform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n enabledElement.viewport = (0, _getDefaultViewport2.default)(enabledElement.canvas, enabledElement.image);\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _getDefaultViewport = __webpack_require__(6);\n\nvar _getDefaultViewport2 = _interopRequireDefault(_getDefaultViewport);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, viewport) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n enabledElement.viewport.translation.x = viewport.translation.x;\n enabledElement.viewport.translation.y = viewport.translation.y;\n enabledElement.viewport.voi.windowCenter = viewport.voi.windowCenter;\n enabledElement.viewport.invert = viewport.invert;\n enabledElement.viewport.pixelReplication = viewport.pixelReplication;\n enabledElement.viewport.rotation = viewport.rotation;\n enabledElement.viewport.hflip = viewport.hflip;\n enabledElement.viewport.vflip = viewport.vflip;\n enabledElement.viewport.modalityLUT = viewport.modalityLUT;\n enabledElement.viewport.voiLUT = viewport.voiLUT;\n enabledElement.viewport.colormap = viewport.colormap;\n enabledElement.viewport.labelmap = viewport.labelmap;\n\n // Prevent window width from being too small (note that values close to zero are valid and can occur with\n // PET images in particular)\n enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);\n\n // Prevent scale from getting too small\n enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);\n\n // Normalize the rotation value to a positive rotation in degrees\n enabledElement.viewport.rotation %= 360;\n if (enabledElement.viewport.rotation < 0) {\n enabledElement.viewport.rotation += 360;\n }\n\n // Force the image to be updated since the viewport has been modified\n (0, _updateImage2.default)(element);\n};\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _updateImage = __webpack_require__(4);\n\nvar _updateImage2 = _interopRequireDefault(_updateImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MIN_WINDOW_WIDTH = 0.000001;\nvar MIN_VIEWPORT_SCALE = 0.0001;\n\n/**\n * Sets the viewport for an element and corrects invalid values\n *\n * @param {HTMLElement} element - DOM element of the enabled element\n * @param {Viewport} viewport - Object containing the viewport properties\n * @returns {void}\n */\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _renderColorImage = __webpack_require__(8);\n\nvar _renderGrayscaleImage = __webpack_require__(15);\n\nvar _renderWebImage = __webpack_require__(35);\n\nexports.default = {\n colorImage: _renderColorImage.renderColorImage,\n grayscaleImage: _renderGrayscaleImage.renderGrayscaleImage,\n webImage: _renderWebImage.renderWebImage\n};\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addProvider = addProvider;\nexports.removeProvider = removeProvider;\n// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nvar providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param {Function} provider Metadata provider function\n * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @returns {void}\n */\nfunction addProvider(provider) {\n var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var i = void 0;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority: priority,\n provider: provider\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param {Function} provider Metadata provider function\n *\n * @returns {void}\n */\nfunction removeProvider(provider) {\n for (var i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param {String} type The type of metadata requested from the metadata store\n * @param {String} imageId The Cornerstone Image Object's imageId\n *\n * @returns {*} The metadata retrieved from the metadata store\n */\nfunction getMetaData(type, imageId) {\n // Invoke each provider in priority order until one returns something\n for (var i = 0; i < providers.length; i++) {\n var result = providers[i].provider(type, imageId);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexports.default = {\n addProvider: addProvider,\n removeProvider: removeProvider,\n get: getMetaData\n};\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.restoreImage = exports.convertToFalseColorImage = exports.convertImageToFalseColorImage = undefined;\n\nvar _enabledElements = __webpack_require__(0);\n\nvar _pixelDataToFalseColorData = __webpack_require__(40);\n\nvar _pixelDataToFalseColorData2 = _interopRequireDefault(_pixelDataToFalseColorData);\n\nvar _colormap = __webpack_require__(28);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Retrieves the minimum and maximum pixel values from an Array of pixel data\n *\n * @param {Array} pixelData The input pixel data array\n *\n * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array\n */\nfunction getPixelValues(pixelData) {\n var minPixelValue = Number.MAX_VALUE;\n var maxPixelValue = Number.MIN_VALUE;\n var len = pixelData.length;\n var pixel = void 0;\n\n for (var i = 0; i < len; i++) {\n pixel = pixelData[i];\n minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;\n maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;\n }\n\n return {\n minPixelValue: minPixelValue,\n maxPixelValue: maxPixelValue\n };\n}\n\n/**\n * Retrieve a function that will allow an image object to be reset to its original form\n * after a false color mapping transformation\n *\n * @param {Image} image A Cornerstone Image Object\n *\n * @return {Function} A function for resetting an Image Object to its original form\n */\nfunction getRestoreImageMethod(image) {\n if (image.restore) {\n return image.restore;\n }\n\n var color = image.color;\n var rgba = image.rgba;\n var cachedLut = image.cachedLut;\n var slope = image.slope;\n var windowWidth = image.windowWidth;\n var windowCenter = image.windowCenter;\n var minPixelValue = image.minPixelValue;\n var maxPixelValue = image.maxPixelValue;\n\n return function () {\n image.color = color;\n image.rgba = rgba;\n image.cachedLut = cachedLut;\n image.slope = slope;\n image.windowWidth = windowWidth;\n image.windowCenter = windowCenter;\n image.minPixelValue = minPixelValue;\n image.maxPixelValue = maxPixelValue;\n\n if (image.origPixelData) {\n var pixelData = image.origPixelData;\n\n image.getPixelData = function () {\n return pixelData;\n };\n }\n\n // Remove some attributes added by false color mapping\n image.origPixelData = undefined;\n image.colormapId = undefined;\n image.falseColor = undefined;\n };\n}\n\n//\n// Then we need to make sure it will be converted into a colormap object if it's as string.\n\n/**\n * User can pass a colormap or its id as string to some of these public functions.\n * Then we need to make sure it will be converted into a colormap object if it's a string.\n *\n * @param {*} colormap A colormap ID or Object\n * @return {*} The colormap\n */\nfunction ensuresColormap(colormap) {\n if (colormap && typeof colormap === 'string') {\n colormap = (0, _colormap.getColormap)(colormap);\n }\n\n return colormap;\n}\n\n/**\n * Restores a false color image to its original version\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.\n */\nfunction restoreImage(image) {\n if (image.restore && typeof image.restore === 'function') {\n image.restore();\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Convert an image to a false color image\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {Boolean} - Whether or not the image has been converted to a false color image\n */\nfunction convertImageToFalseColorImage(image, colormap) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n // User can pass a colormap id or a colormap object\n colormap = ensuresColormap(colormap);\n\n var colormapId = colormap.getId();\n\n // Doesn't do anything if colormapId hasn't changed\n if (image.colormapId === colormapId) {\n // It has already being converted into a false color image\n // Using the colormapId passed as parameter\n return false;\n }\n\n // Restore the image attributes updated when converting to a false color image\n restoreImage(image);\n\n // Convert the image to a false color image\n if (colormapId) {\n var minPixelValue = image.minPixelValue || 0;\n var maxPixelValue = image.maxPixelValue || 255;\n\n image.restore = getRestoreImageMethod(image);\n\n var lookupTable = colormap.createLookupTable();\n\n lookupTable.setTableRange(minPixelValue, maxPixelValue);\n\n // Update the pixel data and render the new image\n (0, _pixelDataToFalseColorData2.default)(image, lookupTable);\n\n // Update min and max pixel values\n var pixelValues = getPixelValues(image.getPixelData());\n\n image.minPixelValue = pixelValues.minPixelValue;\n image.maxPixelValue = pixelValues.maxPixelValue;\n\n image.windowWidth = 255;\n image.windowCenter = 128;\n\n // Cache the last colormapId used for performance\n // Then it doesn't need to be re-rendered on next\n // Time if the user hasn't updated it\n image.colormapId = colormapId;\n }\n\n // Return `true` to tell the caller that the image has got updated\n return true;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {HTMLElement} element The Cornerstone element\n * @param {*} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {void}\n */\nfunction convertToFalseColorImage(element, colormap) {\n var enabledElement = (0, _enabledElements.getEnabledElement)(element);\n\n return convertImageToFalseColorImage(enabledElement.image, colormap);\n}\n\nexports.convertImageToFalseColorImage = convertImageToFalseColorImage;\nexports.convertToFalseColorImage = convertToFalseColorImage;\nexports.restoreImage = restoreImage;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// cornerstone.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 41);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6df70bee89025a942e6c","const enabledElements = [];\n\n/**\n * A two-dimensional vector\n *\n * @typedef {Object} vec2\n * @param {Number} x - The x distance\n * @param {Number} y - The y distance\n */\n\n/**\n * VOI\n *\n * @typedef {Object} VOI\n * @param {Number} windowWidth - Window Width for display\n * @param {Number} windowCenter - Window Center for display\n */\n\n/**\n * Lookup Table Array\n *\n * @typedef {Object} LUT\n * @property {Number} firstValueMapped\n * @property {Number} numBitsPerEntry\n * @property {Array} lut\n */\n\n/**\n * Image Statistics Object\n *\n * @typedef {Object} ImageStats\n *\n * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image\n * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array\n * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context\n * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run\n * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image\n */\n\n/**\n * An Image Object in Cornerstone\n *\n * @typedef {Object} Image\n *\n * @property {string} imageId - The imageId associated with this image object\n * @property {Number} minPixelValue - the minimum stored pixel value in the image\n * @property {Number} maxPixelValue - the maximum stored pixel value in the image\n * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified\n * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified\n * @property {Number} windowCenter - the default windowCenter to apply to the image\n * @property {Number} windowWidth - the default windowWidth to apply to the image\n * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color\n * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images\n * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.\n * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats\n * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience\n * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience\n * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience\n * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience\n * @property {Boolean} color - true if pixel data is RGB, false if grayscale\n * @property {Object} lut - The Lookup Table\n * @property {Boolean} rgba - Is the color pixel data stored in RGBA?\n * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known\n * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or heigh of each pixel) in mm or undefined if not known\n * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1\n * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.\n * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping\n * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping\n * @property {ImageStats} [stats] - Statistics for the last redraw of the image\n * @property {Object} cachedLut - Cached Lookup Table for this image.\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * A Viewport Settings Object Cornerstone\n *\n * @typedef {Object} Viewport\n *\n * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x\n * @param {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.\n * @param {VOI} [voi] - an object with properties windowWidth and windowCenter.\n * @property {boolean} [invert=false] - Whether or not the image is inverted.\n * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.\n * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false\n * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false\n * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0\n * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none\n * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none\n * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor\n * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)\n */\n\n/**\n * An Enabled Element in Cornerstone\n *\n * @typedef {Object} EnabledElement\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement\n * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters\n * for each of the enabled element's layers\n * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean\n */\n\n/**\n * An Enabled Element Layer in Cornerstone\n *\n * @typedef {Object} EnabledElementLayer\n *\n * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone\n * @property {Image} [image] - The image currently displayed in the enabledElement\n * @property {Viewport} [viewport] - The current viewport settings of the enabledElement\n * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement\n * @property {Object} [options] - Layer drawing options\n * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw\n * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid\n */\n\n/**\n * An Image Load Object\n *\n * @typedef {Object} ImageLoadObject\n *\n * @property {Promise} promise - The Promise tracking the loading of this image\n * @property {Function|undefined} cancelFn - A function to cancel the image load request\n */\n\n/**\n * Retrieves a Cornerstone Enabled Element object\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n *\n * @returns {EnabledElement} A Cornerstone Enabled Element\n */\nexport function getEnabledElement (element) {\n if (element === undefined) {\n throw new Error('getEnabledElement: parameter element must not be undefined');\n }\n for (let i = 0; i < enabledElements.length; i++) {\n if (enabledElements[i].element === element) {\n return enabledElements[i];\n }\n }\n\n throw new Error('element not enabled');\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object\n * @returns {void}\n */\nexport function addEnabledElement (enabledElement) {\n if (enabledElement === undefined) {\n throw new Error('getEnabledElement: enabledElement element must not be undefined');\n }\n\n enabledElements.push(enabledElement);\n}\n\n/**\n * Adds a Cornerstone Enabled Element object to the central store of enabledElements\n *\n * @param {string} imageId A Cornerstone Image ID\n * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElementsByImageId (imageId) {\n const ees = [];\n\n enabledElements.forEach(function (enabledElement) {\n if (enabledElement.image && enabledElement.image.imageId === imageId) {\n ees.push(enabledElement);\n }\n });\n\n return ees;\n}\n\n/**\n * Retrieve all of the currently enabled Cornerstone elements\n *\n * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects\n */\nexport function getEnabledElements () {\n return enabledElements;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElements.js","/**\n * Use the performance.now() method if possible, and if not, use Date.now()\n *\n * @return {number} Time elapsed since the time origin\n */\nexport default function () {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/now.js","/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./triggerEvent.js","/**\n * This module contains a function that will set the canvas context to the pixel coordinates system\n * making it easy to draw geometry on the image\n */\n\nimport calculateTransform from './internal/calculateTransform.js';\n\n/**\n * Sets the canvas context transformation matrix to the pixel coordinate system. This allows\n * geometry to be driven using the canvas context using coordinates in the pixel coordinate system\n * @param {EnabledElement} enabledElement The\n * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas\n * @param {Number} [scale] Optional scale to apply\n * @returns {void}\n */\nexport default function (enabledElement, context, scale) {\n if (enabledElement === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');\n }\n if (context === undefined) {\n throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');\n }\n\n const transform = calculateTransform(enabledElement, scale);\n\n context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setToPixelCoordinateSystem.js","import { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the specified enabled element\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Boolean} [invalidated=false] Whether or not the image pixel data has been changed, necessitating a redraw\n *\n * @returns {void}\n */\nexport default function (element, invalidated = false) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined && !enabledElement.layers.length) {\n throw new Error('updateImage: image has not been loaded yet');\n }\n\n drawImage(enabledElement, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./updateImage.js","/**\n * Internal API function to draw an image to a given enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} [invalidated] - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated = false) {\n enabledElement.needsRedraw = true;\n if (invalidated) {\n enabledElement.invalid = true;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImage.js","/**\n * Creates a new viewport object containing default values for the image and canvas\n *\n * @param {HTMLElement} canvas A Canvas DOM element\n * @param {Image} image A Cornerstone Image Object\n * @returns {Viewport} viewport object\n */\nexport default function (canvas, image) {\n if (canvas === undefined) {\n throw new Error('getDefaultViewport: parameter canvas must not be undefined');\n }\n\n if (image === undefined) {\n return {\n scale: 1,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false\n };\n }\n\n // Fit image to window\n const verticalScale = canvas.height / image.rows;\n const horizontalScale = canvas.width / image.columns;\n const scale = Math.min(horizontalScale, verticalScale);\n\n return {\n scale,\n translation: {\n x: 0,\n y: 0\n },\n voi: {\n windowWidth: image.windowWidth,\n windowCenter: image.windowCenter\n },\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n voiLUT: image.voiLUT,\n colormap: image.colormap,\n labelmap: Boolean(image.labelmap)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getDefaultViewport.js","import { getColormap, getColormapsList } from './colormap.js';\nimport LookupTable from './lookupTable.js';\n\nexport default {\n getColormap,\n getColormapsList,\n LookupTable\n};\n\n\n\n// WEBPACK FOOTER //\n// ./colors/index.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport now from '../internal/now.js';\nimport generateColorLut from '../internal/generateColorLut.js';\nimport storedColorPixelDataToCanvasImageData from '../internal/storedColorPixelDataToCanvasImageData.js';\nimport storedRGBAPixelDataToCanvasImageData from '../internal/storedRGBAPixelDataToCanvasImageData.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport webGL from '../webgl/index.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getLut (image, viewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n image.cachedLut.invert === viewport.invert) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateColorLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n}\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing\n if (enabledElement.viewport.voi.windowWidth === 255 &&\n enabledElement.viewport.voi.windowCenter === 128 &&\n enabledElement.viewport.invert === false &&\n image.getCanvas &&\n image.getCanvas()\n ) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const colorLut = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n storedRGBAPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n } else {\n storedColorPixelDataToCanvasImageData(image, colorLut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderColorImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderColorImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\nexport function addColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addColorLayer: image must be loaded before it can be drawn');\n }\n\n // All multi-layer images should include the alpha value\n image.rgba = true;\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderColorImage.js","import calculateTransform from './calculateTransform.js';\n\nexport default function (enabledElement) {\n // For now we will calculate it every time it is requested.\n // In the future, we may want to cache it in the enabled element to speed things up.\n return calculateTransform(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getTransform.js","export default function (enabledElement, image) {\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n const renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/initializeRenderCanvas.js","export default function (enabledElement) {\n const imageId = enabledElement.image.imageId;\n const viewport = enabledElement.viewport;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap\n };\n\n return enabledElement.renderingTools;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/saveLastRendered.js","export default function (enabledElement, image) {\n const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n const lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;\n\n return (\n image.imageId !== lastRenderedImageId ||\n !lastRenderedViewport ||\n lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter ||\n lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth ||\n lastRenderedViewport.invert !== enabledElement.viewport.invert ||\n lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||\n lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||\n lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||\n lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||\n lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||\n lastRenderedViewport.colormap !== enabledElement.viewport.colormap\n );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/doesImageNeedToBeRendered.js","import { render, initRenderer, getRenderCanvas, isWebGLAvailable, isWebGLInitialized } from './renderer.js';\nimport createProgramFromString from './createProgramFromString.js';\nimport textureCache from './textureCache.js';\n\nconst mod = {\n createProgramFromString,\n renderer: {\n render,\n initRenderer,\n getRenderCanvas,\n isWebGLAvailable\n },\n textureCache\n};\n\nObject.defineProperty(mod, 'isWebGLInitialized', {\n enumerable: true,\n configurable: false,\n get: () => isWebGLInitialized\n});\n\nexport default mod;\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/index.js","class EventTarget {\n constructor () {\n this.listeners = {};\n }\n\n addEventListener (type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n\n removeEventListener (type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n const stack = this.listeners[type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n\n dispatchEvent (event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n\n const stack = this.listeners[event.type];\n\n for (let i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n}\n\n\nconst events = new EventTarget();\n\nexport default events;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import storedPixelDataToCanvasImageData from '../internal/storedPixelDataToCanvasImageData.js';\nimport storedPixelDataToCanvasImageDataRGBA from '../internal/storedPixelDataToCanvasImageDataRGBA.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport webGL from '../webgl/index.js';\nimport getLut from './getLut.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated, useAlphaChannel = true) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // Gray scale image - apply the lut and put the resulting image onto the render canvas\n if (useAlphaChannel) {\n storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);\n } else {\n storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderGrayscaleImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n let renderCanvas;\n\n if (enabledElement.options && enabledElement.options.renderer &&\n enabledElement.options.renderer.toLowerCase() === 'webgl') {\n // If this enabled element has the option set for WebGL, we should\n // User it as our renderer.\n renderCanvas = webGL.renderer.render(enabledElement);\n } else {\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n }\n\n context.drawImage(renderCanvas, 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a grayscale image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.\n This does not work if this layer is not the first layer in the enabledElement.\n * @returns {void}\n */\nexport function addGrayscaleLayer (layer, invalidated, useAlphaChannel = false) {\n if (layer === undefined) {\n throw new Error('addGrayscaleLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderGrayscaleImage.js","import getModalityLUT from './getModalityLUT.js';\r\nimport getVOILUT from './getVOILut.js';\r\n\r\n/**\r\n * Creates a LUT used while rendering to convert stored pixel values to\r\n * display pixels\r\n *\r\n * @param {Image} image A Cornerstone Image Object\r\n * @param {Number} windowWidth The Window Width\r\n * @param {Number} windowCenter The Window Center\r\n * @param {Boolean} invert A boolean describing whether or not the image has been inverted\r\n * @param {Array} [modalityLUT] A modality Lookup Table\r\n * @param {Array} [voiLUT] A Volume of Interest Lookup Table\r\n *\r\n * @returns {Uint8ClampedArray} A lookup table to apply to the image\r\n */\r\nexport default function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {\r\n const maxPixelValue = image.maxPixelValue;\r\n const minPixelValue = image.minPixelValue;\r\n const offset = Math.min(minPixelValue, 0);\r\n\r\n if (image.cachedLut === undefined) {\r\n const length = maxPixelValue - offset + 1;\r\n\r\n image.cachedLut = {};\r\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\r\n }\r\n\r\n const lut = image.cachedLut.lutArray;\r\n const mlutfn = getModalityLUT(image.slope, image.intercept, modalityLUT);\r\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\r\n\r\n if (invert === true) {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = 255 - vlutfn(mlutfn(storedValue));\r\n }\r\n } else {\r\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\r\n lut[storedValue + (-offset)] = vlutfn(mlutfn(storedValue));\r\n }\r\n }\r\n\r\n return lut;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/generateLut.js","function requestFrame (callback) {\n window.setTimeout(callback, 1000 / 60);\n}\n\n/**\n * Polyfills requestAnimationFrame for older browsers.\n *\n * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.\n *\n * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.\n */\nexport default function (callback) {\n return window.requestAnimationFrame(callback) ||\n window.webkitRequestAnimationFrame(callback) ||\n window.mozRequestAnimationFrame(callback) ||\n window.oRequestAnimationFrame(callback) ||\n window.msRequestAnimationFrame(callback) ||\n requestFrame(callback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/requestAnimationFrame.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageData.js","import now from './now.js';\n\n/**\n * Converts stored color pixel values to display pixel values using a LUT.\n *\n * Note: Skips alpha value for any input image pixel data.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + (-minPixelValue)]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedColorPixelDataToCanvasImageData.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataColorLUT (image, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n rgba = clut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataColorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataColorLUT.js","import colors from '../colors/index.js';\nimport now from './now.js';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT (image, grayscaleLut, colorLut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLut instanceof colors.LookupTable) {\n clut = colorLut.Table;\n } else {\n clut = colorLut;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUT;\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js","import { Transform } from './transform.js';\n\n/**\n * Calculate the transform for a Cornerstone enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {Number} [scale] The viewport scale\n * @return {Transform} The current transform\n */\nexport default function (enabledElement, scale) {\n\n const transform = new Transform();\n\n transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2);\n\n // Apply the rotation before scaling for non square pixels\n const angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n // Apply the scale\n let widthScale = enabledElement.viewport.scale;\n let heightScale = enabledElement.viewport.scale;\n\n if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {\n widthScale *= (enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing);\n } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {\n heightScale *= (enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing);\n }\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate(-angle * Math.PI / 180);\n }\n\n // Apply the pan offset\n transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y);\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate(angle * Math.PI / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Translate the origin back to the corner of the image so the event handlers can draw in image coordinate system\n transform.translate(-enabledElement.image.width / 2, -enabledElement.image.height / 2);\n\n return transform;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/calculateTransform.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataColorLUT from '../internal/storedPixelDataToCanvasImageDataColorLUT.js';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderLabelMapImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataColorLUT(image, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a label map image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderLabelMapImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for label map pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addLabelMapLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addLabelMapLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderLabelMapImage.js","import setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport now from '../internal/now.js';\nimport initializeRenderCanvas from './initializeRenderCanvas.js';\nimport getLut from './getLut.js';\nimport saveLastRendered from './saveLastRendered.js';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered.js';\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from '../internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js';\nimport colors from '../colors/index.js';\n\nfunction getRenderCanvas (enabledElement, image, invalidated) {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas = document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // TODO: Deprecate enabledElement.options.colormap\n let colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (colormap && (typeof colormap === 'string')) {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (doesImageNeedToBeRendered(enabledElement, image) === false && invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (!enabledElement.renderingTools.colorLut || invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLut = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const colorLut = enabledElement.renderingTools.colorLut;\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n storedPixelDataToCanvasImageDataPseudocolorLUT(image, lut, colorLut, renderCanvasData.data);\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderPseudoColorImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('drawImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n const { width, height } = image;\n\n context.drawImage(renderCanvas, 0, 0, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n\n/**\n * API function to draw a pseudo-color image to a given layer\n *\n * @param {EnabledElementLayer} layer The layer that the image will be added to\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function addPseudoColorLayer (layer, invalidated) {\n if (layer === undefined) {\n throw new Error('addPseudoColorLayer: layer parameter must not be undefined');\n }\n\n const image = layer.image;\n\n if (image === undefined) {\n throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');\n }\n\n layer.canvas = getRenderCanvas(layer, image, invalidated);\n\n const context = layer.canvas.getContext('2d');\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n layer.renderingTools = saveLastRendered(layer);\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderPseudoColorImage.js","import guid from './internal/guid.js';\nimport { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport triggerCustomEvent from './triggerEvent.js';\n\n/**\n * Helper function to trigger an event on a Cornerstone element with\n * a specific layerId\n *\n * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)\n * @param {EnabledElement} enabledElement The Cornerstone enabled element\n * @param {String} layerId The layer's unique identifier\n * @returns {void}\n */\nfunction triggerEvent (eventName, enabledElement, layerId) {\n const element = enabledElement.element;\n const eventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n enabledElement,\n layerId\n };\n\n triggerCustomEvent(element, eventName, eventData);\n}\n\n/**\n * Rescale the target layer to the base layer based on the\n * relative size of each image and their pixel dimensions.\n *\n * This function will update the Viewport parameters of the\n * target layer to a new scale.\n *\n * @param {EnabledElementLayer} baseLayer The base layer\n * @param {EnabledElementLayer} targetLayer The target layer to rescale\n * @returns {void}\n */\nexport function rescaleImage (baseLayer, targetLayer) {\n if (baseLayer.layerId === targetLayer.layerId) {\n throw new Error('rescaleImage: both arguments represent the same layer');\n }\n\n const baseImage = baseLayer.image;\n const targetImage = targetLayer.image;\n\n // Return if these images don't have an imageId (e.g. for dynamic images)\n if (!baseImage.imageId || !targetImage.imageId) {\n return;\n }\n\n // Column pixel spacing need to be considered when calculating the\n // ratio between the layer added and base layer images\n const colRelative = (targetImage.columnPixelSpacing * targetImage.width) /\n (baseImage.columnPixelSpacing * baseImage.width);\n const viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;\n\n targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;\n}\n\n/**\n * Add a layer to a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image object to add as a new layer\n * @param {Object} options Options for the layer\n *\n * @returns {String} layerId The new layer's unique identifier\n */\nexport function addLayer (element, image, options) {\n const layerId = guid();\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n let viewport;\n\n if (image) {\n viewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (options && options.viewport) {\n viewport = Object.assign(viewport, options.viewport);\n }\n }\n\n // Set syncViewports to true by default when a new layer is added\n if (enabledElement.syncViewports !== false) {\n enabledElement.syncViewports = true;\n }\n\n const newLayer = {\n image,\n layerId,\n viewport,\n options: options || {},\n renderingTools: {}\n };\n\n // Rescale the new layer based on the base layer to make sure\n // they will have a proportional size (pixel spacing)\n if (layers.length && image) {\n rescaleImage(layers[0], newLayer);\n }\n\n layers.push(newLayer);\n\n triggerEvent('cornerstonelayeradded', enabledElement, layerId);\n\n // Set the layer as active if it's the first layer added\n if (layers.length === 1 && image) {\n setActiveLayer(element, layerId);\n }\n\n return layerId;\n}\n\n/**\n * Remove a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function removeLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n const layers = enabledElement.layers;\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index !== -1) {\n layers.splice(index, 1);\n\n // If the current layer is active, and we have other layers,\n // switch to the first layer that remains in the array\n if (layerId === enabledElement.activeLayerId && layers.length) {\n setActiveLayer(element, layers[0].layerId);\n }\n\n triggerEvent('cornerstonelayerremoved', enabledElement, layerId);\n }\n}\n\n/**\n * Retrieve a layer from a Cornerstone element given a layer ID\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @return {EnabledElementLayer} The layer\n */\nexport function getLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === layerId);\n}\n\n/**\n * Retrieve all layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers;\n}\n\n/**\n * Retrieve all visible layers for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n *\n * @return {EnabledElementLayer[]} An array of layers\n */\nexport function getVisibleLayers (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.layers.filter((layer) => layer.options &&\n layer.options.visible !== false &&\n layer.options.opacity !== 0);\n}\n\n/**\n * Set the active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {String} layerId The unique identifier for the layer\n * @returns {void}\n */\nexport function setActiveLayer (element, layerId) {\n const enabledElement = getEnabledElement(element);\n\n // Stop here if this layer is already active\n if (enabledElement.activeLayerId === layerId) {\n return;\n }\n\n const index = enabledElement.layers.findIndex((layer) => layer.layerId === layerId);\n\n if (index === -1) {\n throw new Error('setActiveLayer: layer not found in layers array');\n }\n\n const layer = enabledElement.layers[index];\n\n if (!layer.image) {\n throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');\n }\n\n enabledElement.activeLayerId = layerId;\n enabledElement.image = layer.image;\n enabledElement.viewport = layer.viewport;\n\n updateImage(element);\n triggerEvent('cornerstoneactivelayerchanged', enabledElement, layerId);\n}\n\n/**\n * Set a new image for a specific layerId\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image The image to be displayed in this layer\n * @param {String} [layerId] The unique identifier for the layer\n * @returns {void}\n */\nexport function setLayerImage (element, image, layerId) {\n const enabledElement = getEnabledElement(element);\n const baseLayer = enabledElement.layers[0];\n\n let layer;\n\n if (layerId) {\n layer = getLayer(element, layerId);\n } else {\n layer = getActiveLayer(element);\n }\n\n if (!layer) {\n throw new Error('setLayerImage: Layer not found');\n }\n\n layer.image = image;\n\n if (!image) {\n layer.viewport = undefined;\n\n return;\n }\n\n if (!layer.viewport) {\n const defaultViewport = getDefaultViewport(enabledElement.canvas, image);\n\n // Override the defaults if any optional viewport settings\n // have been specified\n if (layer.options && layer.options.viewport) {\n layer.viewport = Object.assign(defaultViewport, layer.options.viewport);\n }\n\n if (baseLayer.layerId !== layerId) {\n rescaleImage(baseLayer, layer);\n }\n }\n}\n\n/**\n * Retrieve the currently active layer for a Cornerstone element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @return {EnabledElementLayer} The currently active layer\n */\nexport function getActiveLayer (element) {\n const enabledElement = getEnabledElement(element);\n\n\n return enabledElement.layers.find((layer) => layer.layerId === enabledElement.activeLayerId);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./layers.js","/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n */\nfunction generateLinearModalityLUT (slope, intercept) {\n return (storedPixelValue) => storedPixelValue * slope + intercept;\n}\n\nfunction generateNonLinearModalityLUT (modalityLUT) {\n const minValue = modalityLUT.lut[0];\n const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return (storedPixelValue) => {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n */\nexport default function (slope, intercept, modalityLUT) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getModalityLUT.js","/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n */\n\n/**\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateLinearVOILUT (windowWidth, windowCenter) {\n return function (modalityLutValue) {\n return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n */\nfunction generateNonLinearVOILUT (voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;\n const shift = bitsPerEntry - 8;\n const minValue = voiLUT.lut[0] >> shift;\n const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n */\nexport default function (windowWidth, windowCenter, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/getVOILut.js","import LookupTable from './lookupTable.js';\n\nconst COLOR_TRANSPARENT = [0, 0, 0, 0];\n\n// Colormaps\n//\n// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palattes\n// Defined by the DICOM standard\n// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html\n//\n// All Linear Segmented Colormaps were copied from matplotlib\n// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py\n\nconst colormapsData = {\n hotIron: {\n name: 'Hot Iron',\n numOfColors: 256,\n colors: [\n [0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255],\n [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255],\n [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255],\n [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255],\n [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255],\n [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255],\n [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255],\n [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255],\n [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255],\n [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255],\n [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255],\n [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255],\n [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255],\n [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255],\n [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255],\n [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255],\n [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255],\n [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255],\n [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255],\n [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255],\n [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255],\n [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255],\n [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255],\n [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255],\n [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255],\n [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255],\n [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255],\n [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255],\n [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255],\n [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255],\n [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255],\n [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255],\n [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255],\n [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255],\n [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255],\n [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255],\n [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255],\n [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255],\n [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255],\n [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255],\n [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255],\n [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255],\n [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255],\n [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255],\n [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255],\n [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255],\n [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255],\n [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255],\n [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255],\n [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255],\n [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet: {\n name: 'PET',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255],\n [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255],\n [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255],\n [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255],\n [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255],\n [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255],\n [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255],\n [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255],\n [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255],\n [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255],\n [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255],\n [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255],\n [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255],\n [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255],\n [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255],\n [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255],\n [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255],\n [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255],\n [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255],\n [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255],\n [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255],\n [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255],\n [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255],\n [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255],\n [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255],\n [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255],\n [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255],\n [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255],\n [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255],\n [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255],\n [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255],\n [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255],\n [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255],\n [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255],\n [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255],\n [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255],\n [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255],\n [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255],\n [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255],\n [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255],\n [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255],\n [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255],\n [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255],\n [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255],\n [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255],\n [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255],\n [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255],\n [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255],\n [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255],\n [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255],\n [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255],\n [255, 255, 255, 255]\n ]\n },\n hotMetalBlue: {\n name: 'Hot Metal Blue',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255],\n [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255],\n [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255],\n [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255],\n [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255],\n [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255],\n [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255],\n [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255],\n [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255],\n [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255],\n [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255],\n [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255],\n [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255],\n [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255],\n [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255],\n [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255],\n [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255],\n [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255],\n [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255],\n [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255],\n [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255],\n [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255],\n [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255],\n [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255],\n [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255],\n [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255],\n [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255],\n [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255],\n [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255],\n [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255],\n [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255],\n [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255],\n [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255],\n [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255],\n [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255],\n [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255],\n [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255],\n [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255],\n [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255],\n [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255],\n [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255],\n [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255],\n [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255],\n [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255],\n [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255],\n [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255],\n [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255],\n [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255],\n [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255],\n [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255],\n [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255],\n [255, 255, 255, 255]\n ]\n },\n pet20Step: {\n name: 'PET 20 Step',\n numColors: 256,\n colors: [\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255],\n [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255],\n [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255],\n [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255],\n [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255],\n [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255],\n [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255],\n [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255],\n [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255],\n [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255],\n [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255],\n [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255],\n [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255],\n [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255],\n [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255],\n [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255],\n [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255],\n [255, 255, 255, 255]\n ]\n },\n gray: {\n name: 'Gray',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 1, 1]]\n }\n },\n jet: {\n name: 'Jet',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],\n green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],\n blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]\n }\n },\n hsv: {\n name: 'HSV',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750],\n [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0],\n [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750],\n [0.857143, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1],\n [0.507937, 1, 1], [0.666667, 0.062500, 0.062500],\n [0.682540, 0, 0], [1, 0, 0]],\n blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500],\n [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500],\n [1, 0.09375, 0.09375]]\n }\n },\n hot: {\n name: 'Hot',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],\n blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]\n }\n },\n cool: {\n name: 'Cool',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 1, 1], [1, 0, 0]],\n blue: [[0, 1, 1], [1, 1, 1]]\n }\n },\n spring: {\n name: 'Spring',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0, 0]]\n }\n },\n summer: {\n name: 'Summer',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 1, 1]],\n green: [[0, 0.5, 0.5], [1, 1, 1]],\n blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]\n }\n },\n autumn: {\n name: 'Autumn',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 0, 0], [1, 0, 0]]\n }\n },\n winter: {\n name: 'Winter',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [1, 0, 0]],\n green: [[0, 0, 0], [1, 1, 1]],\n blue: [[0, 1, 1], [1, 0.5, 0.5]]\n }\n },\n bone: {\n name: 'Bone',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],\n green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],\n blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]\n }\n },\n copper: {\n name: 'Copper',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],\n green: [[0, 0, 0], [1, 0.7812, 0.7812]],\n blue: [[0, 0, 0], [1, 0.4975, 0.4975]]\n }\n },\n spectral: {\n name: 'Spectral',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0],\n [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0],\n [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1],\n [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80],\n [1, 0.80, 0.80]],\n green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0],\n [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000],\n [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000],\n [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1],\n [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000],\n [0.80, 0.6000, 0.6000], [0.85, 0, 0],\n [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],\n blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667],\n [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667],\n [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0],\n [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0],\n [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]\n }\n },\n coolwarm: {\n name: 'CoolWarm',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388],\n [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478],\n [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608],\n [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204],\n [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162],\n [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281],\n [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949],\n [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556],\n [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179],\n [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518],\n [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803],\n [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177],\n [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866],\n [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617],\n [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542],\n [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934],\n [1, 0.705673158, 0.705673158]],\n green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838],\n [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618],\n [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092],\n [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772],\n [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107],\n [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712],\n [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879],\n [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984],\n [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047],\n [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443],\n [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809],\n [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156],\n [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968],\n [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467],\n [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446],\n [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067],\n [1, 0.01555616, 0.01555616]],\n blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763],\n [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899],\n [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588],\n [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814],\n [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203],\n [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227],\n [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269],\n [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838],\n [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546],\n [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146],\n [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763],\n [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762],\n [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684],\n [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596],\n [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199],\n [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123],\n [1, 0.150232812, 0.150232812]]\n }\n },\n blues: {\n name: 'Blues',\n numColors: 256,\n gamma: 1,\n segmentedData: {\n red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991],\n [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429],\n [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256],\n [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502],\n [1, 0.031372550874948502, 0.031372550874948502]],\n green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449],\n [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144],\n [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698],\n [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169],\n [1, 0.18823529779911041, 0.18823529779911041]],\n blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359],\n [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171],\n [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162],\n [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]\n }\n }\n};\n\n// Generate linearly spaced vectors\n// http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\nfunction linspace (a, b, n) {\n n = n === null ? 100 : n;\n\n const increment = (b - a) / (n - 1);\n const vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n// Return the number of elements smaller than \"elem\" (binary search)\nfunction getRank (array, elem) {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = left + Math.floor((right - left) / 2);\n const midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n// Find the indices into a sorted array a such that, if the corresponding elements\n// In v were inserted before the indices, the order of a would be preserved.\n// http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\nfunction searchSorted (inputArray, values) {\n let i;\n const indexes = [];\n const len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n// Create an *N* -element 1-d lookup table\n//\n// *Data* represented by a list of x,y0,y1 mapping correspondences. Each element in this\n// List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n// A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n// Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n// The value of y for values of x <= to that given, and y1 is the value to be used for x >\n// Than that given). The list must start with x=0, end with x=1, and all values of x must be\n// In increasing order. Values between the given mapping points are determined by simple linear\n// Interpolation.\n//\n// The function returns an array \"result\" where result[x*(N-1)] gives the closest value for\n// Values of x between 0 and 1.\nfunction makeMappingArray (N, data, gamma) {\n let i;\n const x = [];\n const y0 = [];\n const y1 = [];\n const lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n const element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n const xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n const xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n const index = xLinSpaceIndexes[i];\n const colorPercent = ((xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]));\n const colorDelta = (y0[index] - y1[index - 1]);\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n// Colormap based on lookup tables using linear segments.\n//\n// The lookup table is generated using linear interpolation for each\n// Primary color, with the 0-1 domain divided into any number of\n// Segments.\n//\n// https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\nfunction createLinearSegmentedColormap (segmentedData, N, gamma) {\n let i;\n const lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n const redLut = makeMappingArray(N, segmentedData.red, gamma);\n const greenLut = makeMappingArray(N, segmentedData.green, gamma);\n const blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n const red = Math.round(redLut[i] * 255);\n const green = Math.round(greenLut[i] * 255);\n const blue = Math.round(blueLut[i] * 255);\n const rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/*\n* Return all colormaps (id and name) available\n*/\nexport function getColormapsList () {\n const colormaps = [];\n const keys = Object.keys(colormapsData);\n\n keys.forEach(function (key) {\n if (colormapsData.hasOwnProperty(key)) {\n const colormap = colormapsData[key];\n\n colormaps.push({\n id: key,\n name: colormap.name\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n *\n * @returns {*} The Colormap Object\n */\nexport function getColormap (id, colormapData) {\n let colormap = colormapsData[id];\n\n if (!colormap) {\n colormap = colormapsData[id] = colormapData || {\n name: '',\n colors: []\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);\n }\n\n return {\n getId () {\n return id;\n },\n\n getColorSchemeName () {\n return colormap.name;\n },\n\n setColorSchemeName (name) {\n colormap.name = name;\n },\n\n getNumberOfColors () {\n return colormap.colors.length;\n },\n\n setNumberOfColors (numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n\n getColor (index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n\n getColorRepeating (index) {\n const numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n\n setColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n\n addColor (rgba) {\n colormap.colors.push(rgba);\n },\n\n insertColor (index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n\n removeColor (index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n\n clearColors () {\n colormap.colors = [];\n },\n\n buildLookupTable (lut) {\n if (!lut) {\n return;\n }\n\n const numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (let i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n\n createLookupTable () {\n const lut = new LookupTable();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n\n isValidIndex (index) {\n return (index >= 0) && (index < colormap.colors.length);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./colors/colormap.js","// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nconst BELOW_RANGE_COLOR_INDEX = 0;\nconst ABOVE_RANGE_COLOR_INDEX = 1;\nconst NAN_COLOR_INDEX = 2;\n\nfunction HSVToRGB (hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n const rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n const hueCase = Math.floor(hue * 6);\n const frac = 6 * hue - hueCase;\n const lx = val * (1 - sat);\n const ly = val * (1 - sat * frac);\n const lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\nclass LookupTable {\n constructor () {\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n setNumberOfTableValues (number) {\n this.NumberOfColors = number;\n }\n\n setRamp (ramp) {\n this.Ramp = ramp;\n }\n\n setTableRange (start, end) {\n // Set/Get the minimum/maximum scalar values for scalar mapping.\n // Scalar values less than minimum range value are clamped to minimum range value.\n // Scalar values greater than maximum range value are clamped to maximum range value.\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n\n setHueRange (start, end) {\n // Set the range in hue (using automatic generation). Hue ranges between [0,1].\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n\n setSaturationRange (start, end) {\n // Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n\n setValueRange (start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n\n setRange (start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n\n setAlphaRange (start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n\n getColor (scalar) {\n // Map one value through the lookup table and return the color as an\n // RGB array of doubles between 0 and 1.\n return this.mapValue(scalar);\n }\n\n build (force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n const maxIndex = this.NumberOfColors - 1;\n\n let hinc, sinc, vinc, ainc;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (let i = 0; i <= maxIndex; i++) {\n const hue = this.HueRange[0] + i * hinc;\n const sat = this.SaturationRange[0] + i * sinc;\n const val = this.ValueRange[0] + i * vinc;\n const alpha = this.AlphaRange[0] + i * ainc;\n\n const rgb = HSVToRGB(hue, sat, val);\n const c_rgba = [];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));\n c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));\n c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error(`Invalid Ramp value (${this.Ramp})`);\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n\n buildSpecialColors () {\n const numberOfColors = this.NumberOfColors;\n const belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n const aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n const nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n // Given a scalar value v, return an rgba color value from lookup table.\n mapValue (v) {\n const index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n\n getIndex (v) {\n const p = {};\n\n p.Range = [];\n p.MaxIndex = this.NumberOfColors - 1;\n\n // This was LookupShiftAndScale\n p.Shift = -this.TableRange[0];\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n let index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n\n setTableValue (index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error(`Can't set the table value for negative index (${index})`);\n }\n\n if (index >= this.NumberOfColors) {\n new Error(`Index ${index} is greater than the number of colors ${this.NumberOfColors}`);\n }\n\n this.Table[index] = rgba;\n\n if ((index === 0) || (index === this.NumberOfColors - 1)) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n}\n\nexport default LookupTable;\n\n\n\n// WEBPACK FOOTER //\n// ./colors/lookupTable.js","import now from './now.js';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let pixelValue;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedPixelDataToCanvasImageDataRGBA.js","// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nexport class Transform {\n constructor () {\n this.reset();\n }\n\n reset () {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n\n clone () {\n const transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n\n multiply (matrix) {\n const m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n const m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n const m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n const m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n const dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n const dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n\n invert () {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n\n rotate (rad) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n\n translate (x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n\n scale (sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n\n transformPoint (px, py) {\n const x = px;\n const y = py;\n\n px = x * this.m[0] + y * this.m[2] + this.m[4];\n py = x * this.m[1] + y * this.m[3] + this.m[5];\n\n return {\n x: px,\n y: py\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/transform.js","import lutMatches from './lutMatches.js';\nimport generateLut from '../internal/generateLut.js';\n\nexport default function (image, viewport, invalidated) {\n // If we have a cached lut and it has the right values, return it immediately\n if (image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&\n lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&\n image.cachedLut.invert === viewport.invert &&\n invalidated !== true) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/getLut.js","import events from '../events.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * This module deals with caching image textures in VRAM for WebGL\r\n */\r\n\r\nconst imageCache = {};\r\n\r\nconst cachedImages = [];\r\n\r\nlet maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB\r\nlet cacheSizeInBytes = 0;\r\n\r\nfunction getCacheInfo () {\r\n return {\r\n maximumSizeInBytes,\r\n cacheSizeInBytes,\r\n numberOfImagesCached: cachedImages.length\r\n };\r\n}\r\n\r\nfunction purgeCacheIfNecessary () {\r\n // If max cache size has not been exceeded, do nothing\r\n if (cacheSizeInBytes <= maximumSizeInBytes) {\r\n return;\r\n }\r\n\r\n // Cache size has been exceeded, create list of images sorted by timeStamp\r\n // So we can purge the least recently used image\r\n function compare (a, b) {\r\n if (a.timeStamp > b.timeStamp) {\r\n return -1;\r\n }\r\n if (a.timeStamp < b.timeStamp) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n cachedImages.sort(compare);\r\n\r\n // Remove images as necessary\r\n while (cacheSizeInBytes > maximumSizeInBytes) {\r\n const lastCachedImage = cachedImages[cachedImages.length - 1];\r\n\r\n cacheSizeInBytes -= lastCachedImage.sizeInBytes;\r\n delete imageCache[lastCachedImage.imageId];\r\n cachedImages.pop();\r\n\r\n triggerEvent(events, 'cornerstonewebgltextureremoved', { imageId: lastCachedImage.imageId });\r\n }\r\n\r\n const cacheInfo = getCacheInfo();\r\n\r\n triggerEvent(events, 'cornerstonewebgltexturecachefull', cacheInfo);\r\n}\r\n\r\nfunction setMaximumSizeBytes (numBytes) {\r\n if (numBytes === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\r\n }\r\n if (numBytes.toFixed === undefined) {\r\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\r\n }\r\n\r\n maximumSizeInBytes = numBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction putImageTexture (image, imageTexture) {\r\n const imageId = image.imageId;\r\n\r\n if (image === undefined) {\r\n throw new Error('putImageTexture: image must not be undefined');\r\n }\r\n\r\n if (imageId === undefined) {\r\n throw new Error('putImageTexture: imageId must not be undefined');\r\n }\r\n\r\n if (imageTexture === undefined) {\r\n throw new Error('putImageTexture: imageTexture must not be undefined');\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {\r\n throw new Error('putImageTexture: imageId already in cache');\r\n }\r\n\r\n const cachedImage = {\r\n imageId,\r\n imageTexture,\r\n timeStamp: new Date(),\r\n sizeInBytes: imageTexture.sizeInBytes\r\n };\r\n\r\n imageCache[imageId] = cachedImage;\r\n cachedImages.push(cachedImage);\r\n\r\n if (imageTexture.sizeInBytes === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');\r\n }\r\n if (imageTexture.sizeInBytes.toFixed === undefined) {\r\n throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');\r\n }\r\n cacheSizeInBytes += cachedImage.sizeInBytes;\r\n purgeCacheIfNecessary();\r\n}\r\n\r\nfunction getImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('getImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n return;\r\n }\r\n\r\n // Bump time stamp for cached image\r\n cachedImage.timeStamp = new Date();\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction removeImageTexture (imageId) {\r\n if (imageId === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n const cachedImage = imageCache[imageId];\r\n\r\n if (cachedImage === undefined) {\r\n throw new Error('removeImageTexture: imageId must not be undefined');\r\n }\r\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\r\n cacheSizeInBytes -= cachedImage.sizeInBytes;\r\n delete imageCache[imageId];\r\n\r\n return cachedImage.imageTexture;\r\n}\r\n\r\nfunction purgeCache () {\r\n while (cachedImages.length > 0) {\r\n const removedCachedImage = cachedImages.pop();\r\n\r\n delete imageCache[removedCachedImage.imageId];\r\n }\r\n cacheSizeInBytes = 0;\r\n}\r\n\r\nexport default {\r\n purgeCache,\r\n getImageTexture,\r\n putImageTexture,\r\n removeImageTexture,\r\n setMaximumSizeBytes\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/textureCache.js","/**\n * Creates and compiles a shader.\n *\n * @param {!WebGLRenderingContext} gl The WebGL Context.\n * @param {string} shaderSource The GLSL source code for the shader.\n * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.\n *\n * @return {!WebGLShader} The shader.\n */\nfunction compileShader (gl, shaderSource, shaderType) {\n\n // Create the shader object\n const shader = gl.createShader(shaderType);\n\n // Set the shader source code.\n gl.shaderSource(shader, shaderSource);\n\n // Compile the shader\n gl.compileShader(shader);\n\n // Check if it compiled\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong during compilation; get the error\n const infoLog = gl.getShaderInfoLog(shader);\n\n console.error(`Could not compile shader:\\n${infoLog}`);\n }\n\n return shader;\n}\n\n/**\n * Creates a program from 2 shaders.\n *\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShader A vertex shader.\n * @param {!WebGLShader} fragmentShader A fragment shader.\n * @return {!WebGLProgram} A program.\n */\nfunction createProgram (gl, vertexShader, fragmentShader) {\n\n // Create a program.\n const program = gl.createProgram();\n\n // Attach the shaders.\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n // Link the program.\n gl.linkProgram(program);\n\n // Check if it linked.\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n if (!success && !gl.isContextLost()) {\n // Something went wrong with the link\n const infoLog = gl.getProgramInfoLog(program);\n\n console.error(`WebGL program filed to link:\\n${infoLog}`);\n }\n\n return program;\n}\n\n/**\n * Creates a program from 2 shaders source (Strings)\n * @param {!WebGLRenderingContext} gl The WebGL context.\n * @param {!WebGLShader} vertexShaderSrc Vertex shader string\n * @param {!WebGLShader} fragShaderSrc Fragment shader string\n * @return {!WebGLProgram} A program\n */\nexport default function (gl, vertexShaderSrc, fragShaderSrc) {\n const vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);\n const fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);\n\n\n return createProgram(gl, vertexShader, fragShader);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/createProgramFromString.js","/**\n * This module is responsible for drawing an image to an enabled elements canvas element\n */\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\nimport { renderColorImage } from './renderColorImage.js';\n\n/**\n * API function to draw a standard web image (PNG, JPG) to an enabledImage\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport function renderWebImage (enabledElement, invalidated) {\n if (enabledElement === undefined) {\n throw new Error('renderWebImage: enabledElement parameter must not be undefined');\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('renderWebImage: image must be loaded before it can be drawn');\n }\n\n // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image\n // Directly. If any of those are changed, we call renderColorImage() to apply the lut\n if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth &&\n enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter &&\n enabledElement.viewport.invert === false) {\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n context.drawImage(image.getImage(), 0, 0, image.width, image.height, 0, 0, image.width, image.height);\n } else {\n renderColorImage(enabledElement, invalidated);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/renderWebImage.js","import { getEnabledElement } from './enabledElements.js';\r\nimport fitToWindow from './fitToWindow.js';\r\nimport updateImage from './updateImage.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nfunction setCanvasSize (element, canvas) {\r\n // The device pixel ratio is 1.0 for normal displays and > 1.0\r\n // For high DPI displays like Retina\r\n /*\r\n\r\n This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas\r\n is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to\r\n a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel\r\n produces incorrect results. I couldn't find any way to determine when the DPI changed other than\r\n by polling which is not very clean. If anyone has any ideas here, please let me know, but for now\r\n we will disable this functionality. We may want\r\n to add a mechanism to optionally enable this functionality if we can determine it is safe to do\r\n so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing\r\n to be cautious here since I would rather not have bug reports or safety issues related to this\r\n scenario.\r\n\r\n var devicePixelRatio = window.devicePixelRatio;\r\n if(devicePixelRatio === undefined) {\r\n devicePixelRatio = 1.0;\r\n }\r\n */\r\n\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.width !== element.clientWidth) {\r\n canvas.width = element.clientWidth;\r\n canvas.style.width = `${element.clientWidth}px`;\r\n }\r\n // Avoid setting the same value because it flashes the canvas with IE and Edge\r\n if (canvas.height !== element.clientHeight) {\r\n canvas.height = element.clientHeight;\r\n canvas.style.height = `${element.clientHeight}px`;\r\n }\r\n}\r\n\r\n/**\r\n * Resizes an enabled element and optionally fits the image to window\r\n *\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @param {Boolean} fitViewportToWindow true to refit, false to leave viewport parameters as they are\r\n * @returns {void}\r\n */\r\nexport default function (element, fitViewportToWindow) {\r\n\r\n const enabledElement = getEnabledElement(element);\r\n\r\n setCanvasSize(element, enabledElement.canvas);\r\n\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'cornerstoneelementresized', eventData);\r\n\r\n if (enabledElement.image === undefined) {\r\n return;\r\n }\r\n\r\n if (fitViewportToWindow === true) {\r\n fitToWindow(element);\r\n } else {\r\n updateImage(element);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./resize.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @return {{width, height}} The Image dimensions\n */\nfunction getImageSize (enabledElement) {\n if (enabledElement.viewport.rotation === 0 || enabledElement.viewport.rotation === 180) {\n return {\n width: enabledElement.image.width,\n height: enabledElement.image.height\n };\n }\n\n return {\n width: enabledElement.image.height,\n height: enabledElement.image.width\n };\n\n}\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param {HTMLElement} element The Cornerstone element to update\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const imageSize = getImageSize(enabledElement);\n\n const verticalScale = enabledElement.canvas.height / imageSize.height;\n const horizontalScale = enabledElement.canvas.width / imageSize.width;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = Math.min(horizontalScale, verticalScale);\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./fitToWindow.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves an array of stored pixel values from a rectangular region of an image\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The stored pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n if (element === undefined) {\n throw new Error('getStoredPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = getEnabledElement(element);\n const storedPixels = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < width; column++) {\n const spIndex = ((row + y) * enabledElement.image.columns) + (column + x);\n\n storedPixels[index++] = pixelData[spIndex];\n }\n }\n\n return storedPixels;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getStoredPixels.js","import events from './events.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * This module deals with caching images\n */\nlet maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB\nlet cacheSizeInBytes = 0;\n\n// Dictionary of imageId to cachedImage objects\nconst imageCacheDict = {};\n\n// Array of cachedImage objects\nexport const cachedImages = [];\n\nexport function setMaximumSizeBytes (numBytes) {\n if (numBytes === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');\n }\n if (numBytes.toFixed === undefined) {\n throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');\n }\n\n maximumSizeInBytes = numBytes;\n\n triggerEvent(events, 'cornerstoneimagecachemaximumsizechanged');\n\n purgeCacheIfNecessary();\n}\n\nfunction purgeCacheIfNecessary () {\n // If max cache size has not been exceeded, do nothing\n if (cacheSizeInBytes <= maximumSizeInBytes) {\n return;\n }\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare (a, b) {\n if (a.timeStamp > b.timeStamp) {\n return -1;\n }\n if (a.timeStamp < b.timeStamp) {\n return 1;\n }\n\n return 0;\n }\n cachedImages.sort(compare);\n\n // Remove images as necessary)\n while (cacheSizeInBytes > maximumSizeInBytes) {\n const lastCachedImage = cachedImages[cachedImages.length - 1];\n const imageId = lastCachedImage.imageId;\n\n removeImageLoadObject(imageId);\n\n triggerEvent(events, 'cornerstoneimagecachepromiseremoved', { imageId });\n }\n\n const cacheInfo = getCacheInfo();\n\n triggerEvent(events, 'cornerstoneimagecachefull', cacheInfo);\n}\n\nexport function putImageLoadObject (imageId, imageLoadObject) {\n if (imageId === undefined) {\n throw new Error('putImageLoadObject: imageId must not be undefined');\n }\n if (imageLoadObject.promise === undefined) {\n throw new Error('putImageLoadObject: imageLoadObject.promise must not be undefined');\n }\n if (imageCacheDict.hasOwnProperty(imageId) === true) {\n throw new Error('putImageLoadObject: imageId already in cache');\n }\n if (imageLoadObject.cancelFn && typeof imageLoadObject.cancelFn !== 'function') {\n throw new Error('putImageLoadObject: imageLoadObject.cancelFn must be a function');\n }\n\n const cachedImage = {\n loaded: false,\n imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imageLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0\n };\n\n imageCacheDict[imageId] = cachedImage;\n cachedImages.push(cachedImage);\n\n imageLoadObject.promise.then(function (image) {\n if (cachedImages.indexOf(cachedImage) === -1) {\n // If the image has been purged before being loaded, we stop here.\n return;\n }\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n\n if (image.sizeInBytes === undefined) {\n throw new Error('putImageLoadObject: image.sizeInBytes must not be undefined');\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error('putImageLoadObject: image.sizeInBytes is not a number');\n }\n\n cachedImage.sizeInBytes = image.sizeInBytes;\n cacheSizeInBytes += cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'addImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'cornerstoneimagecachechanged', eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n\n purgeCacheIfNecessary();\n }, () => {\n const cachedImage = imageCacheDict[imageId];\n\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n delete imageCacheDict[imageId];\n });\n}\n\nexport function getImageLoadObject (imageId) {\n if (imageId === undefined) {\n throw new Error('getImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imageLoadObject;\n}\n\nexport function removeImageLoadObject (imageId) {\n if (imageId === undefined) {\n throw new Error('removeImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = imageCacheDict[imageId];\n\n if (cachedImage === undefined) {\n throw new Error('removeImageLoadObject: imageId was not present in imageCache');\n }\n\n cachedImages.splice(cachedImages.indexOf(cachedImage), 1);\n cacheSizeInBytes -= cachedImage.sizeInBytes;\n\n const eventDetails = {\n action: 'deleteImage',\n image: cachedImage\n };\n\n triggerEvent(events, 'cornerstoneimagecachechanged', eventDetails);\n decache(cachedImage.imageLoadObject.promise);\n\n delete imageCacheDict[imageId];\n}\n\nexport function getCacheInfo () {\n return {\n maximumSizeInBytes,\n cacheSizeInBytes,\n numberOfImagesCached: cachedImages.length\n };\n}\n\n// This method should only be called by `removeImageLoadObject` because it's\n// The one that knows how to deal with shared cache keys and cache size.\nfunction decache (imagePromise) {\n imagePromise.then(function (image) {\n if (image.decache) {\n image.decache();\n }\n });\n}\n\nexport function purgeCache () {\n while (cachedImages.length > 0) {\n const removedCachedImage = cachedImages[0];\n\n removeImageLoadObject(removedCachedImage.imageId);\n }\n}\n\nexport function changeImageIdCacheSize (imageId, newCacheSize) {\n const cacheEntry = imageCacheDict[imageId];\n\n if (cacheEntry) {\n cacheEntry.imageLoadObject.promise.then(function (image) {\n const cacheSizeDifference = newCacheSize - image.sizeInBytes;\n\n image.sizeInBytes = newCacheSize;\n cacheEntry.sizeInBytes = newCacheSize;\n cacheSizeInBytes += cacheSizeDifference;\n\n const eventDetails = {\n action: 'changeImageSize',\n image\n };\n\n triggerEvent(events, 'cornerstoneimagecachechanged', eventDetails);\n });\n }\n}\n\nexport default {\n imageCache: imageCacheDict,\n cachedImages,\n setMaximumSizeBytes,\n putImageLoadObject,\n getImageLoadObject,\n removeImageLoadObject,\n getCacheInfo,\n purgeCache,\n changeImageIdCacheSize\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageCache.js","import colors from './colors/index.js';\n\n/**\n * Converts the image pixel data into a false color data\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Object} lookupTable A lookup table Object\n *\n * @returns {void}\n */\nexport default function (image, lookupTable) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = image.width * image.height;\n const origPixelData = image.origPixelData || image.getPixelData();\n const storedColorPixelData = new Uint8Array(numPixels * 4);\n let sp;\n let mapped;\n\n image.color = true;\n image.falseColor = true;\n image.origPixelData = origPixelData;\n\n if (lookupTable instanceof colors.LookupTable) {\n lookupTable.build();\n\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n mapped = lookupTable.mapValue(sp);\n storedColorPixelData[canvasImageDataIndex++] = mapped[0];\n storedColorPixelData[canvasImageDataIndex++] = mapped[1];\n storedColorPixelData[canvasImageDataIndex++] = mapped[2];\n storedColorPixelData[canvasImageDataIndex++] = mapped[3];\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + (-minPixelValue)][3]; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n sp = origPixelData[storedPixelDataIndex++];\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue\n storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha\n }\n }\n\n image.rgba = true;\n image.cachedLut = undefined;\n image.render = undefined;\n image.slope = 1;\n image.intercept = 0;\n image.minPixelValue = 0;\n image.maxPixelValue = 255;\n image.windowWidth = 255;\n image.windowCenter = 128;\n image.getPixelData = () => storedColorPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelDataToFalseColorData.js","// Internal (some of these are from old internal/legacy expose)\nexport { default as drawImage } from './internal/drawImage.js';\nexport { default as generateLut } from './internal/generateLut.js';\nexport { default as getDefaultViewport } from './internal/getDefaultViewport.js';\nexport { default as requestAnimationFrame } from './internal/requestAnimationFrame.js';\nexport { default as storedPixelDataToCanvasImageData } from './internal/storedPixelDataToCanvasImageData.js';\nexport { default as storedColorPixelDataToCanvasImageData } from './internal/storedColorPixelDataToCanvasImageData.js';\nexport { default as storedPixelDataToCanvasImageDataColorLUT } from './internal/storedPixelDataToCanvasImageDataColorLUT.js';\nexport { default as storedPixelDataToCanvasImageDataPseudocolorLUT } from './internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js';\n\nexport { default as internal } from './internal/index.js';\n\n// Rendering\nexport { renderLabelMapImage } from './rendering/renderLabelMapImage.js';\nexport { renderPseudoColorImage } from './rendering/renderPseudoColorImage.js';\nexport { renderColorImage } from './rendering/renderColorImage.js';\nexport { renderGrayscaleImage } from './rendering/renderGrayscaleImage.js';\nexport { renderWebImage } from './rendering/renderWebImage.js';\n\nexport { default as canvasToPixel } from './canvasToPixel.js';\nexport { default as disable } from './disable.js';\nexport { default as displayImage } from './displayImage.js';\nexport { default as draw } from './draw.js';\nexport { default as drawInvalidated } from './drawInvalidated.js';\nexport { default as enable } from './enable.js';\nexport { getElementData, removeElementData } from './enabledElementData.js';\nexport {\n getEnabledElement,\n addEnabledElement,\n getEnabledElementsByImageId,\n getEnabledElements\n} from './enabledElements.js';\n\nexport {\n addLayer,\n removeLayer,\n getLayer,\n getLayers,\n getVisibleLayers,\n setActiveLayer,\n getActiveLayer,\n setLayerImage\n} from './layers.js';\n\nexport { default as fitToWindow } from './fitToWindow.js';\nexport { default as getDefaultViewportForImage } from './getDefaultViewportForImage.js';\nexport { default as getImage } from './getImage.js';\nexport { default as getPixels } from './getPixels.js';\nexport { default as getStoredPixels } from './getStoredPixels.js';\nexport { default as getViewport } from './getViewport.js';\nexport {\n loadImage,\n loadAndCacheImage,\n registerImageLoader,\n registerUnknownImageLoader\n} from './imageLoader.js';\n\nexport { default as invalidate } from './invalidate.js';\nexport { default as invalidateImageId } from './invalidateImageId.js';\nexport { default as pageToPixel } from './pageToPixel.js';\nexport { default as pixelToCanvas } from './pixelToCanvas.js';\nexport { default as reset } from './reset.js';\nexport { default as resize } from './resize.js';\nexport { default as setToPixelCoordinateSystem } from './setToPixelCoordinateSystem.js';\nexport { default as setViewport } from './setViewport.js';\nexport { default as updateImage } from './updateImage.js';\nexport { default as pixelDataToFalseColorData } from './pixelDataToFalseColorData.js';\n\nexport { default as rendering } from './rendering/index.js';\nexport { default as imageCache } from './imageCache.js';\nexport { default as metaData } from './metaData.js';\nexport { default as webGL } from './webgl/index.js';\nexport { default as colors } from './colors/index.js';\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage } from './falseColorMapping.js';\n\nexport { default as events } from './events.js';\nexport { default as triggerEvent } from './triggerEvent.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import drawImage from './drawImage.js';\r\nimport generateLut from './generateLut.js';\r\nimport getDefaultViewport from './getDefaultViewport.js';\r\nimport requestAnimationFrame from './requestAnimationFrame.js';\r\nimport storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA.js';\r\nimport storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData.js';\r\nimport storedPixelDataToCanvasImageDataColorLUT from './storedPixelDataToCanvasImageDataColorLUT.js';\r\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from './storedPixelDataToCanvasImageDataPseudocolorLUT.js';\r\nimport getTransform from './getTransform.js';\r\nimport calculateTransform from './calculateTransform.js';\r\nimport { Transform } from './transform.js';\r\n\r\nexport default {\r\n drawImage,\r\n generateLut,\r\n getDefaultViewport,\r\n requestAnimationFrame,\r\n storedPixelDataToCanvasImageData,\r\n storedPixelDataToCanvasImageDataRGBA,\r\n storedPixelDataToCanvasImageDataColorLUT,\r\n storedPixelDataToCanvasImageDataPseudocolorLUT,\r\n storedColorPixelDataToCanvasImageData,\r\n getTransform,\r\n calculateTransform,\r\n Transform\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/index.js","/**\n * Check if two lookup tables match\n *\n * @param {LUT} a A lookup table function\n * @param {LUT} b Another lookup table function\n * @return {boolean} Whether or not they match\n */\nexport default function (a, b) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return (a.id === b.id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/lutMatches.js","import getVOILUT from './getVOILut.js';\n\n/**\n * Creates a LUT used while rendering to convert stored pixel values to\n * display pixels\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Number} windowWidth The Window Width\n * @param {Number} windowCenter The Window Center\n * @param {Boolean} invert A boolean describing whether or not the image has been inverted\n * @param {Array} [voiLUT] A Volume of Interest Lookup Table\n *\n * @returns {Uint8ClampedArray} A lookup table to apply to the image\n */\nexport default function (image, windowWidth, windowCenter, invert, voiLUT) {\n const maxPixelValue = image.maxPixelValue;\n const minPixelValue = image.minPixelValue;\n const offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n const length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n const lut = image.cachedLut.lutArray;\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\n\n if (invert === true) {\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + (-offset)] = 255 - vlutfn(storedValue);\n }\n } else {\n for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {\n lut[storedValue + (-offset)] = vlutfn(storedValue);\n }\n }\n\n return lut;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/generateColorLut.js","import now from './now.js';\n\n/**\n * Converts stored RGBA color pixel values to display pixel values using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n */\nexport default function (image, lut, canvasImageDataData) {\n\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + (-minPixelValue)]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/storedRGBAPixelDataToCanvasImageData.js","/* eslint no-bitwise: 0 */\n\nimport { shaders, dataUtilities } from './shaders/index.js';\nimport { vertexShader } from './vertexShader.js';\nimport textureCache from './textureCache.js';\nimport createProgramFromString from './createProgramFromString.js';\n\nconst renderCanvas = document.createElement('canvas');\nlet gl;\nlet texCoordBuffer;\nlet positionBuffer;\nlet isWebGLInitialized = false;\n\nexport { isWebGLInitialized };\n\nexport function getRenderCanvas () {\n return renderCanvas;\n}\n\nfunction initShaders () {\n for (const id in shaders) {\n // Console.log(\"WEBGL: Loading shader\", id);\n const shader = shaders[id];\n\n shader.attributes = {};\n shader.uniforms = {};\n shader.vert = vertexShader;\n\n shader.program = createProgramFromString(gl, shader.vert, shader.frag);\n\n shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');\n gl.enableVertexAttribArray(shader.attributes.texCoordLocation);\n\n shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');\n gl.enableVertexAttribArray(shader.attributes.positionLocation);\n\n shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');\n }\n}\n\nexport function initRenderer () {\n if (isWebGLInitialized === true) {\n // Console.log(\"WEBGL Renderer already initialized\");\n return;\n }\n\n if (initWebGL(renderCanvas)) {\n initBuffers();\n initShaders();\n // Console.log(\"WEBGL Renderer initialized!\");\n isWebGLInitialized = true;\n }\n}\n\nfunction updateRectangle (gl, width, height) {\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n width, height,\n 0, height,\n width, 0,\n 0, 0]), gl.STATIC_DRAW);\n}\n\nfunction handleLostContext (event) {\n event.preventDefault();\n console.warn('WebGL Context Lost!');\n}\n\nfunction handleRestoredContext (event) {\n event.preventDefault();\n isWebGLInitialized = false;\n textureCache.purgeCache();\n initRenderer();\n // Console.log('WebGL Context Restored.');\n}\n\nfunction initWebGL (canvas) {\n\n gl = null;\n try {\n // Try to grab the standard context. If it fails, fallback to experimental.\n const options = {\n preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element\n };\n\n // ---------------- Testing purposes -------------\n // If (debug === true && WebGLDebugUtils) {\n // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);\n // }\n // ---------------- Testing purposes -------------\n\n gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options);\n\n // Set up event listeners for context lost / context restored\n canvas.removeEventListener('webglcontextlost', handleLostContext, false);\n canvas.addEventListener('webglcontextlost', handleLostContext, false);\n\n canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);\n canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);\n\n } catch (error) {\n throw new Error('Error creating WebGL context');\n }\n\n // If we don't have a GL context, give up now\n if (!gl) {\n console.error('Unable to initialize WebGL. Your browser may not support it.');\n gl = null;\n }\n\n return gl;\n}\n\nfunction getImageDataType (image) {\n if (image.color) {\n return 'rgb';\n }\n\n let datatype = 'int';\n\n if (image.minPixelValue >= 0) {\n datatype = `u${datatype}`;\n }\n\n if (image.maxPixelValue > 255) {\n datatype += '16';\n } else {\n datatype += '8';\n }\n\n return datatype;\n}\n\nfunction getShaderProgram (image) {\n\n const datatype = getImageDataType(image);\n // We need a mechanism for\n // Choosing the shader based on the image datatype\n // Console.log(\"Datatype: \" + datatype);\n\n if (shaders.hasOwnProperty(datatype)) {\n return shaders[datatype];\n }\n\n return shaders.rgb;\n}\n\nfunction generateTexture (image) {\n const TEXTURE_FORMAT = {\n uint8: gl.LUMINANCE,\n int8: gl.LUMINANCE_ALPHA,\n uint16: gl.LUMINANCE_ALPHA,\n int16: gl.RGB,\n rgb: gl.RGB\n };\n\n const TEXTURE_BYTES = {\n int8: 1, // Luminance\n uint16: 2, // Luminance + Alpha\n int16: 3, // RGB\n rgb: 3 // RGB\n };\n\n const imageDataType = getImageDataType(image);\n const format = TEXTURE_FORMAT[imageDataType];\n\n // GL texture configuration\n const texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n const imageData = dataUtilities[imageDataType].storedPixelDataToImageData(image, image.width, image.height);\n\n gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData);\n\n // Calculate the size in bytes of this image in memory\n const sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];\n\n return {\n texture,\n sizeInBytes\n };\n}\n\nfunction getImageTexture (image) {\n let imageTexture = textureCache.getImageTexture(image.imageId);\n\n if (!imageTexture) {\n // Console.log(\"Generating texture for imageid: \", image.imageId);\n imageTexture = generateTexture(image);\n textureCache.putImageTexture(image, imageTexture);\n }\n\n return imageTexture.texture;\n}\n\nfunction initBuffers () {\n positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1, 1,\n 0, 1,\n 1, 0,\n 0, 0\n ]), gl.STATIC_DRAW);\n\n\n texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n 1.0, 1.0,\n 0.0, 1.0,\n 1.0, 0.0,\n 0.0, 0.0\n ]), gl.STATIC_DRAW);\n}\n\nfunction renderQuad (shader, parameters, texture, width, height) {\n gl.clearColor(1.0, 0.0, 0.0, 1.0);\n gl.viewport(0, 0, width, height);\n\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.useProgram(shader.program);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n for (const key in parameters) {\n const uniformLocation = gl.getUniformLocation(shader.program, key);\n\n if (!uniformLocation) {\n continue;\n\n // Disabling this error for now since RGB requires minPixelValue\n // but the other shaders do not.\n // throw `Could not access location for uniform: ${key}`;\n }\n\n const uniform = parameters[key];\n\n const type = uniform.type;\n const value = uniform.value;\n\n if (type === 'i') {\n gl.uniform1i(uniformLocation, value);\n } else if (type === 'f') {\n gl.uniform1f(uniformLocation, value);\n } else if (type === '2f') {\n gl.uniform2f(uniformLocation, value[0], value[1]);\n }\n }\n\n updateRectangle(gl, width, height);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n}\n\nexport function render (enabledElement) {\n // Resize the canvas\n const image = enabledElement.image;\n\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const viewport = enabledElement.viewport;\n\n // Render the current image\n const shader = getShaderProgram(image);\n const texture = getImageTexture(image);\n const parameters = {\n u_resolution: { type: '2f',\n value: [image.width, image.height] },\n wc: { type: 'f',\n value: viewport.voi.windowCenter },\n ww: { type: 'f',\n value: viewport.voi.windowWidth },\n slope: { type: 'f',\n value: image.slope },\n intercept: { type: 'f',\n value: image.intercept },\n minPixelValue: { type: 'f',\n value: image.minPixelValue },\n invert: { type: 'i',\n value: viewport.invert ? 1 : 0 }\n };\n\n renderQuad(shader, parameters, texture, image.width, image.height);\n\n return renderCanvas;\n}\n\nexport function isWebGLAvailable () {\n // Adapted from\n // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas\n\n const options = {\n failIfMajorPerformanceCaveat: true\n };\n\n try {\n const canvas = document.createElement('canvas');\n\n\n return Boolean(window.WebGLRenderingContext) &&\n (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));\n } catch (e) {\n return false;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/renderer.js","import { int16Shader, int16DataUtilities } from './int16.js';\nimport { int8Shader, int8DataUtilities } from './int8.js';\nimport { rgbShader, rgbDataUtilities } from './rgb.js';\nimport { uint16Shader, uint16DataUtilities } from './uint16.js';\nimport { uint8Shader, uint8DataUtilities } from './uint8.js';\n\nconst shaders = {\n int16: int16Shader,\n int8: int8Shader,\n rgb: rgbShader,\n uint16: uint16Shader,\n uint8: uint8Shader\n};\n\nconst dataUtilities = {\n int16: int16DataUtilities,\n int8: int8DataUtilities,\n rgb: rgbDataUtilities,\n uint16: uint16DataUtilities,\n uint8: uint8DataUtilities\n};\n\nexport { shaders, dataUtilities };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/index.js","/* eslint no-bitwise: 0 */\n\nconst int16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack int16 into three uint8 channels (r, g, b)\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack int16 into three uint8 channels (r, g, b)\n const pixelData = image.getPixelData();\n const numberOfChannels = 3;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = Math.abs(pixelData[i]);\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int16DataUtilities = {\n storedPixelDataToImageData\n};\n\nint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.g*65536.0;' +\n\n 'if (color.b == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int16.js","const int8Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Store data in Uint8Array\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n // Store data in Uint8Array\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n data[offset++] = pixelData[i];\n data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive\n }\n\n return data;\n}\n\nexport const int8DataUtilities = {\n storedPixelDataToImageData\n};\n\nint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.;' +\n\n 'if (color.a == 0.0)' +\n 'intensity = -intensity;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { int8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/int8.js","const rgbShader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * Pack RGB images into a 3-channel RGB texture\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n // Only 3 channels, since we use WebGL's RGB texture format\n const numStoredPixels = image.width * image.height * 4;\n const numOutputPixels = image.width * image.height * 3;\n const storedPixelData = image.getPixelData();\n const data = new Uint8Array(numOutputPixels);\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + (-minPixelValue); // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n } else {\n while (storedPixelDataIndex < numStoredPixels) {\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green\n data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue\n storedPixelDataIndex += 1; // The stored pixel data has 4 channels\n }\n }\n\n return data;\n}\n\nexport const rgbDataUtilities = {\n storedPixelDataToImageData\n};\n\nrgbShader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform float minPixelValue;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n\n // Get texture\n 'vec3 color = texture2D(u_image, v_texCoord).xyz;' +\n\n // Rescale based on slope and intercept\n 'color = color * 256.0 * slope + intercept;' +\n\n // Apply window settings\n 'float center0 = wc - 0.5 - minPixelValue;' +\n 'float width0 = max(ww, 1.0);' +\n 'color = (color - center0) / width0 + 0.5;' +\n\n // RGBA output\n 'gl_FragColor = vec4(color, 1);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' +\n '}';\n\nexport { rgbShader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/rgb.js","/* eslint no-bitwise: 0 */\n\nconst uint16Shader = {};\n\n/**\n * Convert stored pixel data to image data.\n *\n * For uint16 pack uint16 into two uint8 channels (r and a).\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n\n // Transfer image data to alpha and luminance channels of WebGL texture\n // Credit to @jpambrun and @fernandojsg\n\n // Pack uint16 into two uint8 channels (r and a)\n const pixelData = image.getPixelData();\n const numberOfChannels = 2;\n const data = new Uint8Array(image.width * image.height * numberOfChannels);\n let offset = 0;\n\n for (let i = 0; i < pixelData.length; i++) {\n const val = pixelData[i];\n\n data[offset++] = val & 0xFF;\n data[offset++] = val >> 8;\n }\n\n return data;\n}\n\nexport const uint16DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint16Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0 + color.a*65536.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint16Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint16.js","const uint8Shader = {};\n\n/**\n * Convert stored pixel data to image data. Here we will store\n * all data in the alpha channel.\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Uint8Array} The image data for use by the WebGL shader\n */\nfunction storedPixelDataToImageData (image) {\n // Transfer image data to alpha channel of WebGL texture\n return image.getPixelData();\n}\n\nexport const uint8DataUtilities = {\n storedPixelDataToImageData\n};\n\nuint8Shader.frag = 'precision mediump float;' +\n 'uniform sampler2D u_image;' +\n 'uniform float ww;' +\n 'uniform float wc;' +\n 'uniform float slope;' +\n 'uniform float intercept;' +\n 'uniform int invert;' +\n 'varying vec2 v_texCoord;' +\n\n 'void main() {' +\n // Get texture\n 'vec4 color = texture2D(u_image, v_texCoord);' +\n\n // Calculate luminance from packed texture\n 'float intensity = color.r*256.0;' +\n\n // Rescale based on slope and window settings\n 'intensity = intensity * slope + intercept;' +\n 'float center0 = wc - 0.5;' +\n 'float width0 = max(ww, 1.0);' +\n 'intensity = (intensity - center0) / width0 + 0.5;' +\n\n // Clamp intensity\n 'intensity = clamp(intensity, 0.0, 1.0);' +\n\n // RGBA output\n 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' +\n\n // Apply any inversion necessary\n 'if (invert == 1)' +\n 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' +\n '}';\n\nexport { uint8Shader };\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/shaders/uint8.js","export const vertexShader = 'attribute vec2 a_position;' +\n 'attribute vec2 a_texCoord;' +\n 'uniform vec2 u_resolution;' +\n 'varying vec2 v_texCoord;' +\n 'void main() {' +\n 'vec2 zeroToOne = a_position / u_resolution;' +\n 'vec2 zeroToTwo = zeroToOne * 2.0;' +\n 'vec2 clipSpace = zeroToTwo - 1.0;' +\n 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +\n 'v_texCoord = a_texCoord;' +\n '}';\n\n\n\n// WEBPACK FOOTER //\n// ./webgl/vertexShader.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the canvas coordinate system to the pixel coordinate system\n * system. This can be used to reset tools' image coordinates after modifications\n * have been made in canvas space (e.g. moving a tool by a few cm, independent of\n * image resolution).\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {{x: Number, y: Number}} pt The input point in the canvas coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./canvasToPixel.js","import { getEnabledElements } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n\r\n/**\r\n * Disable an HTML element for further use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n if (element === undefined) {\r\n throw new Error('disable: element must not be undefined');\r\n }\r\n\r\n // Search for this element in this list of enabled elements\r\n const enabledElements = getEnabledElements();\r\n\r\n for (let i = 0; i < enabledElements.length; i++) {\r\n if (enabledElements[i].element === element) {\r\n // We found it!\r\n\r\n // Fire an event so dependencies can cleanup\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'cornerstoneelementdisabled', eventData);\r\n\r\n // Remove the child DOM elements that we created (e.g.canvas)\r\n enabledElements[i].element.removeChild(enabledElements[i].canvas);\r\n enabledElements[i].canvas = undefined;\r\n\r\n // Remove this element from the list of enabled elements\r\n enabledElements.splice(i, 1);\r\n\r\n break;\r\n }\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./disable.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\nimport now from './internal/now.js';\nimport { setLayerImage } from './layers.js';\nimport triggerEvent from './triggerEvent.js';\n\n/**\n * Sets a new image object for a given element.\n *\n * Will also apply an optional viewport setting.\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {Object} image An Image loaded by a Cornerstone Image Loader\n * @param {Object} [viewport] A set of Cornerstone viewport parameters\n * @returns {void}\n */\nexport default function (element, image, viewport) {\n if (element === undefined) {\n throw new Error('displayImage: parameter element must not be undefined');\n }\n if (image === undefined) {\n throw new Error('displayImage: parameter image must not be undefined');\n }\n\n const enabledElement = getEnabledElement(element);\n const oldImage = enabledElement.image;\n\n enabledElement.image = image;\n\n if (enabledElement.layers && enabledElement.layers.length) {\n setLayerImage(element, image);\n }\n\n if (enabledElement.viewport === undefined) {\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, image);\n }\n\n // Merge viewport\n if (viewport) {\n for (const attrname in viewport) {\n if (viewport[attrname] !== null) {\n enabledElement.viewport[attrname] = viewport[attrname];\n }\n }\n }\n\n let frameRate;\n\n if (enabledElement.lastImageTimeStamp !== undefined) {\n const timeSinceLastImage = now() - enabledElement.lastImageTimeStamp;\n\n frameRate = (1000 / timeSinceLastImage).toFixed();\n }\n\n enabledElement.lastImageTimeStamp = now();\n\n const newImageEventData = {\n viewport: enabledElement.viewport,\n element: enabledElement.element,\n image: enabledElement.image,\n oldImage,\n enabledElement,\n frameRate\n };\n\n triggerEvent(enabledElement.element, 'cornerstonenewimage', newImageEventData);\n\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./displayImage.js","function s4 () {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).\n substring(1);\n}\n\n/**\n * Generate a unique identifier\n *\n * @return {string} A unique identifier\n */\nexport default function () {\n return `${s4() + s4()}-${s4()}-${s4()}-${\n s4()}-${s4()}${s4()}${s4()}`;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/guid.js","/**\n * This module is responsible for immediately drawing an enabled element\n */\n\nimport { getEnabledElement } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Immediately draws the enabled element\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('draw: image has not been loaded yet');\n }\n\n drawImage(enabledElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./draw.js","/**\n * This module is responsible for drawing invalidated enabled elements\n */\n\nimport { getEnabledElements } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Draws all invalidated enabled elements and clears the invalid flag after drawing it\n *\n * @returns {void}\n */\nexport default function () {\n const enabledElements = getEnabledElements();\n\n for (let i = 0; i < enabledElements.length; i++) {\n const ee = enabledElements[i];\n\n if (ee.invalid === true) {\n drawImage(ee, true);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./drawInvalidated.js","import { addEnabledElement } from './enabledElements.js';\r\nimport resize from './resize.js';\r\nimport drawImageSync from './internal/drawImageSync.js';\r\nimport requestAnimationFrame from './internal/requestAnimationFrame.js';\r\nimport webGL from './webgl/index.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module is responsible for enabling an element to display images with cornerstone\r\n */\r\n\r\nfunction hasImageOrLayers (enabledElement) {\r\n return enabledElement.image !== undefined || enabledElement.layers.length;\r\n}\r\n\r\n\r\n/**\r\n * Enable an HTML Element for use in Cornerstone\r\n *\r\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\r\n * @param {Object} options Options for the enabledElement\r\n *\r\n * @return {void}\r\n */\r\nexport default function (element, options) {\r\n if (element === undefined) {\r\n throw new Error('enable: parameter element cannot be undefined');\r\n }\r\n\r\n // If this enabled element has the option set for WebGL, we should\r\n // Check if this device actually supports it\r\n if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {\r\n if (webGL.renderer.isWebGLAvailable()) {\r\n // If WebGL is available on the device, initialize the renderer\r\n // And return the renderCanvas from the WebGL rendering path\r\n webGL.renderer.initRenderer();\r\n options.renderer = 'webgl';\r\n } else {\r\n // If WebGL is not available on this device, we will fall back\r\n // To using the Canvas renderer\r\n console.error('WebGL not available, falling back to Canvas renderer');\r\n delete options.renderer;\r\n }\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n\r\n element.appendChild(canvas);\r\n\r\n const enabledElement = {\r\n element,\r\n canvas,\r\n image: undefined, // Will be set once image is loaded\r\n invalid: false, // True if image needs to be drawn, false if not\r\n needsRedraw: true,\r\n options,\r\n layers: [],\r\n data: {},\r\n renderingTools: {}\r\n };\r\n\r\n addEnabledElement(enabledElement);\r\n\r\n resize(element, true);\r\n\r\n /**\r\n * Draw the image immediately\r\n *\r\n * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks\r\n * @returns {void}\r\n */\r\n function draw (timestamp) {\r\n if (enabledElement.canvas === undefined) {\r\n return;\r\n }\r\n\r\n const eventDetails = {\r\n enabledElement,\r\n timestamp\r\n };\r\n\r\n triggerEvent(enabledElement.element, 'cornerstoneprerender', eventDetails);\r\n\r\n if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {\r\n drawImageSync(enabledElement, enabledElement.invalid);\r\n }\r\n\r\n requestAnimationFrame(draw);\r\n }\r\n\r\n draw();\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./enable.js","import now from './now.js';\r\nimport drawCompositeImage from './drawCompositeImage.js';\r\nimport { renderColorImage } from '../rendering/renderColorImage.js';\r\nimport { renderGrayscaleImage } from '../rendering/renderGrayscaleImage.js';\r\nimport { renderPseudoColorImage } from '../rendering/renderPseudoColorImage.js';\r\nimport { renderLabelMapImage } from '../rendering/renderLabelMapImage.js';\r\nimport triggerEvent from '../triggerEvent.js';\r\n\r\n/**\r\n * Draw an image to a given enabled element synchronously\r\n *\r\n * @param {EnabledElement} enabledElement An enabled element to draw into\r\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\r\n * @returns {void}\r\n */\r\nexport default function (enabledElement, invalidated) {\r\n const image = enabledElement.image;\r\n const element = enabledElement.element;\r\n const layers = enabledElement.layers || [];\r\n\r\n // Check if enabledElement can be redrawn\r\n if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {\r\n return;\r\n }\r\n\r\n // Start measuring the time needed to draw the image/layers\r\n const start = now();\r\n\r\n image.stats = {\r\n lastGetPixelDataTime: -1.0,\r\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\r\n lastPutImageDataTime: -1.0,\r\n lastRenderTime: -1.0,\r\n lastLutGenerateTime: -1.0\r\n };\r\n\r\n if (layers && layers.length) {\r\n drawCompositeImage(enabledElement, invalidated);\r\n } else if (image) {\r\n let render = image.render;\r\n\r\n if (!render) {\r\n if (enabledElement.viewport.colormap &&\r\n enabledElement.viewport.colormap !== '' &&\r\n enabledElement.image.labelmap === true) {\r\n render = renderLabelMapImage;\r\n } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {\r\n render = renderPseudoColorImage;\r\n } else if (image.color) {\r\n render = renderColorImage;\r\n } else {\r\n render = renderGrayscaleImage;\r\n }\r\n }\r\n\r\n render(enabledElement, invalidated);\r\n }\r\n\r\n // Calculate how long it took to draw the image/layers\r\n const renderTimeInMs = now() - start;\r\n\r\n const eventData = {\r\n viewport: enabledElement.viewport,\r\n element,\r\n image,\r\n enabledElement,\r\n canvasContext: enabledElement.canvas.getContext('2d'),\r\n renderTimeInMs\r\n };\r\n\r\n image.stats.lastRenderTime = renderTimeInMs;\r\n\r\n enabledElement.invalid = false;\r\n enabledElement.needsRedraw = false;\r\n\r\n triggerEvent(element, 'cornerstoneimagerendered', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawImageSync.js","import { getLayers, getActiveLayer, getVisibleLayers } from '../layers.js';\nimport { addGrayscaleLayer } from '../rendering/renderGrayscaleImage.js';\nimport { addColorLayer } from '../rendering/renderColorImage.js';\nimport { addPseudoColorLayer } from '../rendering/renderPseudoColorImage.js';\nimport { addLabelMapLayer } from '../rendering/renderLabelMapImage.js';\nimport setToPixelCoordinateSystem from '../setToPixelCoordinateSystem.js';\n\n// This is used to keep each of the layers' viewports in sync with the active layer\nconst originalViewportScale = {};\n\nfunction getViewportRatio (baseLayerId, targetLayerId) {\n return originalViewportScale[targetLayerId] / originalViewportScale[baseLayerId];\n}\n\n// Sync all viewports based on active layer's viewport\nfunction syncViewports (layers, activeLayer) {\n // If we intend to keep the viewport's scale, translation and rotation in sync,\n // loop through the layers\n layers.forEach((layer) => {\n // Don't do anything to the active layer\n // Don't do anything if this layer has no viewport\n if (layer === activeLayer ||\n !layer.viewport ||\n !activeLayer.viewport) {\n return;\n }\n\n if (!originalViewportScale[layer.layerId]) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n\n const viewportRatio = getViewportRatio(activeLayer.layerId, layer.layerId);\n\n // Update the layer's translation and scale to keep them in sync with the first image\n // based on the ratios between the images\n layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;\n layer.viewport.rotation = activeLayer.viewport.rotation;\n layer.viewport.translation = {\n x: (activeLayer.viewport.translation.x / viewportRatio),\n y: (activeLayer.viewport.translation.y / viewportRatio)\n };\n layer.viewport.hflip = activeLayer.viewport.hflip;\n layer.viewport.vflip = activeLayer.viewport.vflip;\n });\n}\n\n/**\n * Internal function to render all layers for a Cornerstone enabled element\n *\n * @param {CanvasRenderingContext2D} context Canvas context to draw upon\n * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element\n * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn\n * @returns {void}\n */\nfunction renderLayers (context, layers, invalidated) {\n // Loop through each layer and draw it to the canvas\n layers.forEach((layer, index) => {\n if (!layer.image) {\n return;\n }\n\n context.save();\n\n // Set the layer's canvas to the pixel coordinate system\n layer.canvas = context.canvas;\n setToPixelCoordinateSystem(layer, context);\n\n // Render into the layer's canvas\n const colormap = layer.viewport.colormap || layer.options.colormap;\n const labelmap = layer.viewport.labelmap;\n const isInvalid = layer.invalid || invalidated;\n\n if (colormap && colormap !== '' && labelmap === true) {\n addLabelMapLayer(layer, isInvalid);\n } else if (colormap && colormap !== '') {\n addPseudoColorLayer(layer, isInvalid);\n } else if (layer.image.color === true) {\n addColorLayer(layer, isInvalid);\n } else {\n // If this is the base layer, use the alpha channel for rendering of the grayscale image\n const useAlphaChannel = (index === 0);\n\n addGrayscaleLayer(layer, isInvalid, useAlphaChannel);\n }\n\n // Apply any global opacity settings that have been defined for this layer\n if (layer.options && layer.options.opacity) {\n context.globalAlpha = layer.options.opacity;\n } else {\n context.globalAlpha = 1;\n }\n\n if (layer.options && layer.options.fillStyle) {\n context.fillStyle = layer.options.fillStyle;\n }\n\n // Set the pixelReplication property before drawing from the layer into the\n // composite canvas\n context.imageSmoothingEnabled = !layer.viewport.pixelReplication;\n context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;\n\n // Draw from the current layer's canvas onto the enabled element's canvas\n const { width, height } = layer.image;\n\n context.drawImage(layer.canvas, 0, 0, width, height, 0, 0, width, height);\n context.restore();\n\n layer.invalid = false;\n });\n}\n\n/**\n * Internal API function to draw a composite image to a given enabled element\n *\n * @param {EnabledElement} enabledElement An enabled element to draw into\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n */\nexport default function (enabledElement, invalidated) {\n const element = enabledElement.element;\n const allLayers = getLayers(element);\n const activeLayer = getActiveLayer(element);\n const visibleLayers = getVisibleLayers(element);\n const resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports;\n\n // This state will help us to determine if the user has re-synced the\n // layers allowing us to make a new copy of the viewports\n enabledElement.lastSyncViewportsState = enabledElement.syncViewports;\n\n // Stores a copy of all viewports if the user has just synced them then we can use the\n // copies to calculate anything later (ratio, translation offset, rotation offset, etc)\n if (resynced) {\n allLayers.forEach(function (layer) {\n if (layer.viewport) {\n originalViewportScale[layer.layerId] = layer.viewport.scale;\n }\n });\n }\n\n // Sync all viewports in case it's activated\n if (enabledElement.syncViewports === true) {\n syncViewports(visibleLayers, activeLayer);\n }\n\n // Get the enabled element's canvas so we can draw to it\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height);\n\n // Render all visible layers\n renderLayers(context, visibleLayers, invalidated);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./internal/drawCompositeImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n * @returns {*} Whatever data is stored for this enabled element\n */\nexport function getElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n if (ee.data.hasOwnProperty(dataType) === false) {\n ee.data[dataType] = {};\n }\n\n return ee.data[dataType];\n}\n\n/**\n * Clears any data for a Cornerstone enabledElement for a specific string\n * dataType\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {string} dataType A string name for an arbitrary set of data\n *\n * @returns {void}\n */\nexport function removeElementData (element, dataType) {\n const ee = getEnabledElement(element);\n\n delete ee.data[dataType];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./enabledElementData.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\n\n/**\n * Returns a default viewport for display the specified image on the specified\n * enabled element. The default viewport is fit to window\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Image} image A Cornerstone Image Object\n *\n * @returns {Viewport} The default viewport for the image\n */\nexport default function (element, image) {\n const enabledElement = getEnabledElement(element);\n\n return getDefaultViewport(enabledElement.canvas, image);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getDefaultViewportForImage.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Returns the currently displayed image for an element or undefined if no image has\n * been displayed yet\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Image} The Cornerstone Image Object displayed in this element\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n return enabledElement.image;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getImage.js","import { getEnabledElement } from './enabledElements.js';\nimport getStoredPixels from './getStoredPixels.js';\nimport getModalityLUT from './internal/getModalityLUT.js';\n\n/**\n * Retrieves an array of pixels from a rectangular region with modality LUT transformation applied\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates\n * @param {Number} width The width of the of the sampling rectangle in image coordinates\n * @param {Number} height The height of the of the sampling rectangle in image coordinates\n * @returns {Array} The modality pixel value of the pixels in the sampling rectangle\n */\nexport default function (element, x, y, width, height) {\n const storedPixels = getStoredPixels(element, x, y, width, height);\n const ee = getEnabledElement(element);\n const mlutfn = getModalityLUT(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);\n\n return storedPixels.map(mlutfn);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getPixels.js","import { getEnabledElement } from './enabledElements.js';\n\n/**\n * Retrieves the viewport for the specified enabled element\n *\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\n * @returns {Viewport|undefined} The Cornerstone Viewport settings for this element, if they exist. Otherwise, undefined\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n const viewport = enabledElement.viewport;\n\n if (viewport === undefined) {\n return;\n }\n\n // Return a copy of the viewport\n return Object.assign({}, viewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./getViewport.js","import { getImageLoadObject, putImageLoadObject } from './imageCache.js';\r\nimport events from './events.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module deals with ImageLoaders, loading images and caching images\r\n */\r\n\r\n\r\nconst imageLoaders = {};\r\n\r\nlet unknownImageLoader;\r\n\r\n/**\r\n * Load an image using a registered Cornerstone Image Loader.\r\n *\r\n * The image loader that is used will be\r\n * determined by the image loader scheme matching against the imageId.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails\r\n */\r\nfunction loadImageFromImageLoader (imageId, options) {\r\n const colonIndex = imageId.indexOf(':');\r\n const scheme = imageId.substring(0, colonIndex);\r\n const loader = imageLoaders[scheme];\r\n\r\n if (loader === undefined || loader === null) {\r\n if (unknownImageLoader !== undefined) {\r\n return unknownImageLoader(imageId);\r\n }\r\n\r\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\r\n }\r\n\r\n const imageLoadObject = loader(imageId, options);\r\n\r\n // Broadcast an image loaded event once the image is loaded\r\n imageLoadObject.promise.then(function (image) {\r\n triggerEvent(events, 'cornerstoneimageloaded', { image });\r\n }, function (error) {\r\n const errorObject = {\r\n imageId,\r\n error\r\n };\r\n\r\n triggerEvent(events, 'cornerstoneimageloadfailed', errorObject);\r\n });\r\n\r\n return imageLoadObject;\r\n}\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails\r\n */\r\nexport function loadImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadImage: parameter imageId must not be undefined');\r\n }\r\n\r\n const imageLoadObject = getImageLoadObject(imageId);\r\n\r\n if (imageLoadObject !== undefined) {\r\n return imageLoadObject.promise;\r\n }\r\n\r\n return loadImageFromImageLoader(imageId, options).promise;\r\n}\r\n\r\n//\r\n\r\n/**\r\n * Loads an image given an imageId and optional priority and returns a promise which will resolve to\r\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\r\n *\r\n * @param {String} imageId A Cornerstone Image Object's imageId\r\n * @param {Object} [options] Options to be passed to the Image Loader\r\n *\r\n * @returns {Object} Image Loader Object (TODO: define a JSDoc type for this)\r\n */\r\nexport function loadAndCacheImage (imageId, options) {\r\n if (imageId === undefined) {\r\n throw new Error('loadAndCacheImage: parameter imageId must not be undefined');\r\n }\r\n\r\n let imageLoadObject = getImageLoadObject(imageId);\r\n\r\n if (imageLoadObject !== undefined) {\r\n return imageLoadObject.promise;\r\n }\r\n\r\n imageLoadObject = loadImageFromImageLoader(imageId, options);\r\n\r\n putImageLoadObject(imageId, imageLoadObject);\r\n\r\n return imageLoadObject.promise;\r\n}\r\n\r\n/**\r\n * Registers an imageLoader plugin with cornerstone for the specified scheme\r\n *\r\n * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\r\n * @param {Function} imageLoader A Cornerstone Image Loader function\r\n * @returns {void}\r\n */\r\nexport function registerImageLoader (scheme, imageLoader) {\r\n imageLoaders[scheme] = imageLoader;\r\n}\r\n\r\n/**\r\n * Registers a new unknownImageLoader and returns the previous one\r\n *\r\n * @param {Function} imageLoader A Cornerstone Image Loader\r\n *\r\n * @returns {Function|Undefined} The previous Unknown Image Loader\r\n */\r\nexport function registerUnknownImageLoader (imageLoader) {\r\n const oldImageLoader = unknownImageLoader;\r\n\r\n unknownImageLoader = imageLoader;\r\n\r\n return oldImageLoader;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./imageLoader.js","import { getEnabledElement } from './enabledElements.js';\r\nimport triggerEvent from './triggerEvent.js';\r\n\r\n/**\r\n * This module contains a function to make an image is invalid\r\n */\r\n\r\n/**\r\n * Sets the invalid flag on the enabled element and fire an event\r\n * @param {HTMLElement} element The DOM element enabled for Cornerstone\r\n * @returns {void}\r\n */\r\nexport default function (element) {\r\n const enabledElement = getEnabledElement(element);\r\n\r\n enabledElement.invalid = true;\r\n enabledElement.needsRedraw = true;\r\n const eventData = {\r\n element\r\n };\r\n\r\n triggerEvent(element, 'cornerstoneinvalidated', eventData);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./invalidate.js","/**\n * This module contains a function to immediately invalidate an image\n */\n\nimport { getEnabledElementsByImageId } from './enabledElements.js';\nimport drawImage from './internal/drawImage.js';\n\n/**\n * Forces the image to be updated/redrawn for the all enabled elements\n * displaying the specified imageId\n *\n * @param {string} imageId The imageId of the Cornerstone Image Object to redraw\n * @returns {void}\n */\nexport default function (imageId) {\n\n const enabledElements = getEnabledElementsByImageId(imageId);\n\n enabledElements.forEach(function (enabledElement) {\n drawImage(enabledElement, true);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./invalidateImageId.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the page coordinate system to the pixel coordinate\n * system\n *\n * @param {HTMLElement} element The Cornerstone element within which the input point lies\n * @param {Number} pageX The x value in the page coordinate system\n * @param {Number} pageY The y value in the page coordinate system\n *\n * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system\n */\nexport default function (element, pageX, pageY) {\n const enabledElement = getEnabledElement(element);\n\n if (enabledElement.image === undefined) {\n throw new Error('image has not been loaded yet');\n }\n\n // Convert the pageX and pageY to the canvas client coordinates\n const rect = element.getBoundingClientRect();\n const clientX = pageX - rect.left - window.pageXOffset;\n const clientY = pageY - rect.top - window.pageYOffset;\n\n const pt = { x: clientX,\n y: clientY };\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pageToPixel.js","import { getEnabledElement } from './enabledElements.js';\nimport getTransform from './internal/getTransform.js';\n\n/**\n * Converts a point in the pixel coordinate system to the canvas coordinate system\n * system. This can be used to render using canvas context without having the weird\n * side effects that come from scaling and non square pixels\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system\n *\n * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system\n */\nexport default function (element, pt) {\n const enabledElement = getEnabledElement(element);\n const transform = getTransform(enabledElement);\n\n\n return transform.transformPoint(pt.x, pt.y);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./pixelToCanvas.js","import { getEnabledElement } from './enabledElements.js';\nimport getDefaultViewport from './internal/getDefaultViewport.js';\nimport updateImage from './updateImage.js';\n\n/**\n * Resets the viewport to the default settings\n *\n * @param {HTMLElement} element An HTML Element enabled for Cornerstone\n * @returns {void}\n */\nexport default function (element) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport = getDefaultViewport(enabledElement.canvas, enabledElement.image);\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./reset.js","import { getEnabledElement } from './enabledElements.js';\nimport updateImage from './updateImage.js';\n\nconst MIN_WINDOW_WIDTH = 0.000001;\nconst MIN_VIEWPORT_SCALE = 0.0001;\n\n/**\n * Sets the viewport for an element and corrects invalid values\n *\n * @param {HTMLElement} element - DOM element of the enabled element\n * @param {Viewport} viewport - Object containing the viewport properties\n * @returns {void}\n */\nexport default function (element, viewport) {\n const enabledElement = getEnabledElement(element);\n\n enabledElement.viewport.translation.x = viewport.translation.x;\n enabledElement.viewport.translation.y = viewport.translation.y;\n enabledElement.viewport.voi.windowCenter = viewport.voi.windowCenter;\n enabledElement.viewport.invert = viewport.invert;\n enabledElement.viewport.pixelReplication = viewport.pixelReplication;\n enabledElement.viewport.rotation = viewport.rotation;\n enabledElement.viewport.hflip = viewport.hflip;\n enabledElement.viewport.vflip = viewport.vflip;\n enabledElement.viewport.modalityLUT = viewport.modalityLUT;\n enabledElement.viewport.voiLUT = viewport.voiLUT;\n enabledElement.viewport.colormap = viewport.colormap;\n enabledElement.viewport.labelmap = viewport.labelmap;\n\n // Prevent window width from being too small (note that values close to zero are valid and can occur with\n // PET images in particular)\n enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);\n\n // Prevent scale from getting too small\n enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);\n\n // Normalize the rotation value to a positive rotation in degrees\n enabledElement.viewport.rotation %= 360;\n if (enabledElement.viewport.rotation < 0) {\n enabledElement.viewport.rotation += 360;\n }\n\n // Force the image to be updated since the viewport has been modified\n updateImage(element);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./setViewport.js","import { renderColorImage } from './renderColorImage.js';\nimport { renderGrayscaleImage } from './renderGrayscaleImage.js';\nimport { renderWebImage } from './renderWebImage.js';\n\nexport default {\n colorImage: renderColorImage,\n grayscaleImage: renderGrayscaleImage,\n webImage: renderWebImage\n};\n\n\n\n// WEBPACK FOOTER //\n// ./rendering/index.js","// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nconst providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param {Function} provider Metadata provider function\n * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @returns {void}\n */\nexport function addProvider (provider, priority = 0) {\n let i;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority,\n provider\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param {Function} provider Metadata provider function\n *\n * @returns {void}\n */\nexport function removeProvider (provider) {\n for (let i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param {String} type The type of metadata requested from the metadata store\n * @param {String} imageId The Cornerstone Image Object's imageId\n *\n * @returns {*} The metadata retrieved from the metadata store\n */\nfunction getMetaData (type, imageId) {\n // Invoke each provider in priority order until one returns something\n for (let i = 0; i < providers.length; i++) {\n const result = providers[i].provider(type, imageId);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexport default {\n addProvider,\n removeProvider,\n get: getMetaData\n};\n\n\n\n// WEBPACK FOOTER //\n// ./metaData.js","import { getEnabledElement } from './enabledElements.js';\nimport pixelDataToFalseColorData from './pixelDataToFalseColorData.js';\nimport { getColormap } from './colors/colormap.js';\n\n/**\n * Retrieves the minimum and maximum pixel values from an Array of pixel data\n *\n * @param {Array} pixelData The input pixel data array\n *\n * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array\n */\nfunction getPixelValues (pixelData) {\n let minPixelValue = Number.MAX_VALUE;\n let maxPixelValue = Number.MIN_VALUE;\n const len = pixelData.length;\n let pixel;\n\n for (let i = 0; i < len; i++) {\n pixel = pixelData[i];\n minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;\n maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;\n }\n\n return {\n minPixelValue,\n maxPixelValue\n };\n}\n\n/**\n * Retrieve a function that will allow an image object to be reset to its original form\n * after a false color mapping transformation\n *\n * @param {Image} image A Cornerstone Image Object\n *\n * @return {Function} A function for resetting an Image Object to its original form\n */\nfunction getRestoreImageMethod (image) {\n if (image.restore) {\n return image.restore;\n }\n\n const color = image.color;\n const rgba = image.rgba;\n const cachedLut = image.cachedLut;\n const slope = image.slope;\n const windowWidth = image.windowWidth;\n const windowCenter = image.windowCenter;\n const minPixelValue = image.minPixelValue;\n const maxPixelValue = image.maxPixelValue;\n\n return function () {\n image.color = color;\n image.rgba = rgba;\n image.cachedLut = cachedLut;\n image.slope = slope;\n image.windowWidth = windowWidth;\n image.windowCenter = windowCenter;\n image.minPixelValue = minPixelValue;\n image.maxPixelValue = maxPixelValue;\n\n if (image.origPixelData) {\n const pixelData = image.origPixelData;\n\n image.getPixelData = () => pixelData;\n }\n\n // Remove some attributes added by false color mapping\n image.origPixelData = undefined;\n image.colormapId = undefined;\n image.falseColor = undefined;\n };\n}\n\n//\n// Then we need to make sure it will be converted into a colormap object if it's as string.\n\n/**\n * User can pass a colormap or its id as string to some of these public functions.\n * Then we need to make sure it will be converted into a colormap object if it's a string.\n *\n * @param {*} colormap A colormap ID or Object\n * @return {*} The colormap\n */\nfunction ensuresColormap (colormap) {\n if (colormap && (typeof colormap === 'string')) {\n colormap = getColormap(colormap);\n }\n\n return colormap;\n}\n\n/**\n * Restores a false color image to its original version\n *\n * @param {Image} image A Cornerstone Image Object\n * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.\n */\nfunction restoreImage (image) {\n if (image.restore && (typeof image.restore === 'function')) {\n image.restore();\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Convert an image to a false color image\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {Boolean} - Whether or not the image has been converted to a false color image\n */\nfunction convertImageToFalseColorImage (image, colormap) {\n if (image.color && !image.falseColor) {\n throw new Error('Color transforms are not implemented yet');\n }\n\n // User can pass a colormap id or a colormap object\n colormap = ensuresColormap(colormap);\n\n const colormapId = colormap.getId();\n\n // Doesn't do anything if colormapId hasn't changed\n if (image.colormapId === colormapId) {\n // It has already being converted into a false color image\n // Using the colormapId passed as parameter\n return false;\n }\n\n // Restore the image attributes updated when converting to a false color image\n restoreImage(image);\n\n // Convert the image to a false color image\n if (colormapId) {\n const minPixelValue = image.minPixelValue || 0;\n const maxPixelValue = image.maxPixelValue || 255;\n\n image.restore = getRestoreImageMethod(image);\n\n const lookupTable = colormap.createLookupTable();\n\n lookupTable.setTableRange(minPixelValue, maxPixelValue);\n\n // Update the pixel data and render the new image\n pixelDataToFalseColorData(image, lookupTable);\n\n // Update min and max pixel values\n const pixelValues = getPixelValues(image.getPixelData());\n\n image.minPixelValue = pixelValues.minPixelValue;\n image.maxPixelValue = pixelValues.maxPixelValue;\n\n image.windowWidth = 255;\n image.windowCenter = 128;\n\n // Cache the last colormapId used for performance\n // Then it doesn't need to be re-rendered on next\n // Time if the user hasn't updated it\n image.colormapId = colormapId;\n }\n\n // Return `true` to tell the caller that the image has got updated\n return true;\n}\n\n/**\n * Convert the image of a element to a false color image\n *\n * @param {HTMLElement} element The Cornerstone element\n * @param {*} colormap - it can be a colormap object or a colormap id (string)\n *\n * @returns {void}\n */\nfunction convertToFalseColorImage (element, colormap) {\n const enabledElement = getEnabledElement(element);\n\n\n return convertImageToFalseColorImage(enabledElement.image, colormap);\n}\n\nexport { convertImageToFalseColorImage,\n convertToFalseColorImage,\n restoreImage };\n\n\n\n// WEBPACK FOOTER //\n// ./falseColorMapping.js"],"sourceRoot":""} \ No newline at end of file diff --git a/examples/crosshairs/index.html b/examples/crosshairs/index.html index bc1cee7d2..a979f72ec 100755 --- a/examples/crosshairs/index.html +++ b/examples/crosshairs/index.html @@ -88,7 +88,7 @@

imageIds: axialImageIds }; - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.updateImageSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstonenewimage", cornerstoneTools.updateImageSynchronizer); // image enable the dicomImage element cornerstone.enable(axialElement); diff --git a/examples/exampleImageLoader.js b/examples/exampleImageLoader.js index 2917b349c..f31cd252a 100755 --- a/examples/exampleImageLoader.js +++ b/examples/exampleImageLoader.js @@ -79,9 +79,12 @@ image.windowWidth = 770; } - var deferred = $.Deferred(); - deferred.resolve(image); - return deferred; + return { + promise: new Promise((resolve) => { + resolve(image); + }), + cancelFn: undefined + }; } diff --git a/examples/exampleTextImageLoader.js b/examples/exampleTextImageLoader.js index 0a2fac854..a300e376a 100644 --- a/examples/exampleTextImageLoader.js +++ b/examples/exampleTextImageLoader.js @@ -54,9 +54,12 @@ sizeInBytes: width * height }; - var deferred = $.Deferred(); - deferred.resolve(image); - return deferred; + return { + promise: new Promise((resolve) => { + resolve(image); + }), + cancelFn: undefined + }; } // register our imageLoader plugin with cornerstone diff --git a/examples/panZoomSynchronizer/index.html b/examples/panZoomSynchronizer/index.html index e94c22943..15636f66c 100644 --- a/examples/panZoomSynchronizer/index.html +++ b/examples/panZoomSynchronizer/index.html @@ -90,7 +90,7 @@

var imageId = 'example://1'; - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneImageRendered", cornerstoneTools.panZoomSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstoneimagerendered", cornerstoneTools.panZoomSynchronizer); // image enable the dicomImage element and the mouse inputs cornerstone.enable(axialElement1); diff --git a/examples/petctImageIdLoader.js b/examples/petctImageIdLoader.js index bee18a41b..1ff6f5816 100644 --- a/examples/petctImageIdLoader.js +++ b/examples/petctImageIdLoader.js @@ -92,9 +92,12 @@ sizeInBytes: width * height * 2 }; - var deferred = $.Deferred(); - deferred.resolve(image); - return deferred; + return { + promise: new Promise((resolve) => { + resolve(image); + }), + cancelFn: undefined + }; } function getPETImage(imageId) { @@ -131,9 +134,12 @@ sizeInBytes: width * height * 2 }; - var deferred = $.Deferred(); - deferred.resolve(image); - return deferred; + return { + promise: new Promise((resolve) => { + resolve(image); + }), + cancelFn: undefined + }; } diff --git a/examples/referenceLineTool/index.html b/examples/referenceLineTool/index.html index 04157d55b..2d538aa79 100644 --- a/examples/referenceLineTool/index.html +++ b/examples/referenceLineTool/index.html @@ -85,7 +85,7 @@

imageIds: axialImageIds }; - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.updateImageSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstonenewimage", cornerstoneTools.updateImageSynchronizer); // image enable the dicomImage element cornerstone.enable(axialElement); diff --git a/examples/stackImageIndexSynchronizer/index.html b/examples/stackImageIndexSynchronizer/index.html index fdede0b7f..b69b3710c 100644 --- a/examples/stackImageIndexSynchronizer/index.html +++ b/examples/stackImageIndexSynchronizer/index.html @@ -106,7 +106,7 @@

currentImageIdIndex : 0, imageIds: axialImageIds }; - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.stackImageIndexSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstonenewimage", cornerstoneTools.stackImageIndexSynchronizer); // image enable the dicomImage element and the mouse inputs cornerstone.enable(axialElement1); diff --git a/examples/stackImagePositionOffsetSynchronizer/index.html b/examples/stackImagePositionOffsetSynchronizer/index.html index 92a05cdc5..1d8f49029 100644 --- a/examples/stackImagePositionOffsetSynchronizer/index.html +++ b/examples/stackImagePositionOffsetSynchronizer/index.html @@ -110,7 +110,7 @@

var offsets = new Map(); - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.stackImagePositionOffsetSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstonenewimage", cornerstoneTools.stackImagePositionOffsetSynchronizer); // image enable the dicomImage element and the mouse inputs cornerstone.enable(axialElement1); diff --git a/examples/stackImagePositionSynchronizer/index.html b/examples/stackImagePositionSynchronizer/index.html index 57561d672..346b4e24c 100644 --- a/examples/stackImagePositionSynchronizer/index.html +++ b/examples/stackImagePositionSynchronizer/index.html @@ -106,7 +106,7 @@

currentImageIdIndex : 0, imageIds: axialImageIds }; - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneNewImage", cornerstoneTools.stackImagePositionSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstonenewimage", cornerstoneTools.stackImagePositionSynchronizer); // image enable the dicomImage element and the mouse inputs cornerstone.enable(axialElement1); diff --git a/examples/stackScrollSynchronizer/index.html b/examples/stackScrollSynchronizer/index.html index 5813fcdbb..8434aa07e 100644 --- a/examples/stackScrollSynchronizer/index.html +++ b/examples/stackScrollSynchronizer/index.html @@ -197,7 +197,7 @@

}); // Listener for example purposes to demonstrate scroll direction - $(document).on('CornerstoneStackScroll', function (e, eventData) { + $(document).on('cornerstonestackscroll', function (e, eventData) { // Manually display direction if (eventData.direction === 0) { return; diff --git a/examples/timeSeries/index.html b/examples/timeSeries/index.html index 0aef660c6..833a5afd1 100644 --- a/examples/timeSeries/index.html +++ b/examples/timeSeries/index.html @@ -88,7 +88,8 @@

$('#mrbottomleft').text("WW/WL:" + Math.round(e.detail.viewport.voi.windowWidth) + "/" + Math.round(e.detail.viewport.voi.windowCenter)); $('#zoomText').text("Zoom:" + e.detail.viewport.scale.toFixed(2)); }; - element.addEventListener("CornerstoneViewportUpdated", onViewportUpdated, false); + + element.addEventListener("cornerstoneimagerendered", onViewportUpdated); function onNewImage(e) { var timeSeriesToolData = cornerstoneTools.getToolState(element, 'timeSeries'); @@ -173,18 +174,15 @@

}); - function onMeasurementAdded(e, ed) { + function onMeasurementAdded(e) { + var eventData = e.detail; $('#data').empty(); - ed.measurement.lineSample.samples.forEach(function(sample) { + eventData.measurement.lineSample.samples.forEach(function(sample) { console.log(sample); $('#data').append('
  • ' + sample + '
  • '); }); } - - $(cornerstoneTools.MeasurementManager).on('CornerstoneMeasurementAdded',onMeasurementAdded); - - - + cornerstone.events.addEventListener('cornerstonetoolsmeasurementadded', onMeasurementAdded); diff --git a/examples/wwwcSynchronizer/index.html b/examples/wwwcSynchronizer/index.html index 6884e12ab..5859821e3 100644 --- a/examples/wwwcSynchronizer/index.html +++ b/examples/wwwcSynchronizer/index.html @@ -105,7 +105,7 @@

    currentImageIdIndex : 0, imageIds: axialImageIds }; - var synchronizer = new cornerstoneTools.Synchronizer("CornerstoneImageRendered", cornerstoneTools.wwwcSynchronizer); + var synchronizer = new cornerstoneTools.Synchronizer("cornerstoneimagerendered", cornerstoneTools.wwwcSynchronizer); // image enable the dicomImage element and the mouse inputs cornerstone.enable(axialElement1); diff --git a/package.json b/package.json index 5ae46c313..f6592de45 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cornerstone-tools", - "version": "1.1.2", + "version": "2.0.0", "description": "Medical imaging tools for the Cornerstone library", "main": "./dist/cornerstoneTools.min.js", "keywords": [ @@ -48,10 +48,10 @@ "babel-loader": "^7.1.2", "babel-preset-env": "^1.6.1", "chai": "^4.1.2", - "cornerstone-core": "^1.1.3", + "cornerstone-core": "^2.0.0", "coveralls": "^3.0.0", "docdash": "^0.4.0", - "eslint": "^4.9.0", + "eslint": "^4.13.1", "eslint-loader": "^1.9.0", "eslint-plugin-import": "^2.8.0", "gitbook-plugin-edit-link": "^2.0.2", @@ -59,21 +59,20 @@ "hammerjs": "^2.0.8", "istanbul": "^0.4.5", "istanbul-instrumenter-loader": "^3.0.0", - "jquery": "^3.2.1", "jsdoc": "^3.5.5", "karma": "^1.7.1", "karma-chrome-launcher": "^2.2.0", "karma-coverage": "^1.1.1", - "karma-firefox-launcher": "^1.0.1", + "karma-firefox-launcher": "^1.1.0", "karma-mocha": "^1.3.0", "karma-phantomjs-launcher": "^1.0.4", - "karma-webpack": "^2.0.5", + "karma-webpack": "^2.0.6", "lodash": "^4.17.4", "mocha": "^4.0.1", "opn-cli": "^3.1.0", - "phantomjs-prebuilt": "^2.1.15", + "phantomjs-prebuilt": "^2.1.16", "shx": "^0.2.2", - "webpack": "^3.8.1" + "webpack": "^3.10.0" }, "dependencies": { "cornerstone-math": "^0.1.6" diff --git a/src/enabledElementTools.js b/src/enabledElementTools.js new file mode 100644 index 000000000..4a5f86ee9 --- /dev/null +++ b/src/enabledElementTools.js @@ -0,0 +1,41 @@ +const elementToolOptions = {}; + +function getToolOptions (toolType, element) { + if (!elementToolOptions[toolType]) { + return {}; + } + + const toolOptions = elementToolOptions[toolType]; + const optionsObject = toolOptions.find((toolOptionObject) => toolOptionObject.element === element); + + if (!optionsObject) { + return {}; + } + + return optionsObject.options; +} + +function setToolOptions (toolType, element, options) { + if (!elementToolOptions[toolType]) { + elementToolOptions[toolType] = [{ + element, + options + }]; + + return; + } + + const toolOptions = elementToolOptions[toolType]; + const index = toolOptions.findIndex((toolOptionObject) => toolOptionObject.element === element); + + if (index === -1) { + elementToolOptions[toolType].push({ + element, + options + }); + } else { + elementToolOptions[toolType][index].options = options; + } +} + +export { getToolOptions, setToolOptions }; diff --git a/src/events.js b/src/events.js new file mode 100644 index 000000000..c52eee263 --- /dev/null +++ b/src/events.js @@ -0,0 +1,49 @@ +const EVENTS = { + // Events from Cornerstone Core + IMAGE_RENDERED: 'cornerstoneimagerendered', + NEW_IMAGE: 'cornerstonenewimage', + IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved', + ELEMENT_DISABLED: 'cornerstoneelementdisabled', + + // Mouse events + MOUSE_DOWN: 'cornerstonetoolsmousedown', + MOUSE_UP: 'cornerstonetoolsmouseup', + MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate', + MOUSE_DRAG: 'cornerstonetoolsmousedrag', + MOUSE_MOVE: 'cornerstonetoolsmousemove', + MOUSE_CLICK: 'cornerstonetoolsmouseclick', + MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick', + MOUSE_WHEEL: 'cornerstonetoolsmousewheel', + + // Touch events + TOUCH_START: 'cornerstonetoolstouchstart', + TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive', + TOUCH_END: 'cornerstonetoolstouchend', + TOUCH_DRAG: 'cornerstonetoolstouchdrag', + TOUCH_DRAG_END: 'cornerstonetoolstouchdragend', + TOUCH_PINCH: 'cornerstonetoolstouchpinch', + TOUCH_ROTATE: 'cornerstonetoolstouchrotate', + TOUCH_PRESS: 'cornerstonetoolstouchpress', + TAP: 'cornerstonetoolstap', + DOUBLE_TAP: 'cornerstonetoolsdoubletap', + MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart', + MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive', + MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag', + + // Keyboard events + KEY_DOWN: 'cornerstonetoolskeydown', + KEY_UP: 'cornerstonetoolskeyup', + KEY_PRESS: 'cornerstonetoolskeypress', + + // Measurement / tool events + MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded', + MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified', + MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved', + TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated', + CLIP_STOPPED: 'cornerstonetoolsclipstopped', + STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed + + LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated' +}; + +export default EVENTS; diff --git a/src/externalModules.js b/src/externalModules.js index c6ab46b22..1aa3e11f8 100644 --- a/src/externalModules.js +++ b/src/externalModules.js @@ -1,6 +1,5 @@ let cornerstone = window.cornerstone; let cornerstoneMath = window.cornerstoneMath; -let $ = window.$; let Hammer = window.Hammer; export default { @@ -16,12 +15,6 @@ export default { get cornerstoneMath () { return cornerstoneMath; }, - set $ (module) { - $ = module; - }, - get $ () { - return $; - }, set Hammer (module) { Hammer = module; }, diff --git a/src/imageTools/angleTool.js b/src/imageTools/angleTool.js index 338fccec8..11e2048d2 100755 --- a/src/imageTools/angleTool.js +++ b/src/imageTools/angleTool.js @@ -72,7 +72,8 @@ function pointNearTool (element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); diff --git a/src/imageTools/arrowAnnotate.js b/src/imageTools/arrowAnnotate.js index 12438844d..156845bf3 100644 --- a/src/imageTools/arrowAnnotate.js +++ b/src/imageTools/arrowAnnotate.js @@ -1,4 +1,5 @@ /* eslint no-alert:0 */ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import mouseButtonTool from './mouseButtonTool.js'; import touchTool from './touchTool.js'; @@ -14,6 +15,7 @@ import anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import pointInsideBoundingBox from '../util/pointInsideBoundingBox.js'; import { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js'; +import { getToolOptions } from '../enabledElementTools.js'; const toolType = 'arrowAnnotate'; @@ -39,44 +41,41 @@ const configuration = { // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement (mouseEventData) { + const element = mouseEventData.element; const measurementData = createNewMeasurement(mouseEventData); const cornerstone = external.cornerstone; - const eventData = { - mouseButtonMask: mouseEventData.which - }; - function doneChangingTextCallback (text) { if (text === null) { - removeToolState(mouseEventData.element, toolType, measurementData); + removeToolState(element, toolType, measurementData); } else { measurementData.text = text; } measurementData.active = false; - cornerstone.updateImage(mouseEventData.element); + cornerstone.updateImage(element); - external.$(mouseEventData.element).on('CornerstoneToolsMouseMove', eventData, arrowAnnotate.mouseMoveCallback); - external.$(mouseEventData.element).on('CornerstoneToolsMouseDown', eventData, arrowAnnotate.mouseDownCallback); - external.$(mouseEventData.element).on('CornerstoneToolsMouseDownActivate', eventData, arrowAnnotate.mouseDownActivateCallback); - external.$(mouseEventData.element).on('CornerstoneToolsMouseDoubleClick', eventData, arrowAnnotate.mouseDoubleClickCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback); + element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback); } // Associate this data with this imageId so we can render it and manipulate it - addToolState(mouseEventData.element, toolType, measurementData); + addToolState(element, toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - external.$(mouseEventData.element).off('CornerstoneToolsMouseMove', arrowAnnotate.mouseMoveCallback); - external.$(mouseEventData.element).off('CornerstoneToolsMouseDown', arrowAnnotate.mouseDownCallback); - external.$(mouseEventData.element).off('CornerstoneToolsMouseDownActivate', arrowAnnotate.mouseDownActivateCallback); - external.$(mouseEventData.element).off('CornerstoneToolsMouseDoubleClick', arrowAnnotate.mouseDoubleClickCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback); + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback); - cornerstone.updateImage(mouseEventData.element); + cornerstone.updateImage(element); moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () { if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) { // Delete the measurement - removeToolState(mouseEventData.element, toolType, measurementData); + removeToolState(element, toolType, measurementData); } const config = arrowAnnotate.getConfiguration(); @@ -85,25 +84,25 @@ function addNewMeasurement (mouseEventData) { config.getTextCallback(doneChangingTextCallback); } - cornerstone.updateImage(mouseEventData.element); + cornerstone.updateImage(element); }); } -function createNewMeasurement (mouseEventData) { +function createNewMeasurement (eventData) { // Create the measurement data for this tool with the end handle activated const measurementData = { visible: true, active: true, handles: { start: { - x: mouseEventData.currentPoints.image.x, - y: mouseEventData.currentPoints.image.y, + x: eventData.currentPoints.image.x, + y: eventData.currentPoints.image.y, highlight: true, active: false }, end: { - x: mouseEventData.currentPoints.image.x, - y: mouseEventData.currentPoints.image.y, + x: eventData.currentPoints.image.x, + y: eventData.currentPoints.image.y, highlight: true, active: false }, @@ -137,7 +136,9 @@ function pointNearTool (element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); @@ -312,15 +313,15 @@ function addNewMeasurementTouch (touchEventData) { measurementData.active = false; cornerstone.updateImage(element); - external.$(element).on('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.addEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback); } addToolState(element, toolType, measurementData); - external.$(element).off('CornerstoneToolsTouchPress', arrowAnnotateTouch.pressCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback); cornerstone.updateImage(element); moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () { @@ -339,11 +340,17 @@ function addNewMeasurementTouch (touchEventData) { }); } -function doubleClickCallback (e, eventData) { +function doubleClickCallback (e) { + const eventData = e.detail; const element = eventData.element; const cornerstone = external.cornerstone; + const options = getToolOptions(toolType, element); let data; + if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + return; + } + function doneChangingTextCallback (data, updatedText, deleteTool) { if (deleteTool === true) { removeToolState(element, toolType, data); @@ -355,10 +362,6 @@ function doubleClickCallback (e, eventData) { cornerstone.updateImage(element); } - if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - return; - } - const config = arrowAnnotate.getConfiguration(); const coords = eventData.currentPoints.canvas; @@ -385,7 +388,8 @@ function doubleClickCallback (e, eventData) { } } -function pressCallback (e, eventData) { +function pressCallback (e) { + const eventData = e.detail; const element = eventData.element; const cornerstone = external.cornerstone; let data; @@ -401,13 +405,9 @@ function pressCallback (e, eventData) { data.active = false; cornerstone.updateImage(element); - external.$(element).on('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); - } - - if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - return; + element.addEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback); } const config = arrowAnnotate.getConfiguration(); @@ -421,9 +421,9 @@ function pressCallback (e, eventData) { } if (eventData.handlePressed) { - external.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback); @@ -440,9 +440,9 @@ function pressCallback (e, eventData) { data.active = true; cornerstone.updateImage(element); - external.$(element).off('CornerstoneToolsTouchStart', arrowAnnotateTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', arrowAnnotateTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', arrowAnnotateTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); @@ -453,7 +453,8 @@ function pressCallback (e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } const arrowAnnotate = mouseButtonTool({ diff --git a/src/imageTools/crosshairs.js b/src/imageTools/crosshairs.js index c84b66c41..0ebc40a3d 100644 --- a/src/imageTools/crosshairs.js +++ b/src/imageTools/crosshairs.js @@ -1,13 +1,17 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import loadHandlerManager from '../stateManagement/loadHandlerManager.js'; import { addToolState, getToolState, clearToolState } from '../stateManagement/toolState.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import { imagePointToPatientPoint } from '../util/pointProjector.js'; import convertToVector3 from '../util/convertToVector3.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; const toolType = 'crosshairs'; -function chooseLocation (e, eventData) { +function chooseLocation (e) { + const eventData = e.detail; + e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events // If we have no toolData for this element, return immediately as there is nothing to do @@ -109,47 +113,54 @@ function chooseLocation (e, eventData) { }); } -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - chooseLocation(e, eventData); +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + chooseLocation(e); - return false; // False = cases jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } -function mouseDragCallback (e, eventData) { - chooseLocation(e, eventData); +function mouseDragCallback (e) { + chooseLocation(e); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } function enable (element, mouseButtonMask, synchronizationContext) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - // Clear any currently existing toolData + // Clear any currently existing toolData clearToolState(element, toolType); addToolState(element, toolType, { synchronizationContext }); - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); } // Disables the reference line tool for the given element function disable (element) { - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); } // Module/private exports @@ -160,23 +171,30 @@ const crosshairs = { disable }; -function dragEndCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsTouchDrag', dragCallback); - external.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback); +function dragEndCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback); } -function dragStartCallback (e, eventData) { - external.$(eventData.element).on('CornerstoneToolsTouchDrag', dragCallback); - external.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback); - chooseLocation(e, eventData); +function dragStartCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback); + element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback); + chooseLocation(e); return false; } -function dragCallback (e, eventData) { - chooseLocation(e, eventData); +function dragCallback (e) { + chooseLocation(e); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } function enableTouch (element, synchronizationContext) { @@ -187,14 +205,14 @@ function enableTouch (element, synchronizationContext) { synchronizationContext }); - external.$(element).off('CornerstoneToolsTouchStart', dragStartCallback); + element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback); - external.$(element).on('CornerstoneToolsTouchStart', dragStartCallback); + element.addEventListener(EVENTS.TOUCH_START, dragStartCallback); } // Disables the reference line tool for the given element function disableTouch (element) { - external.$(element).off('CornerstoneToolsTouchStart', dragStartCallback); + element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback); } const crosshairsTouch = { diff --git a/src/imageTools/displayTool.js b/src/imageTools/displayTool.js index 35616476a..b52751eab 100644 --- a/src/imageTools/displayTool.js +++ b/src/imageTools/displayTool.js @@ -1,22 +1,17 @@ + +import EVENTS from '../events.js'; import external from '../externalModules.js'; export default function (onImageRendered) { let configuration = {}; - // Note: This is to maintain compatibility for developers that have - // Built on top of mouseButtonRectangleTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function customEventOnImageRendered (e) { - onImageRendered(e, e.detail); - } - - const toolInterface = { + return { disable (element) { - element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); }, enable (element) { - element.removeEventListener('cornerstoneimagerendered', customEventOnImageRendered); - element.addEventListener('cornerstoneimagerendered', customEventOnImageRendered); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); external.cornerstone.updateImage(element); }, getConfiguration () { @@ -26,6 +21,4 @@ export default function (onImageRendered) { configuration = config; } }; - - return toolInterface; } diff --git a/src/imageTools/doubleTapTool.js b/src/imageTools/doubleTapTool.js index ab717d897..3e8a8626a 100644 --- a/src/imageTools/doubleTapTool.js +++ b/src/imageTools/doubleTapTool.js @@ -1,21 +1,19 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; export default function (doubleTapCallback) { return { activate (element) { - external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); - const eventData = {}; - - external.$(element).on('CornerstoneToolsDoubleTap', eventData, doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback); + element.addEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback); }, disable (element) { - external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback); }, enable (element) { - external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback); }, deactivate (element) { - external.$(element).off('CornerstoneToolsDoubleTap', doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback); } }; } diff --git a/src/imageTools/doubleTapZoom.js b/src/imageTools/doubleTapZoom.js index 875399404..b97ec731c 100644 --- a/src/imageTools/doubleTapZoom.js +++ b/src/imageTools/doubleTapZoom.js @@ -5,10 +5,13 @@ function fitToWindowStrategy (eventData) { external.cornerstone.fitToWindow(eventData.element); } -function doubleTapCallback (e, eventData) { +function doubleTapCallback (e) { + const eventData = e.detail; + doubleTapZoom.strategy(eventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } const doubleTapZoom = doubleTapTool(doubleTapCallback); diff --git a/src/imageTools/dragProbe.js b/src/imageTools/dragProbe.js index d822dac95..fede73a1a 100644 --- a/src/imageTools/dragProbe.js +++ b/src/imageTools/dragProbe.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import simpleMouseButtonTool from './simpleMouseButtonTool.js'; import touchDragTool from './touchDragTool.js'; @@ -7,6 +8,9 @@ import drawTextBox from '../util/drawTextBox.js'; import getRGBPixels from '../util/getRGBPixels.js'; import calculateSUV from '../util/calculateSUV.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { getToolOptions } from '../enabledElementTools.js'; + +const toolType = 'dragProbe'; let dragEventData; @@ -179,27 +183,31 @@ function minimalStrategy (eventData) { context.restore(); } -function mouseUpCallback (e, eventData) { +function mouseUpCallback (e) { + const eventData = e.detail; const element = eventData.element; - element.removeEventListener('cornerstoneimagerendered', imageRenderedCallback); - external.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); external.cornerstone.updateImage(eventData.element); } -function mouseDownCallback (e, eventData) { +function mouseDownCallback (e) { + const eventData = e.detail; const element = eventData.element; + const options = getToolOptions(toolType, element); - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - element.addEventListener('cornerstoneimagerendered', imageRenderedCallback); - external.$(element).on('CornerstoneToolsMouseDrag', dragCallback); - external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback); + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); dragProbe.strategy(eventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -213,16 +221,18 @@ function imageRenderedCallback () { // The strategy can't be execute at this moment because the image is rendered asynchronously // (requestAnimationFrame). Then the eventData that contains all information needed is being // Cached and the strategy will be executed once cornerstoneimagerendered is triggered. -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; const element = eventData.element; dragEventData = eventData; external.cornerstone.updateImage(element); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -const dragProbe = simpleMouseButtonTool(mouseDownCallback); +const dragProbe = simpleMouseButtonTool(mouseDownCallback, toolType); dragProbe.strategies = { default: defaultStrategy, diff --git a/src/imageTools/ellipticalRoi.js b/src/imageTools/ellipticalRoi.js index c16dee25f..52a4547b5 100755 --- a/src/imageTools/ellipticalRoi.js +++ b/src/imageTools/ellipticalRoi.js @@ -95,7 +95,9 @@ function numberWithCommas (x) { return parts.join('.'); } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); diff --git a/src/imageTools/freehand.js b/src/imageTools/freehand.js index e449c44b1..daff6baf3 100755 --- a/src/imageTools/freehand.js +++ b/src/imageTools/freehand.js @@ -1,9 +1,11 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import toolStyle from '../stateManagement/toolStyle.js'; import toolColors from '../stateManagement/toolColors.js'; import drawHandles from '../manipulators/drawHandles.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import { addToolState, getToolState } from '../stateManagement/toolState.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; const toolType = 'freehand'; let configuration = { @@ -115,8 +117,11 @@ function pointNearHandleAllTools (eventData) { // On next click, add another point -- continuously // On each click, if it intersects with a current point, end drawing loop -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); // Check if drawing is finished const toolData = getToolState(eventData.element, toolType); @@ -134,7 +139,8 @@ function mouseUpCallback (e, eventData) { external.cornerstone.updateImage(eventData.element); } -function mouseMoveCallback (e, eventData) { +function mouseMoveCallback (e) { + const eventData = e.detail; const toolData = getToolState(eventData.element, toolType); if (!toolData) { @@ -192,8 +198,10 @@ function mouseMoveCallback (e, eventData) { } function startDrawing (eventData) { - external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); + const element = eventData.element; + + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); const measurementData = { visible: true, @@ -214,6 +222,7 @@ function startDrawing (eventData) { } function endDrawing (eventData, handleNearby) { + const element = eventData.element; const toolData = getToolState(eventData.element, toolType); if (!toolData) { @@ -244,13 +253,17 @@ function endDrawing (eventData, handleNearby) { config.currentHandle = 0; config.currentTool = -1; - external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); external.cornerstone.updateImage(eventData.element); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { const toolData = getToolState(eventData.element, toolType); let handleNearby, toolIndex; @@ -272,8 +285,8 @@ function mouseDownCallback (e, eventData) { toolIndex = nearby.toolIndex; // This means the user is trying to modify a point if (handleNearby !== undefined) { - external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); config.modifying = true; config.currentHandle = handleNearby; config.currentTool = toolIndex; @@ -293,7 +306,8 @@ function mouseDownCallback (e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -382,51 +396,50 @@ function onImageRendered (e) { context.restore(); } } + // /////// END IMAGE RENDERING /////// function enable (element) { - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); external.cornerstone.updateImage(element); } // Disables the reference line tool for the given element function disable (element) { - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); external.cornerstone.updateImage(element); } // Visible and interactive function activate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - external.$(element).off('CornerstoneToolsMouseDown', eventData, mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); external.cornerstone.updateImage(element); } // Visible, but not interactive function deactivate (element) { - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); external.cornerstone.updateImage(element); } diff --git a/src/imageTools/highlight.js b/src/imageTools/highlight.js index 5ce291569..3d6974e7d 100755 --- a/src/imageTools/highlight.js +++ b/src/imageTools/highlight.js @@ -82,7 +82,9 @@ function pointNearTool (element, data, coords) { // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); diff --git a/src/imageTools/imageStats.js b/src/imageTools/imageStats.js index 3961e1f57..90592c9bf 100644 --- a/src/imageTools/imageStats.js +++ b/src/imageTools/imageStats.js @@ -1,7 +1,8 @@ import displayTool from './displayTool.js'; import drawTextBox from '../util/drawTextBox.js'; -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; const image = eventData.image; const stats = image.stats; diff --git a/src/imageTools/keyboardTool.js b/src/imageTools/keyboardTool.js index 279c52e12..2c35b49fb 100644 --- a/src/imageTools/keyboardTool.js +++ b/src/imageTools/keyboardTool.js @@ -1,21 +1,21 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; export default function (keyDownCallback) { let configuration = {}; - const toolInterface = { + return { activate (element) { - external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); - external.$(element).on('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback); + element.addEventListener(EVENTS.KEY_DOWN, keyDownCallback); }, disable (element) { - external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback); }, enable (element) { - external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback); }, deactivate (element) { - external.$(element).off('CornerstoneToolsKeyDown', keyDownCallback); + element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback); }, getConfiguration () { return configuration; @@ -24,7 +24,4 @@ export default function (keyDownCallback) { configuration = config; } }; - - - return toolInterface; } diff --git a/src/imageTools/length.js b/src/imageTools/length.js index a27d90d53..dc62c09c3 100755 --- a/src/imageTools/length.js +++ b/src/imageTools/length.js @@ -56,7 +56,9 @@ function pointNearTool (element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); diff --git a/src/imageTools/magnify.js b/src/imageTools/magnify.js index 8b8553181..db52d3d49 100755 --- a/src/imageTools/magnify.js +++ b/src/imageTools/magnify.js @@ -1,7 +1,11 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import touchDragTool from './touchDragTool.js'; import { getBrowserInfo } from '../util/getMaxSimultaneousRequests.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; + +const toolType = 'magnify'; let configuration = { magnifySize: 100, @@ -13,36 +17,43 @@ let browserName; let currentPoints; /** Remove the magnifying glass when the mouse event ends */ -function mouseUpCallback (e, eventData) { +function mouseUpCallback (e) { + const eventData = e.detail; const element = eventData.element; - external.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); + element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback); hideTool(eventData); } function hideTool (eventData) { - external.$(eventData.element).find('.magnifyTool').hide(); + const element = eventData.element; + + element.querySelector('.magnifyTool').style.display = 'none'; + // Re-enable the mouse cursor document.body.style.cursor = 'default'; } /** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */ -function mouseDownCallback (e, eventData) { +function mouseDownCallback (e) { + const eventData = e.detail; const element = eventData.element; + const options = getToolOptions(toolType, element); - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(element).on('CornerstoneToolsMouseDrag', eventData, dragCallback); - external.$(element).on('CornerstoneToolsMouseUp', eventData, mouseUpCallback); - external.$(element).on('CornerstoneToolsMouseClick', eventData, mouseUpCallback); + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); currentPoints = eventData.currentPoints; - element.addEventListener('cornerstonenewimage', newImageCallback); + element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback); drawMagnificationTool(eventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -53,31 +64,37 @@ function newImageCallback (e) { drawMagnificationTool(eventData); } -function dragEndCallback (e, eventData) { +function dragEndCallback (e) { + const eventData = e.detail; const element = eventData.element; - external.$(eventData.element).off('CornerstoneToolsDragEnd', dragEndCallback); - external.$(eventData.element).off('CornerstoneToolsTouchEnd', dragEndCallback); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback); + element.removeEventListener(EVENTS.TOUCH_END, dragEndCallback); + element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback); hideTool(eventData); } /** Drag callback is triggered by both the touch and mouse magnify tools */ -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; + const element = eventData.element; + currentPoints = eventData.currentPoints; drawMagnificationTool(eventData); if (eventData.isTouchEvent === true) { - external.$(eventData.element).on('CornerstoneToolsDragEnd', dragEndCallback); - external.$(eventData.element).on('CornerstoneToolsTouchEnd', dragEndCallback); + element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback); + element.addEventListener(EVENTS.TOUCH_END, dragEndCallback); } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } /** Draws the magnifying glass */ function drawMagnificationTool (eventData) { - const magnifyCanvas = external.$(eventData.element).find('.magnifyTool').get(0); + const element = eventData.element; + const magnifyCanvas = element.querySelector('.magnifyTool'); if (!magnifyCanvas) { createMagnificationCanvas(eventData.element); @@ -90,7 +107,7 @@ function drawMagnificationTool (eventData) { // The 'not' magnifyTool class here is necessary because cornerstone places // No classes of it's own on the canvas we want to select - const canvas = external.$(eventData.element).find('canvas').not('.magnifyTool').get(0); + const canvas = element.querySelector('canvas:not(.magnifyTool)'); const context = canvas.getContext('2d'); context.setTransform(1, 0, 0, 1, 0, 0); @@ -156,7 +173,7 @@ function drawMagnificationTool (eventData) { /** Creates the magnifying glass canvas */ function createMagnificationCanvas (element) { // If the magnifying glass canvas doesn't already exist - if (external.$(element).find('.magnifyTool').length === 0) { + if (element.querySelector('.magnifyTool') === null) { // Create a canvas and append it as a child to the element const magnifyCanvas = document.createElement('canvas'); // The magnifyTool class is used to find the canvas later on @@ -176,12 +193,16 @@ function createMagnificationCanvas (element) { /** Find the magnifying glass canvas and remove it */ function removeMagnificationCanvas (element) { - external.$(element).find('.magnifyTool').remove(); + const magnifyCanvas = element.querySelector('.magnifyTool'); + + if (magnifyCanvas) { + element.removeChild(magnifyCanvas); + } } // --- Mouse tool activate / disable --- // function disable (element) { - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); removeMagnificationCanvas(element); } @@ -197,13 +218,11 @@ function enable (element) { } function activate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); createMagnificationCanvas(element); } diff --git a/src/imageTools/mouseButtonRectangleTool.js b/src/imageTools/mouseButtonRectangleTool.js index cb354451e..86b05b261 100644 --- a/src/imageTools/mouseButtonRectangleTool.js +++ b/src/imageTools/mouseButtonRectangleTool.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import toolCoordinates from '../stateManagement/toolCoordinates.js'; import getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js'; @@ -7,10 +8,14 @@ import moveAllHandles from '../manipulators/moveAllHandles.js'; import anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; export default function (mouseToolInterface, preventHandleOutsideImage) { + const toolType = mouseToolInterface.toolType; + // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement (mouseEventData) { + const element = mouseEventData.element; const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); // Prevent adding new measurement if tool returns nill @@ -19,24 +24,28 @@ export default function (mouseToolInterface, preventHandleOutsideImage) { } // Associate this data with this imageId so we can render it and manipulate it - addToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData); + addToolState(mouseEventData.element, toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - external.$(mouseEventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - moveHandle(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () { + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () { measurementData.active = false; if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) { // Delete the measurement - removeToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData); + removeToolState(mouseEventData.element, toolType, measurementData); } - external.$(mouseEventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); }, preventHandleOutsideImage); } - function mouseDownActivateCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { + function mouseDownActivateCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { addNewMeasurement(eventData); return false; // False = cases jquery to preventDefault() and stopPropagation() this event @@ -46,15 +55,13 @@ export default function (mouseToolInterface, preventHandleOutsideImage) { // /////// BEGIN DEACTIVE TOOL /////// - function mouseMoveCallback (e, eventData) { + function mouseMoveCallback (e) { + const eventData = e.detail; + toolCoordinates.setCoords(eventData); - // If a mouse button is down, do nothing - if (eventData.which !== 0) { - return; - } // If we have no tool data for this element, do nothing - const toolData = getToolState(eventData.element, mouseToolInterface.toolType); + const toolData = getToolState(eventData.element, toolType); if (toolData === undefined) { return; @@ -85,132 +92,126 @@ export default function (mouseToolInterface, preventHandleOutsideImage) { } } - function mouseDownCallback (e, eventData) { + function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; const cornerstone = external.cornerstone; let data; + const options = getToolOptions(toolType, element); + + if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + return; + } function handleDoneMove () { data.active = false; if (anyHandlesOutsideImage(eventData, data.handles)) { // Delete the measurement - removeToolState(eventData.element, mouseToolInterface.toolType, data); + removeToolState(eventData.element, toolType, data); } cornerstone.updateImage(eventData.element); - external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); } - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - const coords = eventData.startPoints.canvas; - const toolData = getToolState(e.currentTarget, mouseToolInterface.toolType); + const coords = eventData.startPoints.canvas; + const toolData = getToolState(e.currentTarget, toolType); - let i; + let i; - // Now check to see if there is a handle we can move - const distanceSq = 25; + // Now check to see if there is a handle we can move + const distanceSq = 25; - if (toolData !== undefined) { - for (i = 0; i < toolData.data.length; i++) { - data = toolData.data[i]; - const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq); + if (toolData !== undefined) { + for (i = 0; i < toolData.data.length; i++) { + data = toolData.data[i]; + const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq); - if (handle !== undefined) { - external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - data.active = true; - moveHandle(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage); - e.stopImmediatePropagation(); + if (handle !== undefined) { + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + data.active = true; + moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage); + e.stopImmediatePropagation(); - return false; - } + return false; } } + } + + // Now check to see if there is a line we can move + // Now check to see if we have a tool that we can move + const opt = { + deleteIfHandleOutsideImage: true, + preventHandleOutsideImage + }; + + if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) { + for (i = 0; i < toolData.data.length; i++) { + data = toolData.data[i]; + if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) { + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + e.stopImmediatePropagation(); - // Now check to see if there is a line we can move - // Now check to see if we have a tool that we can move - const options = { - deleteIfHandleOutsideImage: true, - preventHandleOutsideImage - }; - - if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) { - for (i = 0; i < toolData.data.length; i++) { - data = toolData.data[i]; - if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) { - external.$(eventData.element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - moveAllHandles(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove); - external.$(eventData.element).on('CornerstoneToolsMouseMove', mouseMoveCallback); - e.stopImmediatePropagation(); - - return false; - } + return false; } } } } // /////// END DEACTIVE TOOL /////// - // Note: This is to maintain compatibility for developers that have - // Built on top of mouseButtonRectangleTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function onImageRendered (e) { - mouseToolInterface.onImageRendered(e, e.detail); - } - // Not visible, not interactive function disable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); external.cornerstone.updateImage(element); } // Visible but not interactive function enable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); external.cornerstone.updateImage(element); } // Visible, interactive and can create function activate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); external.cornerstone.updateImage(element); } // Visible, interactive function deactivate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); external.cornerstone.updateImage(element); } diff --git a/src/imageTools/mouseButtonTool.js b/src/imageTools/mouseButtonTool.js index 974b4cb76..43306ffcf 100755 --- a/src/imageTools/mouseButtonTool.js +++ b/src/imageTools/mouseButtonTool.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import toolCoordinates from '../stateManagement/toolCoordinates.js'; import getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js'; @@ -9,101 +10,42 @@ import anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js'; import triggerEvent from '../util/triggerEvent.js'; +import { getToolOptions, setToolOptions } from '../enabledElementTools.js'; export default function (mouseToolInterface) { let configuration = {}; + const toolType = mouseToolInterface.toolType; - // /////// BEGIN ACTIVE TOOL /////// - function addNewMeasurement (mouseEventData) { - const cornerstone = external.cornerstone; - const element = mouseEventData.element; - - const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); + function mouseDownActivateCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); - if (!measurementData) { + if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { return; } - const eventData = { - mouseButtonMask: mouseEventData.which - }; - - // Associate this data with this imageId so we can render it and manipulate it - addToolState(mouseEventData.element, mouseToolInterface.toolType, measurementData); - - // Since we are dragging to another place to drop the end point, we can just activate - // The end point and let the moveHandle move it for us. - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); - - if (mouseToolInterface.mouseDoubleClickCallback) { - external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); - } - - cornerstone.updateImage(element); - - let handleMover; - - if (Object.keys(measurementData.handles).length === 1) { - handleMover = moveHandle; + if (mouseToolInterface.addNewMeasurement) { + mouseToolInterface.addNewMeasurement(eventData); } else { - handleMover = moveNewHandle; + addNewMeasurement(eventData); } - let preventHandleOutsideImage; - - if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) { - preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage; - } else { - preventHandleOutsideImage = false; - } - - handleMover(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () { - measurementData.active = false; - measurementData.invalidated = true; - if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) { - // Delete the measurement - removeToolState(element, mouseToolInterface.toolType, measurementData); - } - - external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); - - if (mouseToolInterface.mouseDoubleClickCallback) { - external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); - } - - cornerstone.updateImage(element); - }, preventHandleOutsideImage); - } - - function mouseDownActivateCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - if (mouseToolInterface.addNewMeasurement) { - mouseToolInterface.addNewMeasurement(eventData); - } else { - addNewMeasurement(eventData); - } - - return false; // False = causes jquery to preventDefault() and stopPropagation() this event - } + e.preventDefault(); + e.stopPropagation(); } // /////// END ACTIVE TOOL /////// // /////// BEGIN DEACTIVE TOOL /////// - function mouseMoveCallback (e, eventData) { + function mouseMoveCallback (e) { + const eventData = e.detail; + toolCoordinates.setCoords(eventData); - // If a mouse button is down, do nothing - if (eventData.which !== 0) { - return; - } // If we have no tool data for this element, do nothing - const toolData = getToolState(eventData.element, mouseToolInterface.toolType); + const toolData = getToolState(eventData.element, toolType); if (!toolData) { return; @@ -123,7 +65,8 @@ export default function (mouseToolInterface) { imageNeedsUpdate = true; } - if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) { + if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) || + (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) { data.active = !data.active; imageNeedsUpdate = true; } @@ -135,27 +78,29 @@ export default function (mouseToolInterface) { } } - function mouseDownCallback (e, eventData) { + function mouseDownCallback (e) { + const eventData = e.detail; let data; const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + return; + } function handleDoneMove () { data.invalidated = true; if (anyHandlesOutsideImage(eventData, data.handles)) { // Delete the measurement - removeToolState(element, mouseToolInterface.toolType, data); + removeToolState(element, toolType, data); } external.cornerstone.updateImage(element); - external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - } - - if (!isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - return; + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove); } const coords = eventData.startPoints.canvas; - const toolData = getToolState(e.currentTarget, mouseToolInterface.toolType); + const toolData = getToolState(e.currentTarget, toolType); if (!toolData) { return; @@ -179,12 +124,14 @@ export default function (mouseToolInterface) { const handle = getHandleNearImagePoint(element, data.handles, coords, distance); if (handle) { - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); data.active = true; - moveHandle(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage); + moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage); e.stopImmediatePropagation(); + e.stopPropagation(); + e.preventDefault(); - return false; + return; } } @@ -194,7 +141,7 @@ export default function (mouseToolInterface) { return; } - const options = mouseToolInterface.options || { + const opt = mouseToolInterface.options || { deleteIfHandleOutsideImage: true, preventHandleOutsideImage: false }; @@ -204,72 +151,134 @@ export default function (mouseToolInterface) { data.active = false; if (mouseToolInterface.pointNearTool(element, data, coords)) { data.active = true; - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - moveAllHandles(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); + moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove); e.stopImmediatePropagation(); + e.stopPropagation(); + e.preventDefault(); - return false; + return; } } } // /////// END DEACTIVE TOOL /////// + + const mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback; + const mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback; + const mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback; + const mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback; + + // /////// BEGIN ACTIVE TOOL /////// + function addNewMeasurement (mouseEventData) { + const cornerstone = external.cornerstone; + const element = mouseEventData.element; + + const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); + + if (!measurementData) { + return; + } + + // Associate this data with this imageId so we can render it and manipulate it + addToolState(mouseEventData.element, toolType, measurementData); + + // Since we are dragging to another place to drop the end point, we can just activate + // The end point and let the moveHandle move it for us. + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); + + if (mouseDoubleClick) { + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + } + + cornerstone.updateImage(element); + + let handleMover; + + if (Object.keys(measurementData.handles).length === 1) { + handleMover = moveHandle; + } else { + handleMover = moveNewHandle; + } + + let preventHandleOutsideImage; + + if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) { + preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage; + } else { + preventHandleOutsideImage = false; + } + + handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () { + measurementData.active = false; + measurementData.invalidated = true; + if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) { + // Delete the measurement + removeToolState(element, toolType, measurementData); + } + + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); + + if (mouseDoubleClick) { + element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + } + + cornerstone.updateImage(element); + }, preventHandleOutsideImage); + } + + // Not visible, not interactive function disable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - if (mouseToolInterface.mouseDoubleClickCallback) { - external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } external.cornerstone.updateImage(element); } - // Note: This is to maintain compatibility for developers that have - // Built on top of mouseButtonTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function onImageRendered (e) { - mouseToolInterface.onImageRendered(e, e.detail); - } - // Visible but not interactive function enable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - if (mouseToolInterface.mouseDoubleClickCallback) { - external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); external.cornerstone.updateImage(element); } // Visible, interactive and can create function activate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - if (mouseToolInterface.mouseDoubleClickCallback) { - external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); - external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } external.cornerstone.updateImage(element); @@ -277,31 +286,29 @@ export default function (mouseToolInterface) { // Visible, interactive function deactivate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; + setToolOptions(toolType, element, { mouseButtonMask }); - const eventType = 'CornerstoneToolsToolDeactivated'; + const eventType = EVENTS.TOOL_DEACTIVATED; const statusChangeEventData = { mouseButtonMask, - toolType: mouseToolInterface.toolType, + toolType, type: eventType }; triggerEvent(element, eventType, statusChangeEventData); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown); - if (mouseToolInterface.mouseDoubleClickCallback) { - external.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); - external.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); + if (mouseDoubleClick) { + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); + element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } if (mouseToolInterface.deactivate) { @@ -331,13 +338,13 @@ export default function (mouseToolInterface) { mouseDownActivateCallback }; - // Expose pointNearTool if available + // Expose pointNearTool if available if (mouseToolInterface.pointNearTool) { toolInterface.pointNearTool = mouseToolInterface.pointNearTool; } - if (mouseToolInterface.mouseDoubleClickCallback) { - toolInterface.mouseDoubleClickCallback = mouseToolInterface.mouseDoubleClickCallback; + if (mouseDoubleClick) { + toolInterface.mouseDoubleClickCallback = mouseDoubleClick; } if (mouseToolInterface.addNewMeasurement) { diff --git a/src/imageTools/mouseWheelTool.js b/src/imageTools/mouseWheelTool.js index eae9df21a..0c60cb46c 100755 --- a/src/imageTools/mouseWheelTool.js +++ b/src/imageTools/mouseWheelTool.js @@ -1,25 +1,19 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; export default function (mouseWheelCallback) { - const toolInterface = { + return { activate (element) { - external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); - const eventData = { - }; - - external.$(element).on('CornerstoneToolsMouseWheel', eventData, mouseWheelCallback); + element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback); + element.addEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback); }, disable (element) { - external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); + element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback); }, enable (element) { - external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); + element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback); }, deactivate (element) { - external.$(element).off('CornerstoneToolsMouseWheel', mouseWheelCallback); + element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback); } }; - - - return toolInterface; } diff --git a/src/imageTools/multiTouchDragTool.js b/src/imageTools/multiTouchDragTool.js index 5e9ad89e4..6eb706db9 100644 --- a/src/imageTools/multiTouchDragTool.js +++ b/src/imageTools/multiTouchDragTool.js @@ -1,41 +1,47 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; export default function (touchDragCallback, options) { let configuration = {}; - let events = 'CornerstoneToolsMultiTouchDrag'; + const events = [EVENTS.MULTI_TOUCH_DRAG]; if (options && options.fireOnTouchStart === true) { - events += ' CornerstoneToolsMultiTouchStart'; + events.push(EVENTS.MULTI_TOUCH_START); } - const toolInterface = { + return { activate (element) { - external.$(element).off(events, touchDragCallback); - - if (options && options.eventData) { - external.$(element).on(events, options.eventData, touchDragCallback); - } else { - external.$(element).on(events, touchDragCallback); - } + events.forEach((eventType) => { + element.removeEventListener(eventType, touchDragCallback); + element.addEventListener(eventType, touchDragCallback); + }); if (options && options.activateCallback) { options.activateCallback(element); } }, disable (element) { - external.$(element).off(events, touchDragCallback); + events.forEach((eventType) => { + element.removeEventListener(eventType, touchDragCallback); + }); + if (options && options.disableCallback) { options.disableCallback(element); } }, enable (element) { - external.$(element).off(events, touchDragCallback); + events.forEach((eventType) => { + element.removeEventListener(eventType, touchDragCallback); + }); + if (options && options.enableCallback) { options.enableCallback(element); } }, deactivate (element) { - external.$(element).off(events, touchDragCallback); + events.forEach((eventType) => { + element.removeEventListener(eventType, touchDragCallback); + }); + if (options && options.deactivateCallback) { options.deactivateCallback(element); } @@ -47,7 +53,4 @@ export default function (touchDragCallback, options) { configuration = config; } }; - - - return toolInterface; } diff --git a/src/imageTools/orientationMarkers.js b/src/imageTools/orientationMarkers.js index 7f448c1f9..9c6bf4e6f 100644 --- a/src/imageTools/orientationMarkers.js +++ b/src/imageTools/orientationMarkers.js @@ -64,7 +64,8 @@ function getOrientationMarkerPositions (element) { }; } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; const element = eventData.element; const markers = getOrientationMarkers(element); diff --git a/src/imageTools/pan.js b/src/imageTools/pan.js index be808caff..67747a708 100755 --- a/src/imageTools/pan.js +++ b/src/imageTools/pan.js @@ -1,25 +1,38 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import simpleMouseButtonTool from './simpleMouseButtonTool.js'; import touchDragTool from './touchDragTool.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { getToolOptions } from '../enabledElementTools.js'; -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +const toolType = 'pan'; + +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there. let widthScale = eventData.viewport.scale; @@ -35,10 +48,11 @@ function dragCallback (e, eventData) { eventData.viewport.translation.y += (eventData.deltaPoints.page.y / heightScale); external.cornerstone.setViewport(eventData.element, eventData.viewport); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -const pan = simpleMouseButtonTool(mouseDownCallback); +const pan = simpleMouseButtonTool(mouseDownCallback, toolType); const panTouchDrag = touchDragTool(dragCallback); export { diff --git a/src/imageTools/panMultiTouch.js b/src/imageTools/panMultiTouch.js index a0117946e..8e5b87bee 100644 --- a/src/imageTools/panMultiTouch.js +++ b/src/imageTools/panMultiTouch.js @@ -1,7 +1,8 @@ import external from '../externalModules.js'; import multiTouchDragTool from './multiTouchDragTool.js'; -function touchPanCallback (e, eventData) { +function touchPanCallback (e) { + const eventData = e.detail; const config = panMultiTouch.getConfiguration(); if (config && config.testPointers(eventData)) { @@ -9,7 +10,8 @@ function touchPanCallback (e, eventData) { eventData.viewport.translation.y += (eventData.deltaPoints.page.y / eventData.viewport.scale); external.cornerstone.setViewport(eventData.element, eventData.viewport); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } diff --git a/src/imageTools/probe.js b/src/imageTools/probe.js index 39d1202cd..40fd0f2ff 100755 --- a/src/imageTools/probe.js +++ b/src/imageTools/probe.js @@ -40,7 +40,9 @@ function pointNearTool (element, data, coords) { return external.cornerstoneMath.point.distance(endCanvas, coords) < 5; } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); diff --git a/src/imageTools/rectangleRoi.js b/src/imageTools/rectangleRoi.js index 9d397a6c7..8957270ef 100755 --- a/src/imageTools/rectangleRoi.js +++ b/src/imageTools/rectangleRoi.js @@ -111,7 +111,9 @@ function numberWithCommas (x) { return parts.join('.'); } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); diff --git a/src/imageTools/rotate.js b/src/imageTools/rotate.js index d32fa588d..4649915d6 100644 --- a/src/imageTools/rotate.js +++ b/src/imageTools/rotate.js @@ -1,7 +1,11 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import simpleMouseButtonTool from './simpleMouseButtonTool.js'; import touchDragTool from './touchDragTool.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { getToolOptions } from '../enabledElementTools.js'; + +const toolType = 'rotate'; // --- Strategies --- // function defaultStrategy (eventData) { @@ -41,30 +45,41 @@ function verticalStrategy (eventData) { } // --- Mouse event callbacks --- // -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); + + e.preventDefault(); + e.stopPropagation(); } } -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; + rotate.strategy(eventData); external.cornerstone.setViewport(eventData.element, eventData.viewport); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -const rotate = simpleMouseButtonTool(mouseDownCallback); +const rotate = simpleMouseButtonTool(mouseDownCallback, toolType); rotate.strategies = { default: defaultStrategy, diff --git a/src/imageTools/rotateTouch.js b/src/imageTools/rotateTouch.js index cd32d3b6b..6c72a0f37 100644 --- a/src/imageTools/rotateTouch.js +++ b/src/imageTools/rotateTouch.js @@ -1,6 +1,9 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; -function touchRotateCallback (e, eventData) { +function touchRotateCallback (e) { + const eventData = e.detail; + eventData.viewport.rotation += eventData.rotation; external.cornerstone.setViewport(eventData.element, eventData.viewport); @@ -8,12 +11,12 @@ function touchRotateCallback (e, eventData) { } function disable (element) { - external.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback); + element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback); } function activate (element) { - external.$(element).off('CornerstoneToolsTouchRotate', touchRotateCallback); - external.$(element).on('CornerstoneToolsTouchRotate', touchRotateCallback); + element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback); + element.addEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback); } const rotateTouch = { diff --git a/src/imageTools/saveAs.js b/src/imageTools/saveAs.js index bfd41eb4c..12b81364f 100644 --- a/src/imageTools/saveAs.js +++ b/src/imageTools/saveAs.js @@ -1,33 +1,27 @@ -import external from '../externalModules.js'; - -export default function (element, filename, mimetype) { +export default function saveAs (element, filename, mimetype = 'image/png') { // Setting the default value for mimetype to image/png - mimetype = mimetype || 'image/png'; - const canvas = external.$(element).find('canvas').get(0); + const canvas = element.querySelector('canvas'); // Thanks to Ken Fyrstenber // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas const lnk = document.createElement('a'); - // / the key here is to set the download attribute of the a tag + // The key here is to set the download attribute of the a tag lnk.download = filename; - // / convert canvas content to data-uri for link. When download - // / attribute is set the content pointed to by link will be - // / pushed as 'download' in HTML5 capable browsers + // Convert canvas content to data-uri for link. When download + // Attribute is set the content pointed to by link will be + // Pushed as 'download' in HTML5 capable browsers lnk.href = canvas.toDataURL(mimetype, 1); // / create a 'fake' click-event to trigger the download if (document.createEvent) { - const e = document.createEvent('MouseEvents'); e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); lnk.dispatchEvent(e); - } else if (lnk.fireEvent) { - lnk.fireEvent('onclick'); } } diff --git a/src/imageTools/seedAnnotate.js b/src/imageTools/seedAnnotate.js index 7e709fd91..d5e976cc4 100644 --- a/src/imageTools/seedAnnotate.js +++ b/src/imageTools/seedAnnotate.js @@ -1,4 +1,5 @@ /* eslint no-alert:0 */ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import mouseButtonTool from './mouseButtonTool.js'; import touchTool from './touchTool.js'; @@ -13,6 +14,7 @@ import drawCircle from '../util/drawCircle.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import pointInsideBoundingBox from '../util/pointInsideBoundingBox.js'; import { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js'; +import { getToolOptions } from '../enabledElementTools.js'; const toolType = 'seedAnnotate'; @@ -115,7 +117,8 @@ function pointNearTool (element, data, coords) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); @@ -302,10 +305,16 @@ function addNewMeasurementTouch (touchEventData) { }); } -function doubleClickCallback (e, eventData) { +function doubleClickCallback (e) { + const eventData = e.detail; const cornerstone = external.cornerstone; const element = eventData.element; let data; + const options = getToolOptions(toolType, element); + + if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + return; + } function doneChangingTextCallback (data, updatedText, deleteTool) { if (deleteTool === true) { @@ -318,10 +327,6 @@ function doubleClickCallback (e, eventData) { cornerstone.updateImage(element); } - if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - return; - } - const config = seedAnnotate.getConfiguration(); const coords = eventData.currentPoints.canvas; @@ -348,10 +353,12 @@ function doubleClickCallback (e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -function pressCallback (e, eventData) { +function pressCallback (e) { + const eventData = e.detail; const cornerstone = external.cornerstone; const element = eventData.element; let data; @@ -367,13 +374,9 @@ function pressCallback (e, eventData) { data.active = false; cornerstone.updateImage(element); - external.$(element).on('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', seedAnnotateTouch.tapCallback); - } - - if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - return false; + element.addEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback); } const config = seedAnnotate.getConfiguration(); @@ -387,9 +390,9 @@ function pressCallback (e, eventData) { } if (eventData.handlePressed) { - external.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback); @@ -406,9 +409,9 @@ function pressCallback (e, eventData) { data.active = true; cornerstone.updateImage(element); - external.$(element).off('CornerstoneToolsTouchStart', seedAnnotateTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', seedAnnotateTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', seedAnnotateTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); @@ -419,7 +422,8 @@ function pressCallback (e, eventData) { } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } const seedAnnotate = mouseButtonTool({ diff --git a/src/imageTools/simpleAngle.js b/src/imageTools/simpleAngle.js index 5352629ee..d12a83c57 100644 --- a/src/imageTools/simpleAngle.js +++ b/src/imageTools/simpleAngle.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import mouseButtonTool from './mouseButtonTool.js'; import drawTextBox from '../util/drawTextBox.js'; @@ -81,7 +82,8 @@ function length (vector) { } // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); @@ -281,19 +283,15 @@ function addNewMeasurement (mouseEventData) { const measurementData = createNewMeasurement(mouseEventData); const element = mouseEventData.element; - const eventData = { - mouseButtonMask: mouseEventData.which - }; - - // Associate this data with this imageId so we can render it and manipulate it + // Associate this data with this imageId so we can render it and manipulate it addToolState(element, toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - external.$(element).off('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', simpleAngle.mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', simpleAngle.mouseDownActivateCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback); cornerstone.updateImage(element); moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () { @@ -302,10 +300,10 @@ function addNewMeasurement (mouseEventData) { // Delete the measurement removeToolState(element, toolType, measurementData); - external.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback); cornerstone.updateImage(element); return; @@ -321,10 +319,10 @@ function addNewMeasurement (mouseEventData) { removeToolState(element, toolType, measurementData); } - external.$(element).on('CornerstoneToolsMouseMove', simpleAngle.mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDrag', simpleAngle.mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, simpleAngle.mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, simpleAngle.mouseDownActivateCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback); cornerstone.updateImage(element); }); }); @@ -340,20 +338,20 @@ function addNewMeasurementTouch (touchEventData) { // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. - external.$(element).off('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTap', simpleAngleTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback); + element.removeEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback); cornerstone.updateImage(element); moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.middle, function () { if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) { // Delete the measurement removeToolState(element, toolType, measurementData); - external.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback); - external.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback); + element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback); + element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback); cornerstone.updateImage(element); return; @@ -366,10 +364,10 @@ function addNewMeasurementTouch (touchEventData) { cornerstone.updateImage(element); } - external.$(element).on('CornerstoneToolsTouchDrag', simpleAngleTouch.touchMoveCallback); - external.$(element).on('CornerstoneToolsTouchStart', simpleAngleTouch.touchStartCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', simpleAngleTouch.touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', simpleAngleTouch.tapCallback); + element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback); + element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback); }); }); } diff --git a/src/imageTools/simpleMouseButtonTool.js b/src/imageTools/simpleMouseButtonTool.js index d8d5be0b2..e78774db3 100755 --- a/src/imageTools/simpleMouseButtonTool.js +++ b/src/imageTools/simpleMouseButtonTool.js @@ -1,26 +1,29 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; +import { setToolOptions } from '../enabledElementTools.js'; + +export default function (mouseDownCallback, toolType) { + if (!toolType) { + throw new Error('simpleMouseButtonTool: toolType is required'); + } -export default function (mouseDownCallback) { let configuration = {}; - const toolInterface = { - activate (element, mouseButtonMask, options) { - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); - const eventData = { - mouseButtonMask, - options - }; + return { + activate (element, mouseButtonMask, options = {}) { + options.mouseButtonMask = mouseButtonMask; + setToolOptions(toolType, element, options); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, disable (element) { - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, enable (element) { - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, deactivate (element) { - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback); }, getConfiguration () { return configuration; @@ -29,7 +32,4 @@ export default function (mouseDownCallback) { configuration = config; } }; - - - return toolInterface; } diff --git a/src/imageTools/textMarker.js b/src/imageTools/textMarker.js index 17c07e41a..f43dbe235 100755 --- a/src/imageTools/textMarker.js +++ b/src/imageTools/textMarker.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import mouseButtonTool from './mouseButtonTool.js'; import touchTool from './touchTool.js'; @@ -6,6 +7,7 @@ import toolColors from '../stateManagement/toolColors.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import drawTextBox from '../util/drawTextBox.js'; import { removeToolState, getToolState } from '../stateManagement/toolState.js'; +import { getToolOptions } from '../enabledElementTools.js'; const toolType = 'textMarker'; @@ -89,7 +91,9 @@ function pointNearTool (element, data, coords) { return (distanceToPoint < 10) || insideBoundingBox; } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(eventData.element, toolType); @@ -136,18 +140,22 @@ function onImageRendered (e, eventData) { } }; - const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options); - - data.handles.end.boundingBox = boundingBox; + data.handles.end.boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options); context.restore(); } } -function doubleClickCallback (e, eventData) { +function doubleClickCallback (e) { + const eventData = e.detail; const cornerstone = external.cornerstone; const element = eventData.element; let data; + const options = getToolOptions(toolType, element); + + if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + return; + } function doneChangingTextCallback (data, updatedText, deleteTool) { if (deleteTool === true) { @@ -159,22 +167,13 @@ function doubleClickCallback (e, eventData) { data.active = false; cornerstone.updateImage(element); - const mouseButtonData = { - mouseButtonMask: e.data.mouseButtonMask - }; - - external.$(element).on('CornerstoneToolsMouseMove', mouseButtonData, textMarker.mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseDown', mouseButtonData, textMarker.mouseDownCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', mouseButtonData, textMarker.mouseDownActivateCallback); - external.$(element).on('CornerstoneToolsMouseDoubleClick', mouseButtonData, textMarker.mouseDoubleClickCallback); - } - - if (e.data && e.data.mouseButtonMask && !isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - return; + element.addEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback); + element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback); } const config = textMarker.getConfiguration(); - const coords = eventData.currentPoints.canvas; const toolData = getToolState(element, toolType); @@ -189,23 +188,27 @@ function doubleClickCallback (e, eventData) { data.active = true; cornerstone.updateImage(element); - external.$(element).off('CornerstoneToolsMouseMove', textMarker.mouseMoveCallback); - external.$(element).off('CornerstoneToolsMouseDown', textMarker.mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', textMarker.mouseDownActivateCallback); - external.$(element).off('CornerstoneToolsMouseDoubleClick', textMarker.mouseDoubleClickCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback); + element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); - return false; + return; } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -function touchPressCallback (e, eventData) { +function touchPressCallback (e) { + const eventData = e.detail; const cornerstone = external.cornerstone; const element = eventData.element; let data; @@ -220,11 +223,11 @@ function touchPressCallback (e, eventData) { data.active = false; cornerstone.updateImage(element); - external.$(element).on('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback); - external.$(element).on('CornerstoneToolsTap', textMarkerTouch.tapCallback); - external.$(element).on('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback); + element.addEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback); + element.addEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback); + element.addEventListener(EVENTS.TAP, textMarkerTouch.tapCallback); + element.addEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback); } const config = textMarker.getConfiguration(); @@ -241,18 +244,20 @@ function touchPressCallback (e, eventData) { eventData.handlePressed.active = true; cornerstone.updateImage(element); - external.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback); - external.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback); + element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback); // Allow relabelling via a callback config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback); e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); - return false; + return; } for (let i = 0; i < toolData.data.length; i++) { @@ -261,21 +266,24 @@ function touchPressCallback (e, eventData) { data.active = true; cornerstone.updateImage(element); - external.$(element).off('CornerstoneToolsTouchDrag', textMarkerTouch.touchMoveCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', textMarkerTouch.touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTouchStart', textMarkerTouch.touchStartCallback); - external.$(element).off('CornerstoneToolsTap', textMarkerTouch.tapCallback); - external.$(element).off('CornerstoneToolsTouchPress', textMarkerTouch.pressCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback); + element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback); + element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback); // Allow relabelling via a callback config.changeTextCallback(data, eventData, doneChangingTextCallback); e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); - return false; + return; } } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } const textMarker = mouseButtonTool({ diff --git a/src/imageTools/touchDragTool.js b/src/imageTools/touchDragTool.js index c58bcedb0..8865b7261 100755 --- a/src/imageTools/touchDragTool.js +++ b/src/imageTools/touchDragTool.js @@ -1,7 +1,7 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; export default function (touchDragCallback, options) { - let events = 'CornerstoneToolsTouchDrag'; + let events = EVENTS.TOUCH_DRAG; if (options && options.fireOnTouchStart === true) { events += ' CornerstoneToolsTouchStart'; @@ -9,12 +9,12 @@ export default function (touchDragCallback, options) { const toolInterface = { activate (element) { - external.$(element).off(events, touchDragCallback); + element.removeEventListener(events, touchDragCallback); if (options && options.eventData) { - external.$(element).on(events, options.eventData, touchDragCallback); + element.addEventListener(events, options.eventData, touchDragCallback); } else { - external.$(element).on(events, touchDragCallback); + element.addEventListener(events, touchDragCallback); } if (options && options.activateCallback) { @@ -22,19 +22,19 @@ export default function (touchDragCallback, options) { } }, disable (element) { - external.$(element).off(events, touchDragCallback); + element.removeEventListener(events, touchDragCallback); if (options && options.disableCallback) { options.disableCallback(element); } }, enable (element) { - external.$(element).off(events, touchDragCallback); + element.removeEventListener(events, touchDragCallback); if (options && options.enableCallback) { options.enableCallback(element); } }, deactivate (element) { - external.$(element).off(events, touchDragCallback); + element.removeEventListener(events, touchDragCallback); if (options && options.deactivateCallback) { options.deactivateCallback(element); } diff --git a/src/imageTools/touchPinchTool.js b/src/imageTools/touchPinchTool.js index 968698931..6bd90cf56 100755 --- a/src/imageTools/touchPinchTool.js +++ b/src/imageTools/touchPinchTool.js @@ -1,25 +1,19 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; export default function (touchPinchCallback) { - const toolInterface = { + return { activate (element) { - external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); - const eventData = { - }; - - external.$(element).on('CornerstoneToolsTouchPinch', eventData, touchPinchCallback); + element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback); + element.addEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback); }, disable (element) { - external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); + element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback); }, enable (element) { - external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); + element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback); }, deactivate (element) { - external.$(element).off('CornerstoneToolsTouchPinch', touchPinchCallback); + element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback); } }; - - - return toolInterface; } diff --git a/src/imageTools/touchTool.js b/src/imageTools/touchTool.js index 0f7c77ca9..1e78d7d7e 100755 --- a/src/imageTools/touchTool.js +++ b/src/imageTools/touchTool.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js'; import getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js'; @@ -47,7 +48,7 @@ function touchTool (touchToolInterface) { addToolState(element, touchToolInterface.toolType, measurementData); - if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === 'CornerstoneToolsTap') { + if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === EVENTS.TAP) { measurementData.active = false; measurementData.handles.end.active = false; measurementData.handles.end.highlight = false; @@ -62,9 +63,9 @@ function touchTool (touchToolInterface) { return; } - external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); moveNewHandleTouch(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () { @@ -75,14 +76,16 @@ function touchTool (touchToolInterface) { removeToolState(element, touchToolInterface.toolType, measurementData); } - external.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); - external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); + element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); }); } - function touchDownActivateCallback (e, eventData) { + function touchDownActivateCallback (e) { + const eventData = e.detail; + // Console.log('touchTool touchDownActivateCallback'); if (touchToolInterface.addNewMeasurement) { touchToolInterface.addNewMeasurement(eventData); @@ -96,7 +99,9 @@ function touchTool (touchToolInterface) { // /////// END ACTIVE TOOL /////// // /////// BEGIN INACTIVE TOOL /////// - function tapCallback (e, eventData) { + function tapCallback (e) { + const eventData = e.detail; + // Console.log('touchTool tapCallback'); const cornerstone = external.cornerstone; const element = eventData.element; @@ -117,8 +122,8 @@ function touchTool (touchToolInterface) { } cornerstone.updateImage(element); - external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); } // Now check to see if there is a handle we can move @@ -129,8 +134,8 @@ function touchTool (touchToolInterface) { const handle = getHandleNearImagePoint(element, data.handles, coords, distanceSq); if (handle) { - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); data.active = true; handle.active = true; cornerstone.updateImage(element); @@ -148,8 +153,8 @@ function touchTool (touchToolInterface) { for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; if (touchToolInterface.pointNearTool(element, data, coords)) { - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); data.active = true; cornerstone.updateImage(element); touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); @@ -164,15 +169,17 @@ function touchTool (touchToolInterface) { // If there is nothing to move, add a new instance of the tool // Need to check here to see if activation is allowed! if (touchToolInterface.touchDownActivateCallback) { - touchToolInterface.touchDownActivateCallback(e, eventData); + touchToolInterface.touchDownActivateCallback(e); } else { - touchDownActivateCallback(e, eventData); + touchDownActivateCallback(e); } return false; } - function touchStartCallback (e, eventData) { + function touchStartCallback (e) { + const eventData = e.detail; + // Console.log('touchTool touchStartCallback'); const cornerstone = external.cornerstone; const element = eventData.element; @@ -191,14 +198,14 @@ function touchTool (touchToolInterface) { } cornerstone.updateImage(eventData.element); - external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { - external.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } - if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') { + if (lastEvent && lastEvent.type === EVENTS.TOUCH_PRESS) { triggerEvent(element, lastEvent.type, lastEventData); } } @@ -219,16 +226,17 @@ function touchTool (touchToolInterface) { const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distance); if (handle) { - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { - external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } data.active = true; touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); + e.stopPropagation(); return; } @@ -243,15 +251,16 @@ function touchTool (touchToolInterface) { data = toolData.data[i]; if (touchToolInterface.pointNearTool(eventData.element, data, coords)) { - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { - external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); + e.stopPropagation(); return; } @@ -261,17 +270,17 @@ function touchTool (touchToolInterface) { // Not visible, not interactive function disable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { - external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } external.cornerstone.updateImage(element); @@ -279,19 +288,19 @@ function touchTool (touchToolInterface) { // Visible but not interactive function enable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); if (touchToolInterface.doubleTapCallback) { - external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } external.cornerstone.updateImage(element); @@ -299,39 +308,32 @@ function touchTool (touchToolInterface) { // Visible, interactive and can create function activate (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { - external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); - external.$(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback); + element.addEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); - external.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); + element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } external.cornerstone.updateImage(element); } - // Note: This is to maintain compatibility for developers that have - // Built on top of touchTool.js - // TODO: Remove this after we migrate Cornerstone Tools away from jQuery - function onImageRendered (e) { - touchToolInterface.onImageRendered(e, e.detail); - } - // Visible, interactive function deactivate (element) { - const eventType = 'CornerstoneToolsToolDeactivated'; + const eventType = EVENTS.TOOL_DEACTIVATED; const statusChangeEventData = { toolType: touchToolInterface.toolType, type: eventType @@ -339,20 +341,20 @@ function touchTool (touchToolInterface) { triggerEvent(element, eventType, statusChangeEventData); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); - external.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); - external.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); + element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); + element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered); + element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); if (touchToolInterface.doubleTapCallback) { - external.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); + element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { - external.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback); } external.cornerstone.updateImage(element); diff --git a/src/imageTools/wwwc.js b/src/imageTools/wwwc.js index 6591f92ce..70790698d 100755 --- a/src/imageTools/wwwc.js +++ b/src/imageTools/wwwc.js @@ -1,21 +1,33 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import simpleMouseButtonTool from './simpleMouseButtonTool.js'; import touchDragTool from './touchDragTool.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { getToolOptions } from '../enabledElementTools.js'; -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +const toolType = 'wwwc'; + +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } @@ -36,14 +48,18 @@ function defaultStrategy (eventData) { eventData.viewport.voi.windowCenter += (deltaY); } -function mouseDragCallback (e, eventData) { +function mouseDragCallback (e) { + const eventData = e.detail; + wwwc.strategy(eventData); external.cornerstone.setViewport(eventData.element, eventData.viewport); return false; // False = cases jquery to preventDefault() and stopPropagation() this event } -function touchDragCallback (e, eventData) { +function touchDragCallback (e) { + const eventData = e.detail; + e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events const dragData = eventData; @@ -72,7 +88,7 @@ function touchDragCallback (e, eventData) { external.cornerstone.setViewport(dragData.element, dragData.viewport); } -const wwwc = simpleMouseButtonTool(mouseDownCallback); +const wwwc = simpleMouseButtonTool(mouseDownCallback, toolType); wwwc.strategies = { default: defaultStrategy diff --git a/src/imageTools/wwwcRegion.js b/src/imageTools/wwwcRegion.js index 260d07666..2c4450a11 100755 --- a/src/imageTools/wwwcRegion.js +++ b/src/imageTools/wwwcRegion.js @@ -1,9 +1,11 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import toolStyle from '../stateManagement/toolStyle.js'; import toolColors from '../stateManagement/toolColors.js'; import { getToolState, addToolState } from '../stateManagement/toolState.js'; import getLuminance from '../util/getLuminance.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; const toolType = 'wwwcRegion'; @@ -11,8 +13,6 @@ let configuration = { minWindowWidth: 10 }; -let currentMouseButtonMask; - /** Calculates the minimum, maximum, and mean value in the given pixel array */ function calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) { const numPixels = storedPixelLuminanceData.length; @@ -47,38 +47,34 @@ function calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) { /* Erases the toolData and rebinds the handlers when the image changes */ function newImageCallback (e) { const eventData = e.detail; - const toolData = getToolState(eventData.element, toolType); + const element = eventData.element; + const toolData = getToolState(element, toolType); if (toolData && toolData.data) { toolData.data = []; } - external.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - - external.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); - const mouseData = { - mouseButtonMask: currentMouseButtonMask - }; + element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback); - external.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); } /* Applies the windowing procedure when the mouse drag ends */ -function dragEndCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseMove', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); +function dragEndCallback (e) { + const eventData = e.detail; + const element = eventData.element; - external.$(eventData.element).off('CornerstoneToolsMouseUp', dragEndCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); - const mouseData = { - mouseButtonMask: currentMouseButtonMask - }; + element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback); - external.$(eventData.element).on('CornerstoneToolsMouseDown', mouseData, mouseDownCallback); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); const toolData = getToolState(eventData.element, toolType); @@ -146,28 +142,33 @@ function applyWWWCRegion (eventData) { cornerstone.updateImage(eventData.element); } -function whichMovement (e, eventData) { +function whichMovement (e) { + const eventData = e.detail; const element = eventData.element; - external.$(element).off('CornerstoneToolsMouseMove'); - external.$(element).off('CornerstoneToolsMouseDrag'); + element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement); + element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement); - external.$(element).on('CornerstoneToolsMouseMove', dragCallback); - external.$(element).on('CornerstoneToolsMouseDrag', dragCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, dragCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); - external.$(element).on('CornerstoneToolsMouseClick', dragEndCallback); - if (e.type === 'CornerstoneToolsMouseDrag') { - external.$(element).on('CornerstoneToolsMouseUp', dragEndCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, dragEndCallback); + if (e.type === EVENTS.MOUSE_DRAG) { + element.addEventListener(EVENTS.MOUSE_UP, dragEndCallback); } } /** Records the start point and attaches the drag event handler */ -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(eventData.element).on('CornerstoneToolsMouseDrag', eventData, whichMovement); - external.$(eventData.element).on('CornerstoneToolsMouseMove', eventData, whichMovement); +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); - external.$(eventData.element).off('CornerstoneToolsMouseDown', mouseDownCallback); + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement); + element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement); + + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); recordStartPoint(eventData); return false; @@ -193,26 +194,30 @@ function recordStartPoint (eventData) { } /** Draws the rectangular region while the touch or mouse event drag occurs */ -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; + const element = eventData.element; + // If we have no toolData for this element, return immediately as there is nothing to do - const toolData = getToolState(eventData.element, toolType); + const toolData = getToolState(element, toolType); if (!toolData || !toolData.data || !toolData.data.length) { return; } // Update the endpoint as the mouse/touch is dragged - const endPoint = { + toolData.data[0].endPoint = { x: eventData.currentPoints.image.x, y: eventData.currentPoints.image.y }; - toolData.data[0].endPoint = endPoint; - external.cornerstone.updateImage(eventData.element); + external.cornerstone.updateImage(element); } function onImageRendered (e) { const eventData = e.detail; + const element = eventData.element; + const context = eventData.canvasContext; const cornerstone = external.cornerstone; const toolData = getToolState(eventData.element, toolType); @@ -227,18 +232,14 @@ function onImageRendered (e) { return; } - // Get the current element's canvas - const canvas = external.$(eventData.element).find('canvas').get(0); - const context = canvas.getContext('2d'); - context.setTransform(1, 0, 0, 1, 0, 0); // Set to the active tool color const color = toolColors.getActiveColor(); // Calculate the rectangle parameters - const startPointCanvas = cornerstone.pixelToCanvas(eventData.element, startPoint); - const endPointCanvas = cornerstone.pixelToCanvas(eventData.element, endPoint); + const startPointCanvas = cornerstone.pixelToCanvas(element, startPoint); + const endPointCanvas = cornerstone.pixelToCanvas(element, endPoint); const left = Math.min(startPointCanvas.x, endPointCanvas.x); const top = Math.min(startPointCanvas.y, endPointCanvas.y); @@ -268,26 +269,22 @@ function onImageRendered (e) { // --- Mouse tool enable / disable --- /// function disable (element) { - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseUp', dragEndCallback); - external.$(element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback); - external.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(element).off('CornerstoneToolsMouseMove', dragCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback); external.cornerstone.updateImage(element); } function activate (element, mouseButtonMask) { - const eventData = { - mouseButtonMask - }; - - currentMouseButtonMask = mouseButtonMask; + setToolOptions(toolType, element, { mouseButtonMask }); const toolData = getToolState(element, toolType); @@ -297,33 +294,33 @@ function activate (element, mouseButtonMask) { addToolState(element, toolType, data); } - external.$(element).off('CornerstoneToolsMouseDown', mouseDownCallback); + element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); - external.$(element).off('CornerstoneToolsMouseUp', dragEndCallback); - external.$(element).off('CornerstoneToolsMouseClick', dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback); - external.$(element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(element).off('CornerstoneToolsMouseMove', dragCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.removeEventListener('cornerstonenewimage', newImageCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback); - external.$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); // If the displayed image changes after the user has started clicking, we should // Cancel the handlers and prepare for another click - element.addEventListener('cornerstonenewimage', newImageCallback); + element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback); external.cornerstone.updateImage(element); } // --- Touch tool enable / disable --- // function disableTouchDrag (element) { - external.$(element).off('CornerstoneToolsTouchDrag', dragCallback); - external.$(element).off('CornerstoneToolsTouchStart', recordStartPoint); - external.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback); + element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint); + element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); } function activateTouchDrag (element) { @@ -335,15 +332,15 @@ function activateTouchDrag (element) { addToolState(element, toolType, data); } - external.$(element).off('CornerstoneToolsTouchDrag', dragCallback); - external.$(element).off('CornerstoneToolsTouchStart', recordStartPoint); - external.$(element).off('CornerstoneToolsDragEnd', applyWWWCRegion); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback); + element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint); + element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); - external.$(element).on('CornerstoneToolsTouchDrag', dragCallback); - external.$(element).on('CornerstoneToolsTouchStart', recordStartPoint); - external.$(element).on('CornerstoneToolsDragEnd', applyWWWCRegion); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback); + element.addEventListener(EVENTS.TOUCH_START, recordStartPoint); + element.addEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); } function getConfiguration () { diff --git a/src/imageTools/zoom.js b/src/imageTools/zoom.js index 3fbe738ab..97f8889da 100755 --- a/src/imageTools/zoom.js +++ b/src/imageTools/zoom.js @@ -1,11 +1,13 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import simpleMouseButtonTool from './simpleMouseButtonTool.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import mouseWheelTool from './mouseWheelTool.js'; import touchPinchTool from './touchPinchTool.js'; import touchDragTool from './touchDragTool.js'; +import { getToolOptions } from '../enabledElementTools.js'; - +const toolType = 'zoom'; let startPoints; function changeViewportScale (viewport, ticks) { @@ -200,24 +202,34 @@ function zoomToCenterStrategy (eventData, ticks) { external.cornerstone.setViewport(element, viewport); } -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { startPoints = eventData.startPoints; // Used for translateStrategy - external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); - return false; // False = cases jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } } -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; + if (!eventData.deltaPoints.page.y) { return false; } @@ -226,10 +238,12 @@ function dragCallback (e, eventData) { zoom.strategy(eventData, ticks); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } -function mouseWheelCallback (e, eventData) { +function mouseWheelCallback (e) { + const eventData = e.detail; let ticks = -eventData.direction / 4; // Allow inversion of the mouse wheel scroll via a configuration option @@ -244,7 +258,8 @@ function mouseWheelCallback (e, eventData) { external.cornerstone.setViewport(eventData.element, viewport); } -function touchPinchCallback (e, eventData) { +function touchPinchCallback (e) { + const eventData = e.detail; const cornerstone = external.cornerstone; const config = zoom.getConfiguration(); const viewport = eventData.viewport; @@ -274,7 +289,7 @@ function touchPinchCallback (e, eventData) { cornerstone.setViewport(element, viewport); } -const zoom = simpleMouseButtonTool(mouseDownCallback); +const zoom = simpleMouseButtonTool(mouseDownCallback, toolType); zoom.strategies = { default: defaultStrategy, diff --git a/src/inputSources/keyboardInput.js b/src/inputSources/keyboardInput.js index 827c50ed8..5b10dba12 100644 --- a/src/inputSources/keyboardInput.js +++ b/src/inputSources/keyboardInput.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -27,33 +28,37 @@ function keyPress (e) { keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image); const keyPressEvents = { - keydown: 'CornerstoneToolsKeyDown', - keypress: 'CornerstoneToolsKeyPress', - keyup: 'CornerstoneToolsKeyUp' - + keydown: EVENTS.KEY_DOWN, + keypress: EVENTS.KEY_PRESS, + keyup: EVENTS.KEY_UP }; triggerEvent(element, keyPressEvents[e.type], keyPressData); } function mouseMove (e) { - mouseX = e.pageX || e.originalEvent.pageX; - mouseY = e.pageY || e.originalEvent.pageY; + mouseX = e.pageX; + mouseY = e.pageY; } -const keyboardEvent = 'keydown keypress keyup'; +const keyboardEvents = ['keydown', 'keypress', 'keyup']; function enable (element) { - // Prevent handlers from being attached multiple times - disable(element); + keyboardEvents.forEach((eventType) => { + element.removeEventListener(eventType, keyPress); + element.addEventListener(eventType, keyPress); + }); - external.$(element).on(keyboardEvent, keyPress); - external.$(element).on('mousemove', mouseMove); + element.removeEventListener('mousemove', mouseMove); + element.addEventListener('mousemove', mouseMove); } function disable (element) { - external.$(element).off(keyboardEvent, keyPress); - external.$(element).off('mousemove', mouseMove); + keyboardEvents.forEach((eventType) => { + element.removeEventListener(eventType, keyPress); + }); + + element.removeEventListener('mousemove', mouseMove); } // Module exports diff --git a/src/inputSources/mouseInput.js b/src/inputSources/mouseInput.js index 203612c27..096cb8444 100755 --- a/src/inputSources/mouseInput.js +++ b/src/inputSources/mouseInput.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import copyPoints from '../util/copyPoints.js'; import pauseEvent from '../util/pauseEvent.js'; @@ -32,7 +33,7 @@ function preventClickHandler () { function mouseDoubleClick (e) { const cornerstone = external.cornerstone; const element = e.currentTarget; - const eventType = 'CornerstoneToolsMouseDoubleClick'; + const eventType = EVENTS.MOUSE_DOUBLE_CLICK; const startPoints = { page: external.cornerstoneMath.point.pageToPoint(e), @@ -46,9 +47,18 @@ function mouseDoubleClick (e) { startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); const lastPoints = copyPoints(startPoints); + + + /* Note: It seems we can't trust MouseEvent.buttons for dblclick events? + + For some reason they are always firing with e.buttons = 0 + so we have to use e.which for now instead. + + Might be related to using preventDefault on the original mousedown or click events? + */ const eventData = { event: e, - which: getEventWhich(e), + which: e.which, viewport: cornerstone.getViewport(element), image: cornerstone.getEnabledElement(element).image, element, @@ -62,7 +72,7 @@ function mouseDoubleClick (e) { type: eventType }; - triggerEvent(eventData.element, eventType, eventData); + triggerEvent(element, eventType, eventData); } function mouseDown (e) { @@ -70,10 +80,10 @@ function mouseDown (e) { const cornerstone = external.cornerstone; const element = e.currentTarget; - const eventType = 'CornerstoneToolsMouseDown'; + const eventType = EVENTS.MOUSE_DOWN; // Prevent CornerstoneToolsMouseMove while mouse is down - external.$(element).off('mousemove', mouseMove); + element.removeEventListener('mousemove', mouseMove); const startPoints = { page: external.cornerstoneMath.point.pageToPoint(e), @@ -107,15 +117,15 @@ function mouseDown (e) { if (eventPropagated) { // No tools responded to this event, create a new tool - eventData.type = 'CornerstoneToolsMouseDownActivate'; - triggerEvent(eventData.element, 'CornerstoneToolsMouseDownActivate', eventData); + eventData.type = EVENTS.MOUSE_DOWN_ACTIVATE; + triggerEvent(eventData.element, EVENTS.MOUSE_DOWN_ACTIVATE, eventData); } const whichMouseButton = getEventWhich(e); function onMouseMove (e) { // Calculate our current points in page and image coordinates - const eventType = 'CornerstoneToolsMouseDrag'; + const eventType = EVENTS.MOUSE_DRAG; const currentPoints = { page: external.cornerstoneMath.point.pageToPoint(e), image: cornerstone.pageToPixel(element, e.pageX, e.pageY), @@ -165,10 +175,10 @@ function mouseDown (e) { // Cancel the timeout preventing the click event from triggering clearTimeout(preventClickTimeout); - let eventType = 'CornerstoneToolsMouseUp'; + let eventType = EVENTS.MOUSE_UP; if (isClickEvent) { - eventType = 'CornerstoneToolsMouseClick'; + eventType = EVENTS.MOUSE_CLICK; } // Calculate our current points in page and image coordinates @@ -206,16 +216,16 @@ function mouseDown (e) { triggerEvent(eventData.element, eventType, eventData); - external.$(document).off('mousemove', onMouseMove); - external.$(document).off('mouseup', onMouseUp); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); - external.$(eventData.element).on('mousemove', mouseMove); + element.addEventListener('mousemove', mouseMove); isClickEvent = true; } - external.$(document).on('mousemove', onMouseMove); - external.$(document).on('mouseup', onMouseUp); + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); return pauseEvent(e); } @@ -223,7 +233,7 @@ function mouseDown (e) { function mouseMove (e) { const cornerstone = external.cornerstone; const element = e.currentTarget; - const eventType = 'CornerstoneToolsMouseMove'; + const eventType = EVENTS.MOUSE_MOVE; const startPoints = { page: external.cornerstoneMath.point.pageToPoint(e), @@ -238,8 +248,6 @@ function mouseMove (e) { let lastPoints = copyPoints(startPoints); - const whichMouseButton = getEventWhich(e); - // Calculate our current points in page and image coordinates const currentPoints = { page: external.cornerstoneMath.point.pageToPoint(e), @@ -261,7 +269,6 @@ function mouseMove (e) { }; const eventData = { - which: whichMouseButton, viewport: cornerstone.getViewport(element), image: cornerstone.getEnabledElement(element).image, element, @@ -279,18 +286,18 @@ function mouseMove (e) { } function disable (element) { - external.$(element).off('mousedown', mouseDown); - external.$(element).off('mousemove', mouseMove); - external.$(element).off('dblclick', mouseDoubleClick); + element.removeEventListener('mousedown', mouseDown); + element.removeEventListener('mousemove', mouseMove); + element.removeEventListener('dblclick', mouseDoubleClick); } function enable (element) { // Prevent handlers from being attached multiple times disable(element); - external.$(element).on('mousedown', mouseDown); - external.$(element).on('mousemove', mouseMove); - external.$(element).on('dblclick', mouseDoubleClick); + element.addEventListener('mousedown', mouseDown); + element.addEventListener('mousemove', mouseMove); + element.addEventListener('dblclick', mouseDoubleClick); } // Module exports diff --git a/src/inputSources/mouseWheelInput.js b/src/inputSources/mouseWheelInput.js index ba07028a5..00cce1875 100755 --- a/src/inputSources/mouseWheelInput.js +++ b/src/inputSources/mouseWheelInput.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -7,11 +8,11 @@ function mouseWheel (e) { // Mac os x mavericks system when middle mouse button dragging. // I couldn't find any info about this so this might break other systems // Webkit hack - if (e.originalEvent.type === 'mousewheel' && e.originalEvent.wheelDeltaY === 0) { + if (e.type === 'mousewheel' && e.wheelDeltaY === 0) { return; } // Firefox hack - if (e.originalEvent.type === 'DOMMouseScroll' && e.originalEvent.axis === 1) { + if (e.type === 'DOMMouseScroll' && e.axis === 1) { return; } @@ -26,11 +27,6 @@ function mouseWheel (e) { if (e.pageX !== undefined && e.pageY !== undefined) { x = e.pageX; y = e.pageY; - } else if (e.originalEvent && - e.originalEvent.pageX !== undefined && - e.originalEvent.pageY !== undefined) { - x = e.originalEvent.pageX; - y = e.originalEvent.pageY; } else { // IE9 & IE10 x = e.x; @@ -43,12 +39,12 @@ function mouseWheel (e) { let wheelDelta; - if (e.originalEvent && e.originalEvent.wheelDelta) { - wheelDelta = -e.originalEvent.wheelDelta; - } else if (e.originalEvent && e.originalEvent.deltaY) { - wheelDelta = -e.originalEvent.deltaY; - } else if (e.originalEvent && e.originalEvent.detail) { - wheelDelta = -e.originalEvent.detail; + if (e.wheelDelta) { + wheelDelta = -e.wheelDelta; + } else if (e.deltaY) { + wheelDelta = -e.deltaY; + } else if (e.detail) { + wheelDelta = -e.detail; } else { wheelDelta = e.wheelDelta; } @@ -66,20 +62,24 @@ function mouseWheel (e) { imageY: startingCoords.y }; - triggerEvent(element, 'CornerstoneToolsMouseWheel', mouseWheelData); + triggerEvent(element, EVENTS.MOUSE_WHEEL, mouseWheelData); } -const mouseWheelEvents = 'mousewheel DOMMouseScroll'; +const mouseWheelEvents = ['mousewheel', 'DOMMouseScroll']; function enable (element) { // Prevent handlers from being attached multiple times disable(element); - external.$(element).on(mouseWheelEvents, mouseWheel); + mouseWheelEvents.forEach((eventType) => { + element.addEventListener(eventType, mouseWheel); + }); } function disable (element) { - external.$(element).unbind(mouseWheelEvents, mouseWheel); + mouseWheelEvents.forEach((eventType) => { + element.removeEventListener(eventType, mouseWheel); + }); } // Module exports diff --git a/src/inputSources/preventGhostClick.js b/src/inputSources/preventGhostClick.js index bfd8a2f1a..78f77f5f1 100644 --- a/src/inputSources/preventGhostClick.js +++ b/src/inputSources/preventGhostClick.js @@ -1,5 +1,3 @@ -import external from '../externalModules.js'; - // Functions to prevent ghost clicks following a touch // All credit to @kosich // https://gist.github.com/kosich/23188dd86633b6c2efb7 @@ -41,7 +39,7 @@ function attachEvents (element, eventList, interactionType) { const tapHandler = interactionType ? handleTapMouse : handleTapTouch; eventList.forEach(function (eventName) { - external.$(element).on(eventName, tapHandler); + element.addEventListener(eventName, tapHandler); }); } @@ -49,7 +47,7 @@ function removeEvents (element, eventList, interactionType) { const tapHandler = interactionType ? handleTapMouse : handleTapTouch; eventList.forEach(function (eventName) { - external.$(element).off(eventName, tapHandler); + element.removeEventListener(eventName, tapHandler); }); } diff --git a/src/inputSources/touchInput.js b/src/inputSources/touchInput.js index 3f78bbc29..5d5155871 100755 --- a/src/inputSources/touchInput.js +++ b/src/inputSources/touchInput.js @@ -1,8 +1,10 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import copyPoints from '../util/copyPoints.js'; import pauseEvent from '../util/pauseEvent.js'; import preventGhostClick from '../inputSources/preventGhostClick.js'; import triggerEvent from '../util/triggerEvent.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; let startPoints, currentPoints, @@ -22,6 +24,8 @@ let lastScale = 1.0, const pressDelay = 700, pressMaxDistance = 5; +const toolType = 'touchInput'; + function onTouch (e) { const cornerstone = external.cornerstone; const element = e.currentTarget || e.srcEvent.currentTarget; @@ -35,8 +39,7 @@ function onTouch (e) { e.preventDefault(); // If more than one finger is placed on the element, stop the press timeout - if ((e.pointers && e.pointers.length > 1) || - (e.originalEvent && e.originalEvent.touches && e.originalEvent.touches.length > 1)) { + if ((e.pointers && e.pointers.length > 1) || (e.touches && e.touches.length > 1)) { isPress = false; clearTimeout(pressTimeout); } @@ -57,7 +60,7 @@ function onTouch (e) { }; currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image); - eventType = 'CornerstoneToolsTap'; + eventType = EVENTS.TAP; eventData = { event: e, viewport: cornerstone.getViewport(element), @@ -86,7 +89,7 @@ function onTouch (e) { }; currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image); - eventType = 'CornerstoneToolsDoubleTap'; + eventType = EVENTS.DOUBLE_TAP; eventData = { event: e, viewport: cornerstone.getViewport(element), @@ -125,7 +128,7 @@ function onTouch (e) { }; startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchPinch'; + eventType = EVENTS.TOUCH_PINCH; eventData = { event: e, startPoints, @@ -151,18 +154,18 @@ function onTouch (e) { clearTimeout(touchStartDelay); touchStartDelay = setTimeout(function () { startPoints = { - page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]), - image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY), + page: external.cornerstoneMath.point.pageToPoint(e.touches[0]), + image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY), client: { - x: e.originalEvent.touches[0].clientX, - y: e.originalEvent.touches[0].clientY + x: e.touches[0].clientX, + y: e.touches[0].clientY } }; startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchStart'; - if (e.originalEvent.touches.length > 1) { - eventType = 'CornerstoneToolsMultiTouchStart'; + eventType = EVENTS.TOUCH_START; + if (e.touches.length > 1) { + eventType = EVENTS.MULTI_TOUCH_START; } eventData = { @@ -184,9 +187,9 @@ function onTouch (e) { // No current tools responded to the drag action. // Create new tool measurement - eventType = 'CornerstoneToolsTouchStartActive'; - if (e.originalEvent.touches.length > 1) { - eventType = 'CornerstoneToolsMultiTouchStartActive'; + eventType = EVENTS.TOUCH_START_ACTIVE; + if (e.touches.length > 1) { + eventType = EVENTS.MULTI_TOUCH_START_ACTIVE; } eventData.type = eventType; @@ -205,16 +208,16 @@ function onTouch (e) { } currentPoints = { - page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.touches[0]), - image: cornerstone.pageToPixel(element, e.originalEvent.touches[0].pageX, e.originalEvent.touches[0].pageY), + page: external.cornerstoneMath.point.pageToPoint(e.touches[0]), + image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY), client: { - x: e.originalEvent.touches[0].clientX, - y: e.originalEvent.touches[0].clientY + x: e.touches[0].clientX, + y: e.touches[0].clientY } }; currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchPress'; + eventType = EVENTS.TOUCH_PRESS; eventData = { event: e, viewport: cornerstone.getViewport(element), @@ -239,16 +242,16 @@ function onTouch (e) { setTimeout(function () { startPoints = { - page: external.cornerstoneMath.point.pageToPoint(e.originalEvent.changedTouches[0]), - image: cornerstone.pageToPixel(element, e.originalEvent.changedTouches[0].pageX, e.originalEvent.changedTouches[0].pageY), + page: external.cornerstoneMath.point.pageToPoint(e.changedTouches[0]), + image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY), client: { - x: e.originalEvent.changedTouches[0].clientX, - y: e.originalEvent.changedTouches[0].clientY + x: e.changedTouches[0].clientX, + y: e.changedTouches[0].clientY } }; startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image); - eventType = 'CornerstoneToolsTouchEnd'; + eventType = EVENTS.TOUCH_END; eventData = { event: e, @@ -310,9 +313,9 @@ function onTouch (e) { clearTimeout(pressTimeout); } - eventType = 'CornerstoneToolsTouchDrag'; + eventType = EVENTS.TOUCH_DRAG; if (e.pointers.length > 1) { - eventType = 'CornerstoneToolsMultiTouchDrag'; + eventType = EVENTS.MULTI_TOUCH_DRAG; } eventData = { @@ -379,7 +382,7 @@ function onTouch (e) { canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) }; - eventType = 'CornerstoneToolsDragEnd'; + eventType = EVENTS.TOUCH_DRAG_END; eventData = { event: e.srcEvent, @@ -412,7 +415,7 @@ function onTouch (e) { lastRotation = e.rotation; - eventType = 'CornerstoneToolsTouchRotate'; + eventType = EVENTS.TOUCH_ROTATE; eventData = { event: e.srcEvent, viewport: cornerstone.getViewport(element), @@ -452,7 +455,6 @@ function enable (element) { threshold: 0 }); - // We want to detect both the same time pinch.recognizeWith(pan); pinch.recognizeWith(rotate); rotate.recognizeWith(pan); @@ -472,17 +474,34 @@ function enable (element) { mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch); preventGhostClick.enable(element); - external.$(element).on('touchstart touchend', onTouch); - external.$(element).data('hammer', mc); + + const touchEvents = ['touchstart', 'touchend']; + + touchEvents.forEach((eventType) => { + element.addEventListener(eventType, onTouch); + }); + + const options = getToolOptions(toolType, element); + + options.hammer = mc; + + setToolOptions(toolType, element, options); } function disable (element) { preventGhostClick.disable(element); - external.$(element).off('touchstart touchend', onTouch); - const mc = external.$(element).data('hammer'); + + const touchEvents = ['touchstart', 'touchend']; + + touchEvents.forEach((eventType) => { + element.removeEventListener(eventType, onTouch); + }); + + const options = getToolOptions(toolType, element); + const mc = options.hammer; if (mc) { - mc.off('tap doubletap panstart panmove panend pinchmove rotatemove', onTouch); + mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch); } } diff --git a/src/manipulators/moveAllHandles.js b/src/manipulators/moveAllHandles.js index a7c11209a..c054dc77d 100755 --- a/src/manipulators/moveAllHandles.js +++ b/src/manipulators/moveAllHandles.js @@ -1,13 +1,17 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import anyHandlesOutsideImage from './anyHandlesOutsideImage.js'; import { removeToolState } from '../stateManagement/toolState.js'; import triggerEvent from '../util/triggerEvent.js'; -export default function (mouseEventData, data, toolData, toolType, options, doneMovingCallback) { +export default function (e, data, toolData, toolType, options, doneMovingCallback) { const cornerstone = external.cornerstone; + const mouseEventData = e.detail; const element = mouseEventData.element; - function mouseDragCallback (e, eventData) { + function mouseDragCallback (e) { + const eventData = e.detail; + data.active = true; Object.keys(data.handles).forEach(function (name) { @@ -31,7 +35,7 @@ export default function (mouseEventData, data, toolData, toolType, options, done cornerstone.updateImage(element); - const eventType = 'CornerstoneToolsMeasurementModified'; + const eventType = EVENTS.MEASUREMENT_MODIFIED; const modifiedEventData = { toolType, element, @@ -40,17 +44,20 @@ export default function (mouseEventData, data, toolData, toolType, options, done triggerEvent(element, eventType, modifiedEventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } - external.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + + function mouseUpCallback (e) { + const eventData = e.detail; - function mouseUpCallback (e, eventData) { data.invalidated = true; - external.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); // If any handle is outside the image, delete the tool data if (options.deleteIfHandleOutsideImage === true && @@ -65,8 +72,8 @@ export default function (mouseEventData, data, toolData, toolType, options, done } } - external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); return true; } diff --git a/src/manipulators/moveHandle.js b/src/manipulators/moveHandle.js index 2a8f31a8a..fd21e9373 100755 --- a/src/manipulators/moveHandle.js +++ b/src/manipulators/moveHandle.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -9,7 +10,9 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb y: handle.y - mouseEventData.currentPoints.image.y }; - function mouseDragCallback (e, eventData) { + function mouseDragCallback (e) { + const eventData = e.detail; + if (handle.hasMoved === false) { handle.hasMoved = true; } @@ -28,7 +31,7 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb cornerstone.updateImage(element); - const eventType = 'CornerstoneToolsMeasurementModified'; + const eventType = EVENTS.MEASUREMENT_MODIFIED; const modifiedEventData = { toolType, element, @@ -38,13 +41,13 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb triggerEvent(element, eventType, modifiedEventData); } - external.$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); function mouseUpCallback () { handle.active = false; - external.$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); cornerstone.updateImage(element); if (typeof doneMovingCallback === 'function') { @@ -52,6 +55,6 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb } } - external.$(element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } diff --git a/src/manipulators/moveNewHandle.js b/src/manipulators/moveNewHandle.js index 24b651aa0..1572c40d8 100644 --- a/src/manipulators/moveNewHandle.js +++ b/src/manipulators/moveNewHandle.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -5,7 +6,9 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb const cornerstone = external.cornerstone; const element = mouseEventData.element; - function moveCallback (e, eventData) { + function moveCallback (e) { + const eventData = e.detail; + handle.active = true; handle.x = eventData.currentPoints.image.x; handle.y = eventData.currentPoints.image.y; @@ -20,7 +23,7 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb cornerstone.updateImage(element); - const eventType = 'CornerstoneToolsMeasurementModified'; + const eventType = EVENTS.MEASUREMENT_MODIFIED; const modifiedEventData = { toolType, element, @@ -31,50 +34,54 @@ export default function (mouseEventData, toolType, data, handle, doneMovingCallb } function whichMovement (e) { - external.$(element).off('CornerstoneToolsMouseMove', whichMovement); - external.$(element).off('CornerstoneToolsMouseDrag', whichMovement); + element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement); + element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement); - external.$(element).on('CornerstoneToolsMouseMove', moveCallback); - external.$(element).on('CornerstoneToolsMouseDrag', moveCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, moveCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, moveCallback); - external.$(element).on('CornerstoneToolsMouseClick', moveEndCallback); - if (e.type === 'CornerstoneToolsMouseDrag') { - external.$(element).on('CornerstoneToolsMouseUp', moveEndCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, moveEndCallback); + if (e.type === EVENTS.MOUSE_DRAG) { + element.addEventListener(EVENTS.MOUSE_UP, moveEndCallback); } } - function measurementRemovedCallback (e, eventData) { + function measurementRemovedCallback (e) { + const eventData = e.detail; + if (eventData.measurementData === data) { moveEndCallback(); } } - function toolDeactivatedCallback (e, eventData) { + function toolDeactivatedCallback (e) { + const eventData = e.detail; + if (eventData.toolType === toolType) { - external.$(element).off('CornerstoneToolsMouseMove', moveCallback); - external.$(element).off('CornerstoneToolsMouseDrag', moveCallback); - external.$(element).off('CornerstoneToolsMouseClick', moveEndCallback); - external.$(element).off('CornerstoneToolsMouseUp', moveEndCallback); - external.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback); - external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback); + element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback); + element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback); + element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback); handle.active = false; cornerstone.updateImage(element); } } - external.$(element).on('CornerstoneToolsMouseDrag', whichMovement); - external.$(element).on('CornerstoneToolsMouseMove', whichMovement); - external.$(element).on('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback); - external.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement); + element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement); + element.addEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback); + element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback); function moveEndCallback () { - external.$(element).off('CornerstoneToolsMouseMove', moveCallback); - external.$(element).off('CornerstoneToolsMouseDrag', moveCallback); - external.$(element).off('CornerstoneToolsMouseClick', moveEndCallback); - external.$(element).off('CornerstoneToolsMouseUp', moveEndCallback); - external.$(element).off('CornerstoneToolsMeasurementRemoved', measurementRemovedCallback); - external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback); + element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback); + element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback); + element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback); handle.active = false; cornerstone.updateImage(element); diff --git a/src/manipulators/moveNewHandleTouch.js b/src/manipulators/moveNewHandleTouch.js index 484ca8a8f..23cdb5e49 100644 --- a/src/manipulators/moveNewHandleTouch.js +++ b/src/manipulators/moveNewHandleTouch.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -14,7 +15,9 @@ export default function (eventData, toolType, data, handle, doneMovingCallback, handle.active = true; data.active = true; - function moveCallback (e, eventData) { + function moveCallback (e) { + const eventData = e.detail; + handle.x = eventData.currentPoints.image.x + distanceFromTouch.x; handle.y = eventData.currentPoints.image.y + distanceFromTouch.y; @@ -28,7 +31,7 @@ export default function (eventData, toolType, data, handle, doneMovingCallback, cornerstone.updateImage(element); - const eventType = 'CornerstoneToolsMeasurementModified'; + const eventType = EVENTS.MEASUREMENT_MODIFIED; const modifiedEventData = { toolType, element, @@ -38,15 +41,17 @@ export default function (eventData, toolType, data, handle, doneMovingCallback, triggerEvent(element, eventType, modifiedEventData); } - function moveEndCallback (e, eventData) { - external.$(element).off('CornerstoneToolsTouchDrag', moveCallback); - external.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback); - external.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback); - external.$(element).off('CornerstoneToolsTap', moveEndCallback); - external.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation); - external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + function moveEndCallback (e) { + const eventData = e.detail; + + element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback); + element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback); + element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback); + element.removeEventListener(EVENTS.TAP, moveEndCallback); + element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation); + element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback); - if (e.type === 'CornerstoneToolsTouchPinch' || e.type === 'CornerstoneToolsTouchPress') { + if (e.type === EVENTS.TOUCH_PINCH || e.type === EVENTS.TOUCH_PRESS) { handle.active = false; cornerstone.updateImage(element); doneMovingCallback(); @@ -83,19 +88,19 @@ export default function (eventData, toolType, data, handle, doneMovingCallback, return false; } - external.$(element).on('CornerstoneToolsTouchDrag', moveCallback); - external.$(element).on('CornerstoneToolsTouchPinch', moveEndCallback); - external.$(element).on('CornerstoneToolsTouchEnd', moveEndCallback); - external.$(element).on('CornerstoneToolsTap', moveEndCallback); - external.$(element).on('CornerstoneToolsTouchStart', stopImmediatePropagation); + element.addEventListener(EVENTS.TOUCH_DRAG, moveCallback); + element.addEventListener(EVENTS.TOUCH_PINCH, moveEndCallback); + element.addEventListener(EVENTS.TOUCH_END, moveEndCallback); + element.addEventListener(EVENTS.TAP, moveEndCallback); + element.addEventListener(EVENTS.TOUCH_START, stopImmediatePropagation); function toolDeactivatedCallback () { - external.$(element).off('CornerstoneToolsTouchDrag', moveCallback); - external.$(element).off('CornerstoneToolsTouchPinch', moveEndCallback); - external.$(element).off('CornerstoneToolsTouchEnd', moveEndCallback); - external.$(element).off('CornerstoneToolsTap', moveEndCallback); - external.$(element).off('CornerstoneToolsTouchStart', stopImmediatePropagation); - external.$(element).off('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback); + element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback); + element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback); + element.removeEventListener(EVENTS.TAP, moveEndCallback); + element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation); + element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback); handle.active = false; data.active = false; @@ -113,5 +118,5 @@ export default function (eventData, toolType, data, handle, doneMovingCallback, cornerstone.updateImage(element); } - external.$(element).on('CornerstoneToolsToolDeactivated', toolDeactivatedCallback); + element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback); } diff --git a/src/manipulators/touchMoveAllHandles.js b/src/manipulators/touchMoveAllHandles.js index 80837e0bd..6d0833e86 100644 --- a/src/manipulators/touchMoveAllHandles.js +++ b/src/manipulators/touchMoveAllHandles.js @@ -1,13 +1,17 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import anyHandlesOutsideImage from './anyHandlesOutsideImage.js'; import { removeToolState } from '../stateManagement/toolState.js'; import triggerEvent from '../util/triggerEvent.js'; -export default function (touchEventData, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) { +export default function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) { + const touchEventData = event.detail; const element = touchEventData.element; const cornerstone = external.cornerstone; - function touchDragCallback (e, eventData) { + function touchDragCallback (e) { + const eventData = e.detail; + data.active = true; Object.keys(data.handles).forEach(function (name) { @@ -22,7 +26,7 @@ export default function (touchEventData, data, toolData, toolType, deleteIfHandl }); cornerstone.updateImage(element); - const eventType = 'CornerstoneToolsMeasurementModified'; + const eventType = EVENTS.MEASUREMENT_MODIFIED; const modifiedEventData = { toolType, element, @@ -31,41 +35,46 @@ export default function (touchEventData, data, toolData, toolType, deleteIfHandl triggerEvent(element, eventType, modifiedEventData); - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } - external.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback); + element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback); + + function touchEndCallback (e) { + const eventData = e.detail; - function touchEndCallback (e, eventData) { // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type); data.active = false; data.invalidated = false; - external.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback); - external.$(element).off('CornerstoneToolsTouchPinch', touchEndCallback); - external.$(element).off('CornerstoneToolsTouchPress', touchEndCallback); - external.$(element).off('CornerstoneToolsTouchEnd', touchEndCallback); - external.$(element).off('CornerstoneToolsDragEnd', touchEndCallback); - external.$(element).off('CornerstoneToolsTap', touchEndCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback); + + element.removeEventListener(EVENTS.TOUCH_PINCH, touchEndCallback); + element.removeEventListener(EVENTS.TOUCH_PRESS, touchEndCallback); + element.removeEventListener(EVENTS.TOUCH_END, touchEndCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback); + element.removeEventListener(EVENTS.TAP, touchEndCallback); // If any handle is outside the image, delete the tool data - if (deleteIfHandleOutsideImage === true && - anyHandlesOutsideImage(eventData, data.handles)) { + const handlesOutsideImage = anyHandlesOutsideImage(eventData, data.handles); + + if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) { removeToolState(element, toolType, data); } cornerstone.updateImage(element); if (typeof doneMovingCallback === 'function') { - doneMovingCallback(e, eventData); + doneMovingCallback(e); } } - external.$(element).on('CornerstoneToolsTouchPinch', touchEndCallback); - external.$(element).on('CornerstoneToolsTouchPress', touchEndCallback); - external.$(element).on('CornerstoneToolsTouchEnd', touchEndCallback); - external.$(element).on('CornerstoneToolsDragEnd', touchEndCallback); - external.$(element).on('CornerstoneToolsTap', touchEndCallback); + element.addEventListener(EVENTS.TOUCH_PINCH, touchEndCallback); + element.addEventListener(EVENTS.TOUCH_PRESS, touchEndCallback); + element.addEventListener(EVENTS.TOUCH_END, touchEndCallback); + element.addEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback); + element.addEventListener(EVENTS.TAP, touchEndCallback); return true; } diff --git a/src/manipulators/touchMoveHandle.js b/src/manipulators/touchMoveHandle.js index 6a96655b0..088adba96 100755 --- a/src/manipulators/touchMoveHandle.js +++ b/src/manipulators/touchMoveHandle.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -9,12 +10,13 @@ const runAnimation = { value: false }; -const touchEndEvents = ['CornerstoneToolsTouchEnd', - 'CornerstoneToolsDragEnd', - 'CornerstoneToolsTouchPinch', - 'CornerstoneToolsTouchPress', - 'CornerstoneToolsTap' -].join(' '); +const touchEndEvents = [ + EVENTS.TOUCH_END, + EVENTS.TOUCH_DRAG_END, + EVENTS.TOUCH_PINCH, + EVENTS.TOUCH_PRESS, + EVENTS.TAP +]; function animate (lastTime, handle, runAnimation, enabledElement, targetLocation) { // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/ @@ -31,7 +33,6 @@ function animate (lastTime, handle, runAnimation, enabledElement, targetLocation const distanceRemaining = Math.abs(handle.y - targetLocation.y); const linearDistEachFrame = distanceRemaining / 10; - console.log(`distanceRemaining: ${distanceRemaining}`); if (distanceRemaining < 1) { handle.y = targetLocation.y; runAnimation.value = false; @@ -54,10 +55,11 @@ function animate (lastTime, handle, runAnimation, enabledElement, targetLocation }); } -export default function (touchEventData, toolType, data, handle, doneMovingCallback) { +export default function (event, toolType, data, handle, doneMovingCallback) { // Console.log('touchMoveHandle'); runAnimation.value = true; + const touchEventData = event.detail; const cornerstone = external.cornerstone; const element = touchEventData.element; const enabledElement = cornerstone.getEnabledElement(element); @@ -75,7 +77,9 @@ export default function (touchEventData, toolType, data, handle, doneMovingCallb let targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y); - function touchDragCallback (e, eventData) { + function touchDragCallback (e) { + const eventData = e.detail; + // Console.log('touchMoveHandle touchDragCallback: ' + e.type); runAnimation.value = false; @@ -97,7 +101,7 @@ export default function (touchEventData, toolType, data, handle, doneMovingCallb cornerstone.updateImage(element); - const eventType = 'CornerstoneToolsMeasurementModified'; + const eventType = EVENTS.MEASUREMENT_MODIFIED; const modifiedEventData = { toolType, element, @@ -107,19 +111,23 @@ export default function (touchEventData, toolType, data, handle, doneMovingCallb triggerEvent(element, eventType, modifiedEventData); } - external.$(element).on('CornerstoneToolsTouchDrag', touchDragCallback); + element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback); - function touchEndCallback (e, eventData) { + function touchEndCallback (e) { + const eventData = e.detail; // Console.log('touchMoveHandle touchEndCallback: ' + e.type); + runAnimation.value = false; handle.active = false; - external.$(element).off('CornerstoneToolsTouchDrag', touchDragCallback); - external.$(element).off(touchEndEvents, touchEndCallback); + element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback); + touchEndEvents.forEach((eventType) => { + element.removeEventListener(eventType, touchEndCallback); + }); cornerstone.updateImage(element); - if (e.type === 'CornerstoneToolsTouchPress') { + if (e.type === EVENTS.TOUCH_PRESS) { eventData.handlePressed = data; handle.x = touchEventData.currentPoints.image.x; @@ -127,11 +135,13 @@ export default function (touchEventData, toolType, data, handle, doneMovingCallb } if (typeof doneMovingCallback === 'function') { - doneMovingCallback(e, eventData); + doneMovingCallback(e); } } - external.$(element).on(touchEndEvents, touchEndCallback); + touchEndEvents.forEach((eventType) => { + element.addEventListener(eventType, touchEndCallback); + }); animate(time, handle, runAnimation, enabledElement, targetLocation); } diff --git a/src/measurementManager/lineSampleMeasurement.js b/src/measurementManager/lineSampleMeasurement.js index 19981261e..aa3ebabb2 100644 --- a/src/measurementManager/lineSampleMeasurement.js +++ b/src/measurementManager/lineSampleMeasurement.js @@ -1,16 +1,17 @@ +import EVENTS from '../events.js'; +import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; // This object manages a collection of measurements export default function () { - + const cornerstone = external.cornerstone; const that = this; that.samples = []; - // Adds an element as both a source and a target this.set = function (samples) { that.samples = samples; // Fire event - triggerEvent(that, 'CornerstoneLineSampleUpdated'); + triggerEvent(cornerstone.events, EVENTS.LINE_SAMPLE_UPDATED); }; } diff --git a/src/measurementManager/measurementManager.js b/src/measurementManager/measurementManager.js index bfc1ef294..74e35005e 100644 --- a/src/measurementManager/measurementManager.js +++ b/src/measurementManager/measurementManager.js @@ -1,7 +1,10 @@ +import EVENTS from '../events.js'; +import external from '../externalModules.js'; import triggerEvent from '../util/triggerEvent.js'; // This object manages a collection of measurements function MeasurementManager () { + const cornerstone = external.cornerstone; const that = this; that.measurements = []; @@ -15,7 +18,7 @@ function MeasurementManager () { measurement }; - triggerEvent(that, 'CornerstoneMeasurementAdded', eventDetail); + triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_ADDED, eventDetail); }; this.remove = function (index) { @@ -28,7 +31,7 @@ function MeasurementManager () { measurement }; - triggerEvent(that, 'CornerstoneMeasurementRemoved', eventDetail); + triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_REMOVED, eventDetail); }; } diff --git a/src/paintingTools/adaptiveBrush.js b/src/paintingTools/adaptiveBrush.js index 4967cbe00..18ee90fff 100644 --- a/src/paintingTools/adaptiveBrush.js +++ b/src/paintingTools/adaptiveBrush.js @@ -128,7 +128,9 @@ function erase (eventData) { external.cornerstone.updateImage(element); } -function onMouseUp (e, eventData) { +function onMouseUp (e) { + const eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; const configuration = adaptiveBrush.getConfiguration(); @@ -137,7 +139,9 @@ function onMouseUp (e, eventData) { external.cornerstone.updateImage(eventData.element); } -function onMouseDown (e, eventData) { +function onMouseDown (e) { + const eventData = e.detail; + const element = eventData.element; const configuration = adaptiveBrush.getConfiguration(); const layer = external.cornerstone.getLayer(element, configuration.brushLayerId); @@ -157,12 +161,16 @@ function onMouseDown (e, eventData) { lastImageCoords = eventData.currentPoints.image; } -function onMouseMove (e, eventData) { +function onMouseMove (e) { + const eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; external.cornerstone.updateImage(eventData.element); } -function onDrag (e, eventData) { +function onDrag (e) { + const eventData = e.detail; + if (configuration.draw === 0) { erase(eventData); } else { @@ -173,7 +181,9 @@ function onDrag (e, eventData) { lastImageCoords = eventData.currentPoints.image; } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + if (!lastImageCoords) { return; } diff --git a/src/paintingTools/brush.js b/src/paintingTools/brush.js index aecd1aa1e..a4cfedb9c 100644 --- a/src/paintingTools/brush.js +++ b/src/paintingTools/brush.js @@ -42,29 +42,39 @@ function paint (eventData) { external.cornerstone.updateImage(element); } -function onMouseUp (e, eventData) { +function onMouseUp (e) { + const eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; dragging = false; } -function onMouseDown (e, eventData) { +function onMouseDown (e) { + const eventData = e.detail; + paint(eventData); dragging = true; lastImageCoords = eventData.currentPoints.image; } -function onMouseMove (e, eventData) { +function onMouseMove (e) { + const eventData = e.detail; + lastImageCoords = eventData.currentPoints.image; external.cornerstone.updateImage(eventData.element); } -function onDrag (e, eventData) { +function onDrag (e) { + const eventData = e.detail; + paint(eventData); dragging = true; lastImageCoords = eventData.currentPoints.image; } -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; + if (!lastImageCoords) { return; } diff --git a/src/paintingTools/brushTool.js b/src/paintingTools/brushTool.js index d412bfb21..59c438de0 100644 --- a/src/paintingTools/brushTool.js +++ b/src/paintingTools/brushTool.js @@ -1,43 +1,54 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import { getToolState, addToolState } from '../stateManagement/toolState.js'; import mouseButtonTool from '../imageTools/mouseButtonTool.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; const TOOL_STATE_TOOL_TYPE = 'brush'; let brushLayerId; -export default function (brushToolInterface) { - function mouseMoveCallback (e, eventData) { - brushToolInterface.onMouseMove(e, eventData); +export default function brushTool (brushToolInterface) { + const toolType = brushToolInterface.toolType; + + function mouseMoveCallback (e) { + brushToolInterface.onMouseMove(e); } - function mouseUpCallback (e, eventData) { - brushToolInterface.onMouseUp(e, eventData); + function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; - external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseMoveCallback); - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); + brushToolInterface.onMouseUp(e); + + element.removeEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } - function dragCallback (e, eventData) { - brushToolInterface.onDrag(e, eventData); + function dragCallback (e) { + brushToolInterface.onDrag(e); return false; } - function mouseDownActivateCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { - external.$(eventData.element).on('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); - brushToolInterface.onMouseDown(e, eventData); + function mouseDownActivateCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); + brushToolInterface.onMouseDown(e); return false; } - external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseMoveCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); } function onImageRendered (e) { @@ -60,24 +71,22 @@ export default function (brushToolInterface) { external.cornerstone.updateImage(element); - // Note: This is to maintain compatibility with jQuery event handlers. - // On our next migration this should just be onImageRendered(e) - brushToolInterface.onImageRendered(e, eventData); + brushToolInterface.onImageRendered(e); } function activate (element, mouseButtonMask) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + setToolOptions(toolType, element, { mouseButtonMask }); - const eventData = { - mouseButtonMask - }; + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); - external.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownActivateCallback); + // TODO: Fix jQuery event + element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); - external.$(element).on('CornerstoneToolsMouseMove', mouseMoveCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); + element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); const enabledElement = external.cornerstone.getEnabledElement(element); const { width, height } = enabledElement.image; @@ -144,9 +153,9 @@ export default function (brushToolInterface) { } function deactivate (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - external.$(element).off('CornerstoneToolsMouseDownActivate', mouseDownActivateCallback); - external.$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback); + element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback); } const brushTool = mouseButtonTool({ diff --git a/src/referenceLines/referenceLinesTool.js b/src/referenceLines/referenceLinesTool.js index 71923ab11..4df4d8da9 100644 --- a/src/referenceLines/referenceLinesTool.js +++ b/src/referenceLines/referenceLinesTool.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import { addToolState, getToolState } from '../stateManagement/toolState.js'; import renderActiveReferenceLine from './renderActiveReferenceLine.js'; @@ -48,14 +49,14 @@ function enable (element, synchronizationContext, renderer) { renderer }); - element.removeEventListener('cornerstoneimagerendered', onImageRendered); - element.addEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); + element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); external.cornerstone.updateImage(element); } // Disables the reference line tool for the given element function disable (element) { - element.removeEventListener('cornerstoneimagerendered', onImageRendered); + element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered); external.cornerstone.updateImage(element); } diff --git a/src/requestPool/requestPoolManager.js b/src/requestPool/requestPoolManager.js index 54b30dd7d..edb2066f4 100644 --- a/src/requestPool/requestPoolManager.js +++ b/src/requestPool/requestPoolManager.js @@ -41,10 +41,10 @@ function addRequest (element, imageId, type, preventCache, doneCallback, failCal }; // If this imageId is in the cache, resolve it immediately - const imagePromise = external.cornerstone.imageCache.getImagePromise(imageId); + const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId); - if (imagePromise) { - imagePromise.then(function (image) { + if (imageLoadObject) { + imageLoadObject.promise.then(function (image) { doneCallback(image); }, function (error) { failCallback(error); @@ -89,12 +89,12 @@ function sendRequest (requestDetails) { const failCallback = requestDetails.failCallback; // Check if we already have this image promise in the cache - const imagePromise = cornerstone.imageCache.getImagePromise(imageId); + const imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId); - if (imagePromise) { + if (imageLoadObject) { // If we do, remove from list (when resolved, as we could have // Pending prefetch requests) and stop processing this iteration - imagePromise.then(function (image) { + imageLoadObject.promise.then(function (image) { numRequests[type]--; // Console.log(numRequests); diff --git a/src/stackTools/playClip.js b/src/stackTools/playClip.js index bba55ca59..b16724d33 100755 --- a/src/stackTools/playClip.js +++ b/src/stackTools/playClip.js @@ -1,4 +1,5 @@ /* eslint no-bitwise:0 */ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import loadHandlerManager from '../stateManagement/loadHandlerManager.js'; import { addToolState, getToolState } from '../stateManagement/toolState.js'; @@ -85,7 +86,7 @@ function triggerStopEvent (element) { element }; - triggerEvent(element, 'CornerstoneToolsClipStopped', eventDetail); + triggerEvent(element, EVENTS.CLIP_STOPPED, eventDetail); } /** diff --git a/src/stackTools/scrollIndicator.js b/src/stackTools/scrollIndicator.js index acc5e4ab9..394eeaffa 100644 --- a/src/stackTools/scrollIndicator.js +++ b/src/stackTools/scrollIndicator.js @@ -12,7 +12,8 @@ const configuration = { orientation: 'horizontal' }; -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const eventData = e.detail; const element = eventData.element; const width = eventData.enabledElement.canvas.width; const height = eventData.enabledElement.canvas.height; diff --git a/src/stackTools/stackPrefetch.js b/src/stackTools/stackPrefetch.js index 5ae48de60..ddc0c400a 100755 --- a/src/stackTools/stackPrefetch.js +++ b/src/stackTools/stackPrefetch.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import requestPoolManager from '../requestPool/requestPoolManager.js'; import loadHandlerManager from '../stateManagement/loadHandlerManager.js'; @@ -113,9 +114,9 @@ function prefetch (element) { return; } - const imagePromise = external.cornerstone.imageCache.getImagePromise(imageId); + const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId); - if (imagePromise && imagePromise.state() === 'resolved') { + if (imageLoadObject) { removeFromList(imageIdIndex); } }); @@ -283,22 +284,22 @@ function enable (element) { prefetch(element); - element.removeEventListener('cornerstonenewimage', onImageUpdated); - element.addEventListener('cornerstonenewimage', onImageUpdated); + element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated); + element.addEventListener(EVENTS.NEW_IMAGE, onImageUpdated); const promiseRemovedHandler = getPromiseRemovedHandler(element); - external.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler); - external.cornerstone.events.addEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler); + external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); + external.cornerstone.events.addEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); } function disable (element) { clearTimeout(resetPrefetchTimeout); - element.removeEventListener('cornerstonenewimage', onImageUpdated); + element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated); const promiseRemovedHandler = getPromiseRemovedHandler(element); - external.cornerstone.events.removeEventListener('cornerstoneimagecachepromiseremoved', promiseRemovedHandler); + external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); const stackPrefetchData = getToolState(element, toolType); // If there is actually something to disable, disable it diff --git a/src/stackTools/stackScroll.js b/src/stackTools/stackScroll.js index 0328d559f..bdb4c56f9 100755 --- a/src/stackTools/stackScroll.js +++ b/src/stackTools/stackScroll.js @@ -1,4 +1,4 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; import touchDragTool from '../imageTools/touchDragTool.js'; import multiTouchDragTool from '../imageTools/multiTouchDragTool.js'; import simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js'; @@ -6,29 +6,40 @@ import mouseWheelTool from '../imageTools/mouseWheelTool.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import scroll from '../util/scroll.js'; import { getToolState } from '../stateManagement/toolState.js'; +import { getToolOptions } from '../enabledElementTools.js'; -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', dragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +const toolType = 'stackScroll'; + +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); + + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { const mouseDragEventData = { deltaY: 0 }; - external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, dragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragEventData, dragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); e.stopImmediatePropagation(); return false; } } -function mouseWheelCallback (e, eventData) { +function mouseWheelCallback (e) { + const eventData = e.detail; const images = -eventData.direction; const config = stackScroll.getConfiguration(); @@ -42,7 +53,8 @@ function mouseWheelCallback (e, eventData) { scroll(eventData.element, images, loop); } -function dragCallback (e, eventData) { +function dragCallback (e) { + const eventData = e.detail; const element = eventData.element; const toolData = getToolState(element, 'stack'); @@ -56,7 +68,7 @@ function dragCallback (e, eventData) { const config = stackScroll.getConfiguration(); // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks - let pixelsPerImage = Math.max(2, external.$(element).height() / Math.max(stackData.imageIds.length, 8)); + let pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8)); if (config && config.stackScrollSpeed) { pixelsPerImage = config.stackScrollSpeed; @@ -73,11 +85,12 @@ function dragCallback (e, eventData) { scroll(element, imageIdIndexOffset); } - return false; // False = causes jquery to preventDefault() and stopPropagation() this event + e.preventDefault(); + e.stopPropagation(); } // Module/private exports -const stackScroll = simpleMouseButtonTool(mouseDownCallback); +const stackScroll = simpleMouseButtonTool(mouseDownCallback, toolType); const stackScrollWheel = mouseWheelTool(mouseWheelCallback); const options = { @@ -87,11 +100,12 @@ const options = { }; const stackScrollTouchDrag = touchDragTool(dragCallback, options); -function multiTouchDragCallback (e, eventData) { +function multiTouchDragCallback (e) { + const eventData = e.detail; const config = stackScrollMultiTouch.getConfiguration(); if (config && config.testPointers(eventData)) { - dragCallback(e, eventData); + dragCallback(e); } } diff --git a/src/stackTools/stackScrollKeyboard.js b/src/stackTools/stackScrollKeyboard.js index 2fbcd6cd8..d61917c64 100644 --- a/src/stackTools/stackScrollKeyboard.js +++ b/src/stackTools/stackScrollKeyboard.js @@ -6,7 +6,8 @@ const keys = { DOWN: 40 }; -function keyDownCallback (e, eventData) { +function keyDownCallback (e) { + const eventData = e.detail; const keyCode = eventData.keyCode; if (keyCode !== keys.UP && keyCode !== keys.DOWN) { diff --git a/src/stateManagement/toolState.js b/src/stateManagement/toolState.js index 542de5762..6be61ec33 100755 --- a/src/stateManagement/toolState.js +++ b/src/stateManagement/toolState.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js'; import triggerEvent from '../util/triggerEvent.js'; @@ -21,7 +22,7 @@ function addToolState (element, toolType, measurementData) { toolStateManager.add(element, toolType, measurementData); - const eventType = 'CornerstoneToolsMeasurementAdded'; + const eventType = EVENTS.MEASUREMENT_ADDED; const eventData = { toolType, element, @@ -55,7 +56,7 @@ function removeToolState (element, toolType, data) { if (indexOfData !== -1) { toolData.data.splice(indexOfData, 1); - const eventType = 'CornerstoneToolsMeasurementRemoved'; + const eventType = EVENTS.MEASUREMENT_REMOVED; const eventData = { toolType, element, diff --git a/src/synchronization/Synchronizer.js b/src/synchronization/Synchronizer.js index 99ff6ec49..61b4254fe 100644 --- a/src/synchronization/Synchronizer.js +++ b/src/synchronization/Synchronizer.js @@ -1,6 +1,13 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import convertToVector3 from '../util/convertToVector3.js'; +function unique (array) { + return array.filter(function (value, index, self) { + return self.indexOf(value) === index; + }); +} + // This object is responsible for synchronizing target elements when an event fires on a source // Element function Synchronizer (event, handler) { @@ -132,7 +139,9 @@ function Synchronizer (event, handler) { ignoreFiredEvents = false; } - function onEvent (e, eventData) { + function onEvent (e) { + const eventData = e.detail; + if (ignoreFiredEvents === true) { return; } @@ -153,7 +162,7 @@ function Synchronizer (event, handler) { sourceElements.push(element); // Subscribe to the event - external.$(element).on(event, onEvent); + element.addEventListener(event, onEvent); // Update the initial distances between elements that.getDistances(); @@ -201,7 +210,7 @@ function Synchronizer (event, handler) { sourceElements.splice(index, 1); // Stop listening for the event - external.$(element).off(event, onEvent); + element.removeEventListener(event, onEvent); // Update the initial distances between elements that.getDistances(); @@ -266,16 +275,16 @@ function Synchronizer (event, handler) { } this.updateDisableHandlers = function () { - const elements = external.$.unique(sourceElements.concat(targetElements)); + const elements = unique(sourceElements.concat(targetElements)); elements.forEach(function (element) { - element.removeEventListener('cornerstoneelementdisabled', disableHandler); - element.addEventListener('cornerstoneelementdisabled', disableHandler); + element.removeEventListener(EVENTS.ELEMENT_DISABLED, disableHandler); + element.addEventListener(EVENTS.ELEMENT_DISABLED, disableHandler); }); }; this.destroy = function () { - const elements = external.$.unique(sourceElements.concat(targetElements)); + const elements = unique(sourceElements.concat(targetElements)); elements.forEach(function (element) { that.remove(element); diff --git a/src/timeSeriesTools/probeTool4D.js b/src/timeSeriesTools/probeTool4D.js index 391d80262..53fcba040 100644 --- a/src/timeSeriesTools/probeTool4D.js +++ b/src/timeSeriesTools/probeTool4D.js @@ -1,10 +1,11 @@ import external from '../externalModules.js'; import mouseButtonTool from '../imageTools/mouseButtonTool.js'; import drawHandles from '../manipulators/drawHandles.js'; -import setContextToDisplayFontSize from '../util/setContextToDisplayFontSize.js'; import { getToolState } from '../stateManagement/toolState.js'; import MeasurementManager from '../measurementManager/measurementManager.js'; import LineSampleMeasurement from '../measurementManager/lineSampleMeasurement.js'; +import textStyle from '../stateManagement/textStyle.js'; +import drawTextBox from '../util/drawTextBox.js'; const toolType = 'probe4D'; @@ -66,7 +67,9 @@ function createNewMeasurement (mouseEventData) { // /////// BEGIN IMAGE RENDERING /////// -function onImageRendered (e, eventData) { +function onImageRendered (e) { + const cornerstone = external.cornerstone; + const eventData = e.detail; // If we have no toolData for this element, return immediately as there is nothing to do const toolData = getToolState(e.currentTarget, toolType); @@ -75,10 +78,12 @@ function onImageRendered (e, eventData) { } // We have tool data for this element - iterate over each one and draw it - const context = eventData.canvasContext.canvas.getContext('2d'); + const context = eventData.canvasContext; + + context.setTransform(1, 0, 0, 1, 0, 0); - external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context); const color = 'white'; + const font = textStyle.getFont(); for (let i = 0; i < toolData.data.length; i++) { context.save(); @@ -89,20 +94,19 @@ function onImageRendered (e, eventData) { drawHandles(context, eventData, data.handles, color); context.stroke(); - // Draw text - const fontParameters = setContextToDisplayFontSize(eventData.enabledElement, eventData.canvasContext, 15); + context.font = font; - context.font = `${fontParameters.fontSize}px Arial`; + const coords = { + // Translate the x/y away from the cursor + x: data.handles.end.x + 3, + y: data.handles.end.y - 3 + }; - // Translate the x/y away from the cursor - const x = Math.round(data.handles.end.x); - const y = Math.round(data.handles.end.y); - const textX = data.handles.end.x + 3; - const textY = data.handles.end.y - 3; + const textCoords = cornerstone.pixelToCanvas(eventData.element, coords); context.fillStyle = color; - context.fillText(`${x},${y}`, textX, textY); + drawTextBox(context, `${data.handles.end.x}, ${data.handles.end.y}`, textCoords.x, textCoords.y, color); context.restore(); } diff --git a/src/timeSeriesTools/timeSeriesScroll.js b/src/timeSeriesTools/timeSeriesScroll.js index d3025b41e..67bcea1f2 100644 --- a/src/timeSeriesTools/timeSeriesScroll.js +++ b/src/timeSeriesTools/timeSeriesScroll.js @@ -1,35 +1,46 @@ -import external from '../externalModules.js'; +import EVENTS from '../events.js'; import simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js'; import touchDragTool from '../imageTools/touchDragTool.js'; import mouseWheelTool from '../imageTools/mouseWheelTool.js'; import incrementTimePoint from './incrementTimePoint.js'; import isMouseButtonEnabled from '../util/isMouseButtonEnabled.js'; import { getToolState } from '../stateManagement/toolState.js'; +import { setToolOptions, getToolOptions } from '../enabledElementTools.js'; -function mouseUpCallback (e, eventData) { - external.$(eventData.element).off('CornerstoneToolsMouseDrag', mouseDragCallback); - external.$(eventData.element).off('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).off('CornerstoneToolsMouseClick', mouseUpCallback); +const toolType = 'timeSeriesScroll'; + +function mouseUpCallback (e) { + const eventData = e.detail; + const element = eventData.element; + + element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); } -function mouseDownCallback (e, eventData) { - if (isMouseButtonEnabled(eventData.which, e.data.mouseButtonMask)) { +function mouseDownCallback (e) { + const eventData = e.detail; + const element = eventData.element; + const options = getToolOptions(toolType, element); - const mouseDragEventData = { - deltaY: 0, - options: e.data.options - }; + if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) { + options.deltaY = 0; - external.$(eventData.element).on('CornerstoneToolsMouseDrag', mouseDragEventData, mouseDragCallback); - external.$(eventData.element).on('CornerstoneToolsMouseUp', mouseUpCallback); - external.$(eventData.element).on('CornerstoneToolsMouseClick', mouseUpCallback); + setToolOptions(toolType, element, options); + + element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback); + element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback); + element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback); e.stopImmediatePropagation(); return false; } } -function mouseDragCallback (e, eventData) { +function mouseDragCallback (e) { + const eventData = e.detail; + const element = eventData.element; + e.data.deltaY += eventData.deltaPoints.page.y; const toolData = getToolState(eventData.element, 'timeSeries'); @@ -40,7 +51,7 @@ function mouseDragCallback (e, eventData) { const timeSeriesData = toolData.data[0]; - let pixelsPerTimeSeries = external.$(eventData.element).height() / timeSeriesData.stacks.length; + let pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length; if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) { pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed; @@ -57,7 +68,8 @@ function mouseDragCallback (e, eventData) { return false; // False = cases jquery to preventDefault() and stopPropagation() this event } -function mouseWheelCallback (e, eventData) { +function mouseWheelCallback (e) { + const eventData = e.detail; const images = -eventData.direction; incrementTimePoint(eventData.element, images); @@ -89,7 +101,7 @@ function onDrag (e) { } // Module/private exports -const timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback); +const timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback, toolType); const timeSeriesScrollWheel = mouseWheelTool(mouseWheelCallback); const timeSeriesScrollTouchDrag = touchDragTool(onDrag); diff --git a/src/util/scrollToIndex.js b/src/util/scrollToIndex.js index 824e3c85e..05e9c6fbe 100644 --- a/src/util/scrollToIndex.js +++ b/src/util/scrollToIndex.js @@ -1,3 +1,4 @@ +import EVENTS from '../events.js'; import external from '../externalModules.js'; import { getToolState } from '../stateManagement/toolState.js'; import requestPoolManager from '../requestPool/requestPoolManager.js'; @@ -90,11 +91,12 @@ export default function (element, newImageIdIndex) { const config = stackScroll.getConfiguration(); if (config && config.retryLoadOnScroll === true) { - const newImagePromise = cornerstone.imageCache.getImagePromise(newImageId); + // Const newImageLoadObject = cornerstone.imageCache.getImageLoadObject(newImageId); - if (newImagePromise && newImagePromise.state() === 'rejected') { + // TODO: No way to check state of Promise. No way to know if it is rejected. + /* If (newImageLoadObject && newImagePromise.state() === 'rejected') { cornerstone.imageCache.removeImagePromise(newImageId); - } + }*/ } // Convert the preventCache value in stack data to a boolean @@ -112,5 +114,5 @@ export default function (element, newImageIdIndex) { // Make sure we kick off any changed download request pools requestPoolManager.startGrabbing(); - triggerEvent(element, 'CornerstoneStackScroll', eventData); + triggerEvent(element, EVENTS.STACK_SCROLL, eventData); } diff --git a/src/util/triggerEvent.js b/src/util/triggerEvent.js index e7727fb3c..4c3249d7a 100644 --- a/src/util/triggerEvent.js +++ b/src/util/triggerEvent.js @@ -1,33 +1,23 @@ -import external from '../externalModules.js'; - /** * Trigger a CustomEvent * * @param {EventTarget} el The element or EventTarget to trigger the event upon * @param {String} type The event type name * @param {Object|null} detail=null The event data to be sent - * @returns {boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. + * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. */ export default function triggerEvent (el, type, detail = null) { let event; // This check is needed to polyfill CustomEvent on IE11- if (typeof window.CustomEvent === 'function') { - event = new CustomEvent(type.toLocaleLowerCase(), { + event = new CustomEvent(type, { detail, cancelable: true }); } else { event = document.createEvent('CustomEvent'); - event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail); - } - - // TODO: remove jQuery event triggers - const jqEvent = external.$.Event(type, detail); - - external.$(el).trigger(jqEvent, detail); - if (jqEvent.isImmediatePropagationStopped()) { - return false; + event.initCustomEvent(type, true, true, detail); } return el.dispatchEvent(event); diff --git a/src/version.js b/src/version.js index daa824635..ff603d700 100644 --- a/src/version.js +++ b/src/version.js @@ -1 +1 @@ -export default '1.1.2'; +export default '2.0.0';