{"version":3,"sources":["webpack:///./node_modules/svg-pan-zoom/src/browserify.js","webpack:///./node_modules/svg-pan-zoom/src/control-icons.js","webpack:///./node_modules/svg-pan-zoom/src/shadow-viewport.js","webpack:///./node_modules/svg-pan-zoom/src/svg-utilities.js","webpack:///./node_modules/svg-pan-zoom/src/utilities.js","webpack:///./node_modules/svg-pan-zoom/src/svg-pan-zoom.js","webpack:///./node_modules/svg-pan-zoom/src/uniwheel.js"],"names":["SvgPanZoom","module","exports","SvgUtils","enable","instance","defs","svg","querySelector","document","createElementNS","svgNS","appendChild","style","setAttribute","textContent","zoomGroup","width","height","this","_createZoomIn","_createZoomReset","_createZoomOut","controlIcons","zoomIn","addEventListener","getPublicInstance","zoomInBackground","zoomInShape","resetPanZoomControl","reset","resetPanZoomControlBackground","resetPanZoomControlShape1","resetPanZoomControlShape2","zoomOut","zoomOutBackground","zoomOutShape","disable","parentNode","removeChild","Utils","ShadowViewport","viewport","options","init","prototype","originalState","zoom","x","y","activeState","updateCTMCached","proxy","updateCTM","requestAnimationFrame","createRequestAnimationFrame","refreshRate","viewBox","cacheViewBox","newCTM","processCTM","setCTM","svgViewBox","getAttribute","viewBoxValues","split","filter","v","map","parseFloat","Math","min","updateCTMOnNextFrame","removeAttribute","simpleViewBoxCache","bBox","getBBox","getViewBox","extend","newScale","getCTM","fit","contain","max","a","d","e","f","center","offsetX","offsetY","getOriginalState","getState","getZoom","getRelativeZoom","computeRelativeZoom","scale","getPan","safeCTM","createSVGMatrix","b","c","willZoom","isZoomDifferent","willPan","isPanDifferent","beforeZoom","updateCache","onZoom","preventPan","beforePan","preventPanX","preventPanY","isObject","isNumber","onPan","pendingUpdate","call","window","ctm","onUpdatedCTM","_browser","documentMode","xmlNS","xmlnsNS","xlinkNS","evNS","getBoundingClientRectNormalized","clientWidth","clientHeight","getBoundingClientRect","Error","getOrCreateViewport","selector","isElement","childNodes","Array","slice","children","el","nodeName","length","viewportId","Date","toISOString","replace","svgChildren","i","classNames","indexOf","push","join","setupSvgAttributes","setAttributeNS","toLowerCase","internetExplorerRedisplayInterval","refreshDefsGlobal","throttle","allDefs","querySelectorAll","allDefsCount","thisDefs","insertBefore","element","matrix","that","s","transform","setTimeout","getEventPoint","evt","point","createSVGPoint","mouseAndTouchNormalize","clientX","clientY","getSvgCenterPoint","requestTimeout","timeout","callback","target","source","prop","o","HTMLElement","SVGElement","SVGSVGElement","nodeType","Object","toString","n","isNaN","isFinite","getSvg","elementOrSelector","String","tagName","contentDocument","documentElement","getSVGDocument","fn","context","apply","arguments","getType","touches","pageX","rect","left","pageY","top","originalEvent","isDblClick","prevEvt","detail","timeStampDiff","timeStamp","touchesDistance","sqrt","pow","now","getTime","func","wait","args","result","previous","later","leading","remaining","clearTimeout","trailing","floor","Wheel","ControlIcons","optionsDefaults","viewportSelector","panEnabled","controlIconsEnabled","zoomEnabled","dblClickZoomEnabled","mouseWheelZoomEnabled","preventMouseEventsDefault","zoomScaleSensitivity","minZoom","maxZoom","customEventsHandler","eventsListenerElement","state","boundingClientRectNormalized","oldScale","oldPoint","newPoint","publicInstance","setBeforeZoom","setOnZoom","setBeforePan","setOnPan","setOnUpdatedCTM","lastMouseWheelEventTime","setupHandlers","eventListeners","mousedown","handleMouseDown","touchstart","mouseup","handleMouseUp","touchend","mousemove","handleMouseMove","touchmove","mouseleave","touchleave","touchcancel","svgElement","haltEventListeners","hasOwnProperty","event","enableMouseWheelZoom","wheelListener","handleMouseWheel","on","disableMouseWheelZoom","off","preventDefault","returnValue","delta","deltaY","timeDelta","divider","deltaMode","wheelDelta","abs","log","inversedScreenCTM","getScreenCTM","inverse","relativeMousePoint","matrixTransform","zoomAtPoint","zoomScale","zoomAbsolute","oldCTM","relativePoint","modifier","translate","multiply","absolute","publicZoom","computeFromRelativeZoom","publicZoomAtPoint","resetZoom","resetPan","pan","handleDblClick","zoomFactor","shiftKey","firstEventCTM","stateOrigin","viewportCTM","updateBBox","panBy","resize","disableControlIcons","enableControlIcons","destroy","removeEventListener","instancesStore","pi","enablePan","disablePan","isPanEnabled","enableZoom","disableZoom","isZoomEnabled","isControlIconsEnabled","enableDblClickZoom","disableDblClickZoom","isDblClickZoomEnabled","isMouseWheelZoomEnabled","setZoomScaleSensitivity","setMinZoom","setMaxZoom","zoomBy","zoomAtPointBy","getSizes","realZoom","_addEventListener","_removeEventListener","support","prefix","fns","_addWheelListener","elem","eventName","useCapture","cb","capture","srcElement","type","deltaX","delatZ","wheelDeltaX","createCallback","_removeWheelListener","getCallback","splice","removeCallback","createElement","undefined","onmousewheel"],"mappings":"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","file":"vendor.svg-pan-zoom.bcd1af2c262870fd4ab2.chunk.js","sourcesContent":["var SvgPanZoom = require('./svg-pan-zoom.js');\n\nmodule.exports = SvgPanZoom;\n","var SvgUtils = require('./svg-utilities');\n\nmodule.exports = {\n enable: function(instance) {\n // Select (and create if necessary) defs\n var defs = instance.svg.querySelector('defs')\n if (!defs) {\n defs = document.createElementNS(SvgUtils.svgNS, 'defs')\n instance.svg.appendChild(defs)\n }\n\n // Check for style element, and create it if it doesn't exist\n var styleEl = defs.querySelector('style#svg-pan-zoom-controls-styles');\n if (!styleEl) {\n var style = document.createElementNS(SvgUtils.svgNS, 'style')\n style.setAttribute('id', 'svg-pan-zoom-controls-styles')\n style.setAttribute('type', 'text/css')\n style.textContent = '.svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }'\n defs.appendChild(style)\n }\n\n // Zoom Group\n var zoomGroup = document.createElementNS(SvgUtils.svgNS, 'g');\n zoomGroup.setAttribute('id', 'svg-pan-zoom-controls');\n zoomGroup.setAttribute('transform', 'translate(' + ( instance.width - 70 ) + ' ' + ( instance.height - 76 ) + ') scale(0.75)');\n zoomGroup.setAttribute('class', 'svg-pan-zoom-control');\n\n // Control elements\n zoomGroup.appendChild(this._createZoomIn(instance))\n zoomGroup.appendChild(this._createZoomReset(instance))\n zoomGroup.appendChild(this._createZoomOut(instance))\n\n // Finally append created element\n instance.svg.appendChild(zoomGroup)\n\n // Cache control instance\n instance.controlIcons = zoomGroup\n }\n\n, _createZoomIn: function(instance) {\n var zoomIn = document.createElementNS(SvgUtils.svgNS, 'g');\n zoomIn.setAttribute('id', 'svg-pan-zoom-zoom-in');\n zoomIn.setAttribute('transform', 'translate(30.5 5) scale(0.015)');\n zoomIn.setAttribute('class', 'svg-pan-zoom-control');\n zoomIn.addEventListener('click', function() {instance.getPublicInstance().zoomIn()}, false)\n zoomIn.addEventListener('touchstart', function() {instance.getPublicInstance().zoomIn()}, false)\n\n var zoomInBackground = document.createElementNS(SvgUtils.svgNS, 'rect'); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomInBackground.setAttribute('x', '0');\n zoomInBackground.setAttribute('y', '0');\n zoomInBackground.setAttribute('width', '1500'); // larger than expected because the whole group is transformed to scale down\n zoomInBackground.setAttribute('height', '1400');\n zoomInBackground.setAttribute('class', 'svg-pan-zoom-control-background');\n zoomIn.appendChild(zoomInBackground);\n\n var zoomInShape = document.createElementNS(SvgUtils.svgNS, 'path');\n zoomInShape.setAttribute('d', 'M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z');\n zoomInShape.setAttribute('class', 'svg-pan-zoom-control-element');\n zoomIn.appendChild(zoomInShape);\n\n return zoomIn\n }\n\n, _createZoomReset: function(instance){\n // reset\n var resetPanZoomControl = document.createElementNS(SvgUtils.svgNS, 'g');\n resetPanZoomControl.setAttribute('id', 'svg-pan-zoom-reset-pan-zoom');\n resetPanZoomControl.setAttribute('transform', 'translate(5 35) scale(0.4)');\n resetPanZoomControl.setAttribute('class', 'svg-pan-zoom-control');\n resetPanZoomControl.addEventListener('click', function() {instance.getPublicInstance().reset()}, false);\n resetPanZoomControl.addEventListener('touchstart', function() {instance.getPublicInstance().reset()}, false);\n\n var resetPanZoomControlBackground = document.createElementNS(SvgUtils.svgNS, 'rect'); // TODO change these background space fillers to rounded rectangles so they look prettier\n resetPanZoomControlBackground.setAttribute('x', '2');\n resetPanZoomControlBackground.setAttribute('y', '2');\n resetPanZoomControlBackground.setAttribute('width', '182'); // larger than expected because the whole group is transformed to scale down\n resetPanZoomControlBackground.setAttribute('height', '58');\n resetPanZoomControlBackground.setAttribute('class', 'svg-pan-zoom-control-background');\n resetPanZoomControl.appendChild(resetPanZoomControlBackground);\n\n var resetPanZoomControlShape1 = document.createElementNS(SvgUtils.svgNS, 'path');\n resetPanZoomControlShape1.setAttribute('d', 'M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z');\n resetPanZoomControlShape1.setAttribute('class', 'svg-pan-zoom-control-element');\n resetPanZoomControl.appendChild(resetPanZoomControlShape1);\n\n var resetPanZoomControlShape2 = document.createElementNS(SvgUtils.svgNS, 'path');\n resetPanZoomControlShape2.setAttribute('d', 'M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z');\n resetPanZoomControlShape2.setAttribute('class', 'svg-pan-zoom-control-element');\n resetPanZoomControl.appendChild(resetPanZoomControlShape2);\n\n return resetPanZoomControl\n }\n\n, _createZoomOut: function(instance){\n // zoom out\n var zoomOut = document.createElementNS(SvgUtils.svgNS, 'g');\n zoomOut.setAttribute('id', 'svg-pan-zoom-zoom-out');\n zoomOut.setAttribute('transform', 'translate(30.5 70) scale(0.015)');\n zoomOut.setAttribute('class', 'svg-pan-zoom-control');\n zoomOut.addEventListener('click', function() {instance.getPublicInstance().zoomOut()}, false);\n zoomOut.addEventListener('touchstart', function() {instance.getPublicInstance().zoomOut()}, false);\n\n var zoomOutBackground = document.createElementNS(SvgUtils.svgNS, 'rect'); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomOutBackground.setAttribute('x', '0');\n zoomOutBackground.setAttribute('y', '0');\n zoomOutBackground.setAttribute('width', '1500'); // larger than expected because the whole group is transformed to scale down\n zoomOutBackground.setAttribute('height', '1400');\n zoomOutBackground.setAttribute('class', 'svg-pan-zoom-control-background');\n zoomOut.appendChild(zoomOutBackground);\n\n var zoomOutShape = document.createElementNS(SvgUtils.svgNS, 'path');\n zoomOutShape.setAttribute('d', 'M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z');\n zoomOutShape.setAttribute('class', 'svg-pan-zoom-control-element');\n zoomOut.appendChild(zoomOutShape);\n\n return zoomOut\n }\n\n, disable: function(instance) {\n if (instance.controlIcons) {\n instance.controlIcons.parentNode.removeChild(instance.controlIcons)\n instance.controlIcons = null\n }\n }\n}\n","var SvgUtils = require('./svg-utilities')\n , Utils = require('./utilities')\n ;\n\nvar ShadowViewport = function(viewport, options){\n this.init(viewport, options)\n}\n\n/**\n * Initialization\n *\n * @param {SVGElement} viewport\n * @param {Object} options\n */\nShadowViewport.prototype.init = function(viewport, options) {\n // DOM Elements\n this.viewport = viewport\n this.options = options\n\n // State cache\n this.originalState = {zoom: 1, x: 0, y: 0}\n this.activeState = {zoom: 1, x: 0, y: 0}\n\n this.updateCTMCached = Utils.proxy(this.updateCTM, this)\n\n // Create a custom requestAnimationFrame taking in account refreshRate\n this.requestAnimationFrame = Utils.createRequestAnimationFrame(this.options.refreshRate)\n\n // ViewBox\n this.viewBox = {x: 0, y: 0, width: 0, height: 0}\n this.cacheViewBox()\n\n // Process CTM\n var newCTM = this.processCTM()\n\n // Update viewport CTM and cache zoom and pan\n this.setCTM(newCTM)\n\n // Update CTM in this frame\n this.updateCTM()\n}\n\n/**\n * Cache initial viewBox value\n * If no viewBox is defined, then use viewport size/position instead for viewBox values\n */\nShadowViewport.prototype.cacheViewBox = function() {\n var svgViewBox = this.options.svg.getAttribute('viewBox')\n\n if (svgViewBox) {\n var viewBoxValues = svgViewBox.split(/[\\s\\,]/).filter(function(v){return v}).map(parseFloat)\n\n // Cache viewbox x and y offset\n this.viewBox.x = viewBoxValues[0]\n this.viewBox.y = viewBoxValues[1]\n this.viewBox.width = viewBoxValues[2]\n this.viewBox.height = viewBoxValues[3]\n\n var zoom = Math.min(this.options.width / this.viewBox.width, this.options.height / this.viewBox.height)\n\n // Update active state\n this.activeState.zoom = zoom\n this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2\n this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2\n\n // Force updating CTM\n this.updateCTMOnNextFrame()\n\n this.options.svg.removeAttribute('viewBox')\n } else {\n this.simpleViewBoxCache()\n }\n}\n\n/**\n * Recalculate viewport sizes and update viewBox cache\n */\nShadowViewport.prototype.simpleViewBoxCache = function() {\n var bBox = this.viewport.getBBox()\n\n this.viewBox.x = bBox.x\n this.viewBox.y = bBox.y\n this.viewBox.width = bBox.width\n this.viewBox.height = bBox.height\n}\n\n/**\n * Returns a viewbox object. Safe to alter\n *\n * @return {Object} viewbox object\n */\nShadowViewport.prototype.getViewBox = function() {\n return Utils.extend({}, this.viewBox)\n}\n\n/**\n * Get initial zoom and pan values. Save them into originalState\n * Parses viewBox attribute to alter initial sizes\n *\n * @return {CTM} CTM object based on options\n */\nShadowViewport.prototype.processCTM = function() {\n var newCTM = this.getCTM()\n\n if (this.options.fit || this.options.contain) {\n var newScale;\n if (this.options.fit) {\n newScale = Math.min(this.options.width/this.viewBox.width, this.options.height/this.viewBox.height);\n } else {\n newScale = Math.max(this.options.width/this.viewBox.width, this.options.height/this.viewBox.height);\n }\n\n newCTM.a = newScale; //x-scale\n newCTM.d = newScale; //y-scale\n newCTM.e = -this.viewBox.x * newScale; //x-transform\n newCTM.f = -this.viewBox.y * newScale; //y-transform\n }\n\n if (this.options.center) {\n var offsetX = (this.options.width - (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) * 0.5\n , offsetY = (this.options.height - (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) * 0.5\n\n newCTM.e = offsetX\n newCTM.f = offsetY\n }\n\n // Cache initial values. Based on activeState and fix+center opitons\n this.originalState.zoom = newCTM.a\n this.originalState.x = newCTM.e\n this.originalState.y = newCTM.f\n\n return newCTM\n}\n\n/**\n * Return originalState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getOriginalState = function() {\n return Utils.extend({}, this.originalState)\n}\n\n/**\n * Return actualState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getState = function() {\n return Utils.extend({}, this.activeState)\n}\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getZoom = function() {\n return this.activeState.zoom\n}\n\n/**\n * Get zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getRelativeZoom = function() {\n return this.activeState.zoom / this.originalState.zoom\n}\n\n/**\n * Compute zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.computeRelativeZoom = function(scale) {\n return scale / this.originalState.zoom\n}\n\n/**\n * Get pan\n *\n * @return {Object}\n */\nShadowViewport.prototype.getPan = function() {\n return {x: this.activeState.x, y: this.activeState.y}\n}\n\n/**\n * Return cached viewport CTM value that can be safely modified\n *\n * @return {SVGMatrix}\n */\nShadowViewport.prototype.getCTM = function() {\n var safeCTM = this.options.svg.createSVGMatrix()\n\n // Copy values manually as in FF they are not itterable\n safeCTM.a = this.activeState.zoom\n safeCTM.b = 0\n safeCTM.c = 0\n safeCTM.d = this.activeState.zoom\n safeCTM.e = this.activeState.x\n safeCTM.f = this.activeState.y\n\n return safeCTM\n}\n\n/**\n * Set a new CTM\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.setCTM = function(newCTM) {\n var willZoom = this.isZoomDifferent(newCTM)\n , willPan = this.isPanDifferent(newCTM)\n\n if (willZoom || willPan) {\n // Before zoom\n if (willZoom) {\n // If returns false then cancel zooming\n if (this.options.beforeZoom(this.getRelativeZoom(), this.computeRelativeZoom(newCTM.a)) === false) {\n newCTM.a = newCTM.d = this.activeState.zoom\n willZoom = false\n } else {\n this.updateCache(newCTM);\n this.options.onZoom(this.getRelativeZoom())\n }\n }\n\n // Before pan\n if (willPan) {\n var preventPan = this.options.beforePan(this.getPan(), {x: newCTM.e, y: newCTM.f})\n // If prevent pan is an object\n , preventPanX = false\n , preventPanY = false\n\n // If prevent pan is Boolean false\n if (preventPan === false) {\n // Set x and y same as before\n newCTM.e = this.getPan().x\n newCTM.f = this.getPan().y\n\n preventPanX = preventPanY = true\n } else if (Utils.isObject(preventPan)) {\n // Check for X axes attribute\n if (preventPan.x === false) {\n // Prevent panning on x axes\n newCTM.e = this.getPan().x\n preventPanX = true\n } else if (Utils.isNumber(preventPan.x)) {\n // Set a custom pan value\n newCTM.e = preventPan.x\n }\n\n // Check for Y axes attribute\n if (preventPan.y === false) {\n // Prevent panning on x axes\n newCTM.f = this.getPan().y\n preventPanY = true\n } else if (Utils.isNumber(preventPan.y)) {\n // Set a custom pan value\n newCTM.f = preventPan.y\n }\n }\n\n // Update willPan flag\n // Check if newCTM is still different\n if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) {\n willPan = false\n } else {\n this.updateCache(newCTM);\n this.options.onPan(this.getPan());\n }\n }\n\n // Check again if should zoom or pan\n if (willZoom || willPan) {\n this.updateCTMOnNextFrame()\n }\n }\n}\n\nShadowViewport.prototype.isZoomDifferent = function(newCTM) {\n return this.activeState.zoom !== newCTM.a\n}\n\nShadowViewport.prototype.isPanDifferent = function(newCTM) {\n return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f\n}\n\n\n/**\n * Update cached CTM and active state\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.updateCache = function(newCTM) {\n this.activeState.zoom = newCTM.a\n this.activeState.x = newCTM.e\n this.activeState.y = newCTM.f\n}\n\nShadowViewport.prototype.pendingUpdate = false\n\n/**\n * Place a request to update CTM on next Frame\n */\nShadowViewport.prototype.updateCTMOnNextFrame = function() {\n if (!this.pendingUpdate) {\n // Lock\n this.pendingUpdate = true\n\n // Throttle next update\n this.requestAnimationFrame.call(window, this.updateCTMCached)\n }\n}\n\n/**\n * Update viewport CTM with cached CTM\n */\nShadowViewport.prototype.updateCTM = function() {\n var ctm = this.getCTM()\n\n // Updates SVG element\n SvgUtils.setCTM(this.viewport, ctm, this.defs)\n\n // Free the lock\n this.pendingUpdate = false\n\n // Notify about the update\n if(this.options.onUpdatedCTM) {\n this.options.onUpdatedCTM(ctm)\n }\n}\n\nmodule.exports = function(viewport, options){\n return new ShadowViewport(viewport, options)\n}\n","var Utils = require('./utilities')\n , _browser = 'unknown'\n ;\n\n// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\nif (/*@cc_on!@*/false || !!document.documentMode) { // internet explorer\n _browser = 'ie';\n}\n\nmodule.exports = {\n svgNS: 'http://www.w3.org/2000/svg'\n, xmlNS: 'http://www.w3.org/XML/1998/namespace'\n, xmlnsNS: 'http://www.w3.org/2000/xmlns/'\n, xlinkNS: 'http://www.w3.org/1999/xlink'\n, evNS: 'http://www.w3.org/2001/xml-events'\n\n /**\n * Get svg dimensions: width and height\n *\n * @param {SVGSVGElement} svg\n * @return {Object} {width: 0, height: 0}\n */\n, getBoundingClientRectNormalized: function(svg) {\n if (svg.clientWidth && svg.clientHeight) {\n return {width: svg.clientWidth, height: svg.clientHeight}\n } else if (!!svg.getBoundingClientRect()) {\n return svg.getBoundingClientRect();\n } else {\n throw new Error('Cannot get BoundingClientRect for SVG.');\n }\n }\n\n /**\n * Gets g element with class of \"viewport\" or creates it if it doesn't exist\n *\n * @param {SVGSVGElement} svg\n * @return {SVGElement} g (group) element\n */\n, getOrCreateViewport: function(svg, selector) {\n var viewport = null\n\n if (Utils.isElement(selector)) {\n viewport = selector\n } else {\n viewport = svg.querySelector(selector)\n }\n\n // Check if there is just one main group in SVG\n if (!viewport) {\n var childNodes = Array.prototype.slice.call(svg.childNodes || svg.children).filter(function(el){\n return el.nodeName !== 'defs' && el.nodeName !== '#text'\n })\n\n // Node name should be SVGGElement and should have no transform attribute\n // Groups with transform are not used as viewport because it involves parsing of all transform possibilities\n if (childNodes.length === 1 && childNodes[0].nodeName === 'g' && childNodes[0].getAttribute('transform') === null) {\n viewport = childNodes[0]\n }\n }\n\n // If no favorable group element exists then create one\n if (!viewport) {\n var viewportId = 'viewport-' + new Date().toISOString().replace(/\\D/g, '');\n viewport = document.createElementNS(this.svgNS, 'g');\n viewport.setAttribute('id', viewportId);\n\n // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes\n var svgChildren = svg.childNodes || svg.children;\n if (!!svgChildren && svgChildren.length > 0) {\n for (var i = svgChildren.length; i > 0; i--) {\n // Move everything into viewport except defs\n if (svgChildren[svgChildren.length - i].nodeName !== 'defs') {\n viewport.appendChild(svgChildren[svgChildren.length - i]);\n }\n }\n }\n svg.appendChild(viewport);\n }\n\n // Parse class names\n var classNames = [];\n if (viewport.getAttribute('class')) {\n classNames = viewport.getAttribute('class').split(' ')\n }\n\n // Set class (if not set already)\n if (!~classNames.indexOf('svg-pan-zoom_viewport')) {\n classNames.push('svg-pan-zoom_viewport')\n viewport.setAttribute('class', classNames.join(' '))\n }\n\n return viewport\n }\n\n /**\n * Set SVG attributes\n *\n * @param {SVGSVGElement} svg\n */\n , setupSvgAttributes: function(svg) {\n // Setting default attributes\n svg.setAttribute('xmlns', this.svgNS);\n svg.setAttributeNS(this.xmlnsNS, 'xmlns:xlink', this.xlinkNS);\n svg.setAttributeNS(this.xmlnsNS, 'xmlns:ev', this.evNS);\n\n // Needed for Internet Explorer, otherwise the viewport overflows\n if (svg.parentNode !== null) {\n var style = svg.getAttribute('style') || '';\n if (style.toLowerCase().indexOf('overflow') === -1) {\n svg.setAttribute('style', 'overflow: hidden; ' + style);\n }\n }\n }\n\n/**\n * How long Internet Explorer takes to finish updating its display (ms).\n */\n, internetExplorerRedisplayInterval: 300\n\n/**\n * Forces the browser to redisplay all SVG elements that rely on an\n * element defined in a 'defs' section. It works globally, for every\n * available defs element on the page.\n * The throttling is intentionally global.\n *\n * This is only needed for IE. It is as a hack to make markers (and 'use' elements?)\n * visible after pan/zoom when there are multiple SVGs on the page.\n * See bug report: https://connect.microsoft.com/IE/feedback/details/781964/\n * also see svg-pan-zoom issue: https://github.com/ariutta/svg-pan-zoom/issues/62\n */\n, refreshDefsGlobal: Utils.throttle(function() {\n var allDefs = document.querySelectorAll('defs');\n var allDefsCount = allDefs.length;\n for (var i = 0; i < allDefsCount; i++) {\n var thisDefs = allDefs[i];\n thisDefs.parentNode.insertBefore(thisDefs, thisDefs);\n }\n }, this ? this.internetExplorerRedisplayInterval : null)\n\n /**\n * Sets the current transform matrix of an element\n *\n * @param {SVGElement} element\n * @param {SVGMatrix} matrix CTM\n * @param {SVGElement} defs\n */\n, setCTM: function(element, matrix, defs) {\n var that = this\n , s = 'matrix(' + matrix.a + ',' + matrix.b + ',' + matrix.c + ',' + matrix.d + ',' + matrix.e + ',' + matrix.f + ')';\n\n element.setAttributeNS(null, 'transform', s);\n if ('transform' in element.style) {\n element.style.transform = s;\n } else if ('-ms-transform' in element.style) {\n element.style['-ms-transform'] = s;\n } else if ('-webkit-transform' in element.style) {\n element.style['-webkit-transform'] = s;\n }\n\n // IE has a bug that makes markers disappear on zoom (when the matrix \"a\" and/or \"d\" elements change)\n // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10\n // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/\n if (_browser === 'ie' && !!defs) {\n // this refresh is intended for redisplaying the SVG during zooming\n defs.parentNode.insertBefore(defs, defs);\n // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG\n // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that\n // are located under any other element(s).\n window.setTimeout(function() {\n that.refreshDefsGlobal();\n }, that.internetExplorerRedisplayInterval);\n }\n }\n\n /**\n * Instantiate an SVGPoint object with given event coordinates\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n * @return {SVGPoint} point\n */\n, getEventPoint: function(evt, svg) {\n var point = svg.createSVGPoint()\n\n Utils.mouseAndTouchNormalize(evt, svg)\n\n point.x = evt.clientX\n point.y = evt.clientY\n\n return point\n }\n\n /**\n * Get SVG center point\n *\n * @param {SVGSVGElement} svg\n * @return {SVGPoint}\n */\n, getSvgCenterPoint: function(svg, width, height) {\n return this.createSVGPoint(svg, width / 2, height / 2)\n }\n\n /**\n * Create a SVGPoint with given x and y\n *\n * @param {SVGSVGElement} svg\n * @param {Number} x\n * @param {Number} y\n * @return {SVGPoint}\n */\n, createSVGPoint: function(svg, x, y) {\n var point = svg.createSVGPoint()\n point.x = x\n point.y = y\n\n return point\n }\n}\n","module.exports = {\n /**\n * Extends an object\n *\n * @param {Object} target object to extend\n * @param {Object} source object to take properties from\n * @return {Object} extended object\n */\n extend: function(target, source) {\n target = target || {};\n for (var prop in source) {\n // Go recursively\n if (this.isObject(source[prop])) {\n target[prop] = this.extend(target[prop], source[prop])\n } else {\n target[prop] = source[prop]\n }\n }\n return target;\n }\n\n /**\n * Checks if an object is a DOM element\n *\n * @param {Object} o HTML element or String\n * @return {Boolean} returns true if object is a DOM element\n */\n, isElement: function(o){\n return (\n o instanceof HTMLElement || o instanceof SVGElement || o instanceof SVGSVGElement || //DOM2\n (o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string')\n );\n }\n\n /**\n * Checks if an object is an Object\n *\n * @param {Object} o Object\n * @return {Boolean} returns true if object is an Object\n */\n, isObject: function(o){\n return Object.prototype.toString.call(o) === '[object Object]';\n }\n\n /**\n * Checks if variable is Number\n *\n * @param {Integer|Float} n\n * @return {Boolean} returns true if variable is Number\n */\n, isNumber: function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n /**\n * Search for an SVG element\n *\n * @param {Object|String} elementOrSelector DOM Element or selector String\n * @return {Object|Null} SVG or null\n */\n, getSvg: function(elementOrSelector) {\n var element\n , svg;\n\n if (!this.isElement(elementOrSelector)) {\n // If selector provided\n if (typeof elementOrSelector === 'string' || elementOrSelector instanceof String) {\n // Try to find the element\n element = document.querySelector(elementOrSelector)\n\n if (!element) {\n throw new Error('Provided selector did not find any elements. Selector: ' + elementOrSelector)\n return null\n }\n } else {\n throw new Error('Provided selector is not an HTML object nor String')\n return null\n }\n } else {\n element = elementOrSelector\n }\n\n if (element.tagName.toLowerCase() === 'svg') {\n svg = element;\n } else {\n if (element.tagName.toLowerCase() === 'object') {\n svg = element.contentDocument.documentElement;\n } else {\n if (element.tagName.toLowerCase() === 'embed') {\n svg = element.getSVGDocument().documentElement;\n } else {\n if (element.tagName.toLowerCase() === 'img') {\n throw new Error('Cannot script an SVG in an \"img\" element. Please use an \"object\" element or an in-line SVG.');\n } else {\n throw new Error('Cannot get SVG.');\n }\n return null\n }\n }\n }\n\n return svg\n }\n\n /**\n * Attach a given context to a function\n * @param {Function} fn Function\n * @param {Object} context Context\n * @return {Function} Function with certain context\n */\n, proxy: function(fn, context) {\n return function() {\n return fn.apply(context, arguments)\n }\n }\n\n /**\n * Returns object type\n * Uses toString that returns [object SVGPoint]\n * And than parses object type from string\n *\n * @param {Object} o Any object\n * @return {String} Object type\n */\n, getType: function(o) {\n return Object.prototype.toString.apply(o).replace(/^\\[object\\s/, '').replace(/\\]$/, '')\n }\n\n /**\n * If it is a touch event than add clientX and clientY to event object\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n */\n, mouseAndTouchNormalize: function(evt, svg) {\n // If no clientX then fallback\n if (evt.clientX === void 0 || evt.clientX === null) {\n // Fallback\n evt.clientX = 0\n evt.clientY = 0\n\n // If it is a touch event\n if (evt.touches !== void 0 && evt.touches.length) {\n if (evt.touches[0].clientX !== void 0) {\n evt.clientX = evt.touches[0].clientX\n evt.clientY = evt.touches[0].clientY\n } else if (evt.touches[0].pageX !== void 0) {\n var rect = svg.getBoundingClientRect();\n\n evt.clientX = evt.touches[0].pageX - rect.left\n evt.clientY = evt.touches[0].pageY - rect.top\n }\n // If it is a custom event\n } else if (evt.originalEvent !== void 0) {\n if (evt.originalEvent.clientX !== void 0) {\n evt.clientX = evt.originalEvent.clientX\n evt.clientY = evt.originalEvent.clientY\n }\n }\n }\n }\n\n /**\n * Check if an event is a double click/tap\n * TODO: For touch gestures use a library (hammer.js) that takes in account other events\n * (touchmove and touchend). It should take in account tap duration and traveled distance\n *\n * @param {Event} evt\n * @param {Event} prevEvt Previous Event\n * @return {Boolean}\n */\n, isDblClick: function(evt, prevEvt) {\n // Double click detected by browser\n if (evt.detail === 2) {\n return true;\n }\n // Try to compare events\n else if (prevEvt !== void 0 && prevEvt !== null) {\n var timeStampDiff = evt.timeStamp - prevEvt.timeStamp // should be lower than 250 ms\n , touchesDistance = Math.sqrt(Math.pow(evt.clientX - prevEvt.clientX, 2) + Math.pow(evt.clientY - prevEvt.clientY, 2))\n\n return timeStampDiff < 250 && touchesDistance < 10\n }\n\n // Nothing found\n return false;\n }\n\n /**\n * Returns current timestamp as an integer\n *\n * @return {Number}\n */\n, now: Date.now || function() {\n return new Date().getTime();\n }\n\n // From underscore.\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n// jscs:disable\n// jshint ignore:start\n, throttle: function(func, wait, options) {\n var that = this;\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : that.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = that.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n }\n// jshint ignore:end\n// jscs:enable\n\n /**\n * Create a requestAnimationFrame simulation\n *\n * @param {Number|String} refreshRate\n * @return {Function}\n */\n, createRequestAnimationFrame: function(refreshRate) {\n var timeout = null\n\n // Convert refreshRate to timeout\n if (refreshRate !== 'auto' && refreshRate < 60 && refreshRate > 1) {\n timeout = Math.floor(1000 / refreshRate)\n }\n\n if (timeout === null) {\n return window.requestAnimationFrame || requestTimeout(33)\n } else {\n return requestTimeout(timeout)\n }\n }\n}\n\n/**\n * Create a callback that will execute after a given timeout\n *\n * @param {Function} timeout\n * @return {Function}\n */\nfunction requestTimeout(timeout) {\n return function(callback) {\n window.setTimeout(callback, timeout)\n }\n}\n","var Wheel = require('./uniwheel')\n, ControlIcons = require('./control-icons')\n, Utils = require('./utilities')\n, SvgUtils = require('./svg-utilities')\n, ShadowViewport = require('./shadow-viewport')\n\nvar SvgPanZoom = function(svg, options) {\n this.init(svg, options)\n}\n\nvar optionsDefaults = {\n viewportSelector: '.svg-pan-zoom_viewport' // Viewport selector. Can be querySelector string or SVGElement\n, panEnabled: true // enable or disable panning (default enabled)\n, controlIconsEnabled: false // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled)\n, zoomEnabled: true // enable or disable zooming (default enabled)\n, dblClickZoomEnabled: true // enable or disable zooming by double clicking (default enabled)\n, mouseWheelZoomEnabled: true // enable or disable zooming by mouse wheel (default enabled)\n, preventMouseEventsDefault: true // enable or disable preventDefault for mouse events\n, zoomScaleSensitivity: 0.1 // Zoom sensitivity\n, minZoom: 0.5 // Minimum Zoom level\n, maxZoom: 10 // Maximum Zoom level\n, fit: true // enable or disable viewport fit in SVG (default true)\n, contain: false // enable or disable viewport contain the svg (default false)\n, center: true // enable or disable viewport centering in SVG (default true)\n, refreshRate: 'auto' // Maximum number of frames per second (altering SVG's viewport)\n, beforeZoom: null\n, onZoom: null\n, beforePan: null\n, onPan: null\n, customEventsHandler: null\n, eventsListenerElement: null\n, onUpdatedCTM: null\n}\n\nSvgPanZoom.prototype.init = function(svg, options) {\n var that = this\n\n this.svg = svg\n this.defs = svg.querySelector('defs')\n\n // Add default attributes to SVG\n SvgUtils.setupSvgAttributes(this.svg)\n\n // Set options\n this.options = Utils.extend(Utils.extend({}, optionsDefaults), options)\n\n // Set default state\n this.state = 'none'\n\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(svg)\n this.width = boundingClientRectNormalized.width\n this.height = boundingClientRectNormalized.height\n\n // Init shadow viewport\n this.viewport = ShadowViewport(SvgUtils.getOrCreateViewport(this.svg, this.options.viewportSelector), {\n svg: this.svg\n , width: this.width\n , height: this.height\n , fit: this.options.fit\n , contain: this.options.contain\n , center: this.options.center\n , refreshRate: this.options.refreshRate\n // Put callbacks into functions as they can change through time\n , beforeZoom: function(oldScale, newScale) {\n if (that.viewport && that.options.beforeZoom) {return that.options.beforeZoom(oldScale, newScale)}\n }\n , onZoom: function(scale) {\n if (that.viewport && that.options.onZoom) {return that.options.onZoom(scale)}\n }\n , beforePan: function(oldPoint, newPoint) {\n if (that.viewport && that.options.beforePan) {return that.options.beforePan(oldPoint, newPoint)}\n }\n , onPan: function(point) {\n if (that.viewport && that.options.onPan) {return that.options.onPan(point)}\n }\n , onUpdatedCTM: function(ctm) {\n if (that.viewport && that.options.onUpdatedCTM) {return that.options.onUpdatedCTM(ctm)}\n }\n })\n\n // Wrap callbacks into public API context\n var publicInstance = this.getPublicInstance()\n publicInstance.setBeforeZoom(this.options.beforeZoom)\n publicInstance.setOnZoom(this.options.onZoom)\n publicInstance.setBeforePan(this.options.beforePan)\n publicInstance.setOnPan(this.options.onPan)\n publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM)\n\n if (this.options.controlIconsEnabled) {\n ControlIcons.enable(this)\n }\n\n // Init events handlers\n this.lastMouseWheelEventTime = Date.now()\n this.setupHandlers()\n}\n\n/**\n * Register event handlers\n */\nSvgPanZoom.prototype.setupHandlers = function() {\n var that = this\n , prevEvt = null // use for touchstart event to detect double tap\n ;\n\n this.eventListeners = {\n // Mouse down group\n mousedown: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt\n return result;\n }\n , touchstart: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt\n return result;\n }\n\n // Mouse up group\n , mouseup: function(evt) {\n return that.handleMouseUp(evt);\n }\n , touchend: function(evt) {\n return that.handleMouseUp(evt);\n }\n\n // Mouse move group\n , mousemove: function(evt) {\n return that.handleMouseMove(evt);\n }\n , touchmove: function(evt) {\n return that.handleMouseMove(evt);\n }\n\n // Mouse leave group\n , mouseleave: function(evt) {\n return that.handleMouseUp(evt);\n }\n , touchleave: function(evt) {\n return that.handleMouseUp(evt);\n }\n , touchcancel: function(evt) {\n return that.handleMouseUp(evt);\n }\n }\n\n // Init custom events handler if available\n if (this.options.customEventsHandler != null) { // jshint ignore:line\n this.options.customEventsHandler.init({\n svgElement: this.svg\n , eventsListenerElement: this.options.eventsListenerElement\n , instance: this.getPublicInstance()\n })\n\n // Custom event handler may halt builtin listeners\n var haltEventListeners = this.options.customEventsHandler.haltEventListeners\n if (haltEventListeners && haltEventListeners.length) {\n for (var i = haltEventListeners.length - 1; i >= 0; i--) {\n if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) {\n delete this.eventListeners[haltEventListeners[i]]\n }\n }\n }\n }\n\n // Bind eventListeners\n for (var event in this.eventListeners) {\n // Attach event to eventsListenerElement or SVG if not available\n (this.options.eventsListenerElement || this.svg)\n .addEventListener(event, this.eventListeners[event], false)\n }\n\n // Zoom using mouse wheel\n if (this.options.mouseWheelZoomEnabled) {\n this.options.mouseWheelZoomEnabled = false // set to false as enable will set it back to true\n this.enableMouseWheelZoom()\n }\n}\n\n/**\n * Enable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.enableMouseWheelZoom = function() {\n if (!this.options.mouseWheelZoomEnabled) {\n var that = this\n\n // Mouse wheel listener\n this.wheelListener = function(evt) {\n return that.handleMouseWheel(evt);\n }\n\n // Bind wheelListener\n Wheel.on(this.options.eventsListenerElement || this.svg, this.wheelListener, false)\n\n this.options.mouseWheelZoomEnabled = true\n }\n}\n\n/**\n * Disable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.disableMouseWheelZoom = function() {\n if (this.options.mouseWheelZoomEnabled) {\n Wheel.off(this.options.eventsListenerElement || this.svg, this.wheelListener, false)\n this.options.mouseWheelZoomEnabled = false\n }\n}\n\n/**\n * Handle mouse wheel event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseWheel = function(evt) {\n if (!this.options.zoomEnabled || this.state !== 'none') {\n return;\n }\n\n if (this.options.preventMouseEventsDefault){\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Default delta in case that deltaY is not available\n var delta = evt.deltaY || 1\n , timeDelta = Date.now() - this.lastMouseWheelEventTime\n , divider = 3 + Math.max(0, 30 - timeDelta)\n\n // Update cache\n this.lastMouseWheelEventTime = Date.now()\n\n // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0)\n if ('deltaMode' in evt && evt.deltaMode === 0 && evt.wheelDelta) {\n delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY\n }\n\n delta = -0.3 < delta && delta < 0.3 ? delta : (delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10) / divider\n\n var inversedScreenCTM = this.svg.getScreenCTM().inverse()\n , relativeMousePoint = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(inversedScreenCTM)\n , zoom = Math.pow(1 + this.options.zoomScaleSensitivity, (-1) * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior\n\n this.zoomAtPoint(zoom, relativeMousePoint)\n}\n\n/**\n * Zoom in at a SVG point\n *\n * @param {SVGPoint} point\n * @param {Float} zoomScale Number representing how much to zoom\n * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value.\n * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%)\n */\nSvgPanZoom.prototype.zoomAtPoint = function(zoomScale, point, zoomAbsolute) {\n var originalState = this.viewport.getOriginalState()\n\n if (!zoomAbsolute) {\n // Fit zoomScale in set bounds\n if (this.getZoom() * zoomScale < this.options.minZoom * originalState.zoom) {\n zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom()\n } else if (this.getZoom() * zoomScale > this.options.maxZoom * originalState.zoom) {\n zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom()\n }\n } else {\n // Fit zoomScale in set bounds\n zoomScale = Math.max(this.options.minZoom * originalState.zoom, Math.min(this.options.maxZoom * originalState.zoom, zoomScale))\n // Find relative scale to achieve desired scale\n zoomScale = zoomScale/this.getZoom()\n }\n\n var oldCTM = this.viewport.getCTM()\n , relativePoint = point.matrixTransform(oldCTM.inverse())\n , modifier = this.svg.createSVGMatrix().translate(relativePoint.x, relativePoint.y).scale(zoomScale).translate(-relativePoint.x, -relativePoint.y)\n , newCTM = oldCTM.multiply(modifier)\n\n if (newCTM.a !== oldCTM.a) {\n this.viewport.setCTM(newCTM)\n }\n}\n\n/**\n * Zoom at center point\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.zoom = function(scale, absolute) {\n this.zoomAtPoint(scale, SvgUtils.getSvgCenterPoint(this.svg, this.width, this.height), absolute)\n}\n\n/**\n * Zoom used by public instance\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoom = function(scale, absolute) {\n if (absolute) {\n scale = this.computeFromRelativeZoom(scale)\n }\n\n this.zoom(scale, absolute)\n}\n\n/**\n * Zoom at point used by public instance\n *\n * @param {Float} scale\n * @param {SVGPoint|Object} point An object that has x and y attributes\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoomAtPoint = function(scale, point, absolute) {\n if (absolute) {\n // Transform zoom into a relative value\n scale = this.computeFromRelativeZoom(scale)\n }\n\n // If not a SVGPoint but has x and y then create a SVGPoint\n if (Utils.getType(point) !== 'SVGPoint') {\n if('x' in point && 'y' in point) {\n point = SvgUtils.createSVGPoint(this.svg, point.x, point.y)\n } else {\n throw new Error('Given point is invalid')\n }\n }\n\n this.zoomAtPoint(scale, point, absolute)\n}\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getZoom = function() {\n return this.viewport.getZoom()\n}\n\n/**\n * Get zoom scale for public usage\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getRelativeZoom = function() {\n return this.viewport.getRelativeZoom()\n}\n\n/**\n * Compute actual zoom from public zoom\n *\n * @param {Float} zoom\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.computeFromRelativeZoom = function(zoom) {\n return zoom * this.viewport.getOriginalState().zoom\n}\n\n/**\n * Set zoom to initial state\n */\nSvgPanZoom.prototype.resetZoom = function() {\n var originalState = this.viewport.getOriginalState()\n\n this.zoom(originalState.zoom, true);\n}\n\n/**\n * Set pan to initial state\n */\nSvgPanZoom.prototype.resetPan = function() {\n this.pan(this.viewport.getOriginalState());\n}\n\n/**\n * Set pan and zoom to initial state\n */\nSvgPanZoom.prototype.reset = function() {\n this.resetZoom()\n this.resetPan()\n}\n\n/**\n * Handle double click event\n * See handleMouseDown() for alternate detection method\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleDblClick = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault()\n } else {\n evt.returnValue = false\n }\n }\n\n // Check if target was a control button\n if (this.options.controlIconsEnabled) {\n var targetClass = evt.target.getAttribute('class') || ''\n if (targetClass.indexOf('svg-pan-zoom-control') > -1) {\n return false\n }\n }\n\n var zoomFactor\n\n if (evt.shiftKey) {\n zoomFactor = 1/((1 + this.options.zoomScaleSensitivity) * 2) // zoom out when shift key pressed\n } else {\n zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2\n }\n\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(this.svg.getScreenCTM().inverse())\n this.zoomAtPoint(zoomFactor, point)\n}\n\n/**\n * Handle click event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseDown = function(evt, prevEvt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault()\n } else {\n evt.returnValue = false\n }\n }\n\n Utils.mouseAndTouchNormalize(evt, this.svg)\n\n // Double click detection; more consistent than ondblclick\n if (this.options.dblClickZoomEnabled && Utils.isDblClick(evt, prevEvt)){\n this.handleDblClick(evt)\n } else {\n // Pan mode\n this.state = 'pan'\n this.firstEventCTM = this.viewport.getCTM()\n this.stateOrigin = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(this.firstEventCTM.inverse())\n }\n}\n\n/**\n * Handle mouse move event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseMove = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault()\n } else {\n evt.returnValue = false\n }\n }\n\n if (this.state === 'pan' && this.options.panEnabled) {\n // Pan mode\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(this.firstEventCTM.inverse())\n , viewportCTM = this.firstEventCTM.translate(point.x - this.stateOrigin.x, point.y - this.stateOrigin.y)\n\n this.viewport.setCTM(viewportCTM)\n }\n}\n\n/**\n * Handle mouse button release event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseUp = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault()\n } else {\n evt.returnValue = false\n }\n }\n\n if (this.state === 'pan') {\n // Quit pan mode\n this.state = 'none'\n }\n}\n\n/**\n * Adjust viewport size (only) so it will fit in SVG\n * Does not center image\n */\nSvgPanZoom.prototype.fit = function() {\n var viewBox = this.viewport.getViewBox()\n , newScale = Math.min(this.width/viewBox.width, this.height/viewBox.height)\n\n this.zoom(newScale, true)\n}\n\n/**\n * Adjust viewport size (only) so it will contain the SVG\n * Does not center image\n */\nSvgPanZoom.prototype.contain = function() {\n var viewBox = this.viewport.getViewBox()\n , newScale = Math.max(this.width/viewBox.width, this.height/viewBox.height)\n\n this.zoom(newScale, true)\n}\n\n/**\n * Adjust viewport pan (only) so it will be centered in SVG\n * Does not zoom/fit/contain image\n */\nSvgPanZoom.prototype.center = function() {\n var viewBox = this.viewport.getViewBox()\n , offsetX = (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5\n , offsetY = (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5\n\n this.getPublicInstance().pan({x: offsetX, y: offsetY})\n}\n\n/**\n * Update content cached BorderBox\n * Use when viewport contents change\n */\nSvgPanZoom.prototype.updateBBox = function() {\n this.viewport.simpleViewBoxCache()\n}\n\n/**\n * Pan to a rendered position\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.pan = function(point) {\n var viewportCTM = this.viewport.getCTM()\n viewportCTM.e = point.x\n viewportCTM.f = point.y\n this.viewport.setCTM(viewportCTM)\n}\n\n/**\n * Relatively pan the graph by a specified rendered position vector\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.panBy = function(point) {\n var viewportCTM = this.viewport.getCTM()\n viewportCTM.e += point.x\n viewportCTM.f += point.y\n this.viewport.setCTM(viewportCTM)\n}\n\n/**\n * Get pan vector\n *\n * @return {Object} {x: 0, y: 0}\n */\nSvgPanZoom.prototype.getPan = function() {\n var state = this.viewport.getState()\n\n return {x: state.x, y: state.y}\n}\n\n/**\n * Recalculates cached svg dimensions and controls position\n */\nSvgPanZoom.prototype.resize = function() {\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(this.svg)\n this.width = boundingClientRectNormalized.width\n this.height = boundingClientRectNormalized.height\n\n // Recalculate original state\n var viewport = this.viewport\n viewport.options.width = this.width\n viewport.options.height = this.height\n viewport.processCTM()\n\n // Reposition control icons by re-enabling them\n if (this.options.controlIconsEnabled) {\n this.getPublicInstance().disableControlIcons()\n this.getPublicInstance().enableControlIcons()\n }\n}\n\n/**\n * Unbind mouse events, free callbacks and destroy public instance\n */\nSvgPanZoom.prototype.destroy = function() {\n var that = this\n\n // Free callbacks\n this.beforeZoom = null\n this.onZoom = null\n this.beforePan = null\n this.onPan = null\n this.onUpdatedCTM = null\n\n // Destroy custom event handlers\n if (this.options.customEventsHandler != null) { // jshint ignore:line\n this.options.customEventsHandler.destroy({\n svgElement: this.svg\n , eventsListenerElement: this.options.eventsListenerElement\n , instance: this.getPublicInstance()\n })\n }\n\n // Unbind eventListeners\n for (var event in this.eventListeners) {\n (this.options.eventsListenerElement || this.svg)\n .removeEventListener(event, this.eventListeners[event], false)\n }\n\n // Unbind wheelListener\n this.disableMouseWheelZoom()\n\n // Remove control icons\n this.getPublicInstance().disableControlIcons()\n\n // Reset zoom and pan\n this.reset()\n\n // Remove instance from instancesStore\n instancesStore = instancesStore.filter(function(instance){\n return instance.svg !== that.svg\n })\n\n // Delete options and its contents\n delete this.options\n\n // Delete viewport to make public shadow viewport functions uncallable\n delete this.viewport\n\n // Destroy public instance and rewrite getPublicInstance\n delete this.publicInstance\n delete this.pi\n this.getPublicInstance = function(){\n return null\n }\n}\n\n/**\n * Returns a public instance object\n *\n * @return {Object} Public instance object\n */\nSvgPanZoom.prototype.getPublicInstance = function() {\n var that = this\n\n // Create cache\n if (!this.publicInstance) {\n this.publicInstance = this.pi = {\n // Pan\n enablePan: function() {that.options.panEnabled = true; return that.pi}\n , disablePan: function() {that.options.panEnabled = false; return that.pi}\n , isPanEnabled: function() {return !!that.options.panEnabled}\n , pan: function(point) {that.pan(point); return that.pi}\n , panBy: function(point) {that.panBy(point); return that.pi}\n , getPan: function() {return that.getPan()}\n // Pan event\n , setBeforePan: function(fn) {that.options.beforePan = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi}\n , setOnPan: function(fn) {that.options.onPan = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi}\n // Zoom and Control Icons\n , enableZoom: function() {that.options.zoomEnabled = true; return that.pi}\n , disableZoom: function() {that.options.zoomEnabled = false; return that.pi}\n , isZoomEnabled: function() {return !!that.options.zoomEnabled}\n , enableControlIcons: function() {\n if (!that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = true\n ControlIcons.enable(that)\n }\n return that.pi\n }\n , disableControlIcons: function() {\n if (that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = false;\n ControlIcons.disable(that)\n }\n return that.pi\n }\n , isControlIconsEnabled: function() {return !!that.options.controlIconsEnabled}\n // Double click zoom\n , enableDblClickZoom: function() {that.options.dblClickZoomEnabled = true; return that.pi}\n , disableDblClickZoom: function() {that.options.dblClickZoomEnabled = false; return that.pi}\n , isDblClickZoomEnabled: function() {return !!that.options.dblClickZoomEnabled}\n // Mouse wheel zoom\n , enableMouseWheelZoom: function() {that.enableMouseWheelZoom(); return that.pi}\n , disableMouseWheelZoom: function() {that.disableMouseWheelZoom(); return that.pi}\n , isMouseWheelZoomEnabled: function() {return !!that.options.mouseWheelZoomEnabled}\n // Zoom scale and bounds\n , setZoomScaleSensitivity: function(scale) {that.options.zoomScaleSensitivity = scale; return that.pi}\n , setMinZoom: function(zoom) {that.options.minZoom = zoom; return that.pi}\n , setMaxZoom: function(zoom) {that.options.maxZoom = zoom; return that.pi}\n // Zoom event\n , setBeforeZoom: function(fn) {that.options.beforeZoom = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi}\n , setOnZoom: function(fn) {that.options.onZoom = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi}\n // Zooming\n , zoom: function(scale) {that.publicZoom(scale, true); return that.pi}\n , zoomBy: function(scale) {that.publicZoom(scale, false); return that.pi}\n , zoomAtPoint: function(scale, point) {that.publicZoomAtPoint(scale, point, true); return that.pi}\n , zoomAtPointBy: function(scale, point) {that.publicZoomAtPoint(scale, point, false); return that.pi}\n , zoomIn: function() {this.zoomBy(1 + that.options.zoomScaleSensitivity); return that.pi}\n , zoomOut: function() {this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity)); return that.pi}\n , getZoom: function() {return that.getRelativeZoom()}\n // CTM update\n , setOnUpdatedCTM: function(fn) {that.options.onUpdatedCTM = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi}\n // Reset\n , resetZoom: function() {that.resetZoom(); return that.pi}\n , resetPan: function() {that.resetPan(); return that.pi}\n , reset: function() {that.reset(); return that.pi}\n // Fit, Contain and Center\n , fit: function() {that.fit(); return that.pi}\n , contain: function() {that.contain(); return that.pi}\n , center: function() {that.center(); return that.pi}\n // Size and Resize\n , updateBBox: function() {that.updateBBox(); return that.pi}\n , resize: function() {that.resize(); return that.pi}\n , getSizes: function() {\n return {\n width: that.width\n , height: that.height\n , realZoom: that.getZoom()\n , viewBox: that.viewport.getViewBox()\n }\n }\n // Destroy\n , destroy: function() {that.destroy(); return that.pi}\n }\n }\n\n return this.publicInstance\n}\n\n/**\n * Stores pairs of instances of SvgPanZoom and SVG\n * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom}\n *\n * @type {Array}\n */\nvar instancesStore = []\n\nvar svgPanZoom = function(elementOrSelector, options){\n var svg = Utils.getSvg(elementOrSelector)\n\n if (svg === null) {\n return null\n } else {\n // Look for existent instance\n for(var i = instancesStore.length - 1; i >= 0; i--) {\n if (instancesStore[i].svg === svg) {\n return instancesStore[i].instance.getPublicInstance()\n }\n }\n\n // If instance not found - create one\n instancesStore.push({\n svg: svg\n , instance: new SvgPanZoom(svg, options)\n })\n\n // Return just pushed instance\n return instancesStore[instancesStore.length - 1].instance.getPublicInstance()\n }\n}\n\nmodule.exports = svgPanZoom;\n","// uniwheel 0.1.2 (customized)\n// A unified cross browser mouse wheel event handler\n// https://github.com/teemualap/uniwheel\n\nmodule.exports = (function(){\n\n //Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel\n\n var prefix = \"\", _addEventListener, _removeEventListener, onwheel, support, fns = [];\n\n // detect event model\n if ( window.addEventListener ) {\n _addEventListener = \"addEventListener\";\n _removeEventListener = \"removeEventListener\";\n } else {\n _addEventListener = \"attachEvent\";\n _removeEventListener = \"detachEvent\";\n prefix = \"on\";\n }\n\n // detect available wheel event\n support = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\n document.onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\n\n\n function createCallback(element,callback,capture) {\n\n var fn = function(originalEvent) {\n\n !originalEvent && ( originalEvent = window.event );\n\n // create a normalized event object\n var event = {\n // keep a ref to the original event object\n originalEvent: originalEvent,\n target: originalEvent.target || originalEvent.srcElement,\n type: \"wheel\",\n deltaMode: originalEvent.type == \"MozMousePixelScroll\" ? 0 : 1,\n deltaX: 0,\n delatZ: 0,\n preventDefault: function() {\n originalEvent.preventDefault ?\n originalEvent.preventDefault() :\n originalEvent.returnValue = false;\n }\n };\n\n // calculate deltaY (and deltaX) according to the event\n if ( support == \"mousewheel\" ) {\n event.deltaY = - 1/40 * originalEvent.wheelDelta;\n // Webkit also support wheelDeltaX\n originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );\n } else {\n event.deltaY = originalEvent.detail;\n }\n\n // it's time to fire the callback\n return callback( event );\n\n };\n\n fns.push({\n element: element,\n fn: fn,\n capture: capture\n });\n\n return fn;\n }\n\n function getCallback(element,capture) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element && fns[i].capture === capture) {\n return fns[i].fn;\n }\n }\n return function(){};\n }\n\n function removeCallback(element,capture) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element && fns[i].capture === capture) {\n return fns.splice(i,1);\n }\n }\n }\n\n function _addWheelListener( elem, eventName, callback, useCapture ) {\n\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = createCallback(elem,callback,useCapture);\n }\n\n elem[ _addEventListener ]( prefix + eventName, cb, useCapture || false );\n\n }\n\n function _removeWheelListener( elem, eventName, callback, useCapture ) {\n\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = getCallback(elem,useCapture);\n }\n\n elem[ _removeEventListener ]( prefix + eventName, cb, useCapture || false );\n\n removeCallback(elem,useCapture);\n\n }\n\n function addWheelListener( elem, callback, useCapture ) {\n _addWheelListener( elem, support, callback, useCapture );\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _addWheelListener( elem, \"MozMousePixelScroll\", callback, useCapture);\n }\n }\n\n function removeWheelListener(elem,callback,useCapture){\n _removeWheelListener(elem,support,callback,useCapture);\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _removeWheelListener(elem, \"MozMousePixelScroll\", callback, useCapture);\n }\n }\n\n return {\n on: addWheelListener,\n off: removeWheelListener\n };\n\n})();\n"],"sourceRoot":""}