diff --git a/dist/vizicities.js b/dist/vizicities.js index dc2d35b..5575c8b 100644 --- a/dist/vizicities.js +++ b/dist/vizicities.js @@ -3194,11 +3194,9 @@ return /******/ (function(modules) { // webpackBootstrap var _three2 = _interopRequireDefault(_three); - var _threeOrbitControls = __webpack_require__(30); + var _vendorOrbitControls = __webpack_require__(30); - var _threeOrbitControls2 = _interopRequireDefault(_threeOrbitControls); - - var _OrbitControls = (0, _threeOrbitControls2['default'])(_three2['default']); + var _vendorOrbitControls2 = _interopRequireDefault(_vendorOrbitControls); var Orbit = (function (_EventEmitter) { _inherits(Orbit, _EventEmitter); @@ -3221,15 +3219,15 @@ return /******/ (function(modules) { // webpackBootstrap var _this = this; this._controls.addEventListener('start', function (event) { - _this._world.emit('controlsMoveStart', event.target.center); + _this._world.emit('controlsMoveStart', event.target.target); }); this._controls.addEventListener('change', function (event) { - _this._world.emit('controlsMove', event.target.center); + _this._world.emit('controlsMove', event.target.target); }); this._controls.addEventListener('end', function (event) { - _this._world.emit('controlsMoveEnd', event.target.center); + _this._world.emit('controlsMoveEnd', event.target.target); }); } @@ -3308,7 +3306,7 @@ return /******/ (function(modules) { // webpackBootstrap // TODO: Override panLeft and panUp methods to prevent panning on Y axis // See: http://stackoverflow.com/a/26188674/997339 - this._controls = new _OrbitControls(world._engine._camera, world._container); + this._controls = new _vendorOrbitControls2['default'](world._engine._camera, world._container); // Disable keys for now as no events are fired for them anyway this._controls.keys = false; @@ -3337,1124 +3335,1021 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, /* 30 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { - module.exports = function(THREE) { - var MOUSE = THREE.MOUSE - if (!MOUSE) - MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + Object.defineProperty(exports, '__esModule', { + value: true + }); - /** - * @author qiao / https://github.com/qiao - * @author mrdoob / http://mrdoob.com - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author erich666 / http://erichaines.com - */ - /*global THREE, console */ + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - function OrbitConstraint ( object ) { + // jscs:disable + /*eslint eqeqeq:0*/ - this.object = object; + var _three = __webpack_require__(24); - // "target" sets the location of focus, where the object orbits around - // and where it pans with respect to. - this.target = new THREE.Vector3(); + var _three2 = _interopRequireDefault(_three); - // Limits to how far you can dolly in and out ( PerspectiveCamera only ) - this.minDistance = 0; - this.maxDistance = Infinity; + /** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ - // Limits to how far you can zoom in and out ( OrthographicCamera only ) - this.minZoom = 0; - this.maxZoom = Infinity; + // This set of controls performs orbiting, dollying (zooming), and panning. + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finter swipe - // How far you can orbit vertically, upper and lower limits. - // Range is 0 to Math.PI radians. - this.minPolarAngle = 0; // radians - this.maxPolarAngle = Math.PI; // radians + var OrbitControls = function OrbitControls(object, domElement) { - // How far you can orbit horizontally, upper and lower limits. - // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. - this.minAzimuthAngle = - Infinity; // radians - this.maxAzimuthAngle = Infinity; // radians + this.object = object; - // Set to true to enable damping (inertia) - // If damping is enabled, you must call controls.update() in your animation loop - this.enableDamping = false; - this.dampingFactor = 0.25; + this.domElement = domElement !== undefined ? domElement : document; - //////////// - // internals + // Set to false to disable this control + this.enabled = true; - var scope = this; + // "target" sets the location of focus, where the object orbits around + this.target = new _three2['default'].Vector3(); - var EPS = 0.000001; + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; - // Current position in spherical coordinate system. - var theta; - var phi; + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; - // Pending changes - var phiDelta = 0; - var thetaDelta = 0; - var scale = 1; - var panOffset = new THREE.Vector3(); - var zoomChanged = false; + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians - // API + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = -Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians - this.getPolarAngle = function () { + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; - return phi; + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: _three2['default'].MOUSE.LEFT, ZOOM: _three2['default'].MOUSE.MIDDLE, PAN: _three2['default'].MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return phi; + }; + + this.getAzimuthalAngle = function () { + + return theta; + }; + + this.reset = function () { + + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent(changeEvent); + + scope.update(); + + state = STATE.NONE; + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = (function () { + + var offset = new _three2['default'].Vector3(); + + // so camera.up is the orbit axis + var quat = new _three2['default'].Quaternion().setFromUnitVectors(object.up, new _three2['default'].Vector3(0, 1, 0)); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new _three2['default'].Vector3(); + var lastQuaternion = new _three2['default'].Quaternion(); + + return function () { + + var position = scope.object.position; + + offset.copy(position).sub(scope.target); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + + // angle from z-axis around y-axis + + theta = Math.atan2(offset.x, offset.z); + + // angle from y-axis + + phi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y); + + if (scope.autoRotate && state === STATE.NONE) { + + rotateLeft(getAutoRotationAngle()); + } + + theta += thetaDelta; + phi += phiDelta; + + // restrict theta to be between desired limits + theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, theta)); + + // restrict phi to be between desired limits + phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, phi)); + + // restrict phi to be betwee EPS and PI-EPS + phi = Math.max(EPS, Math.min(Math.PI - EPS, phi)); + + var radius = offset.length() * scale; + + // restrict radius to be between desired limits + radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, radius)); + + // move target to panned location + scope.target.add(panOffset); + + offset.x = radius * Math.sin(phi) * Math.sin(theta); + offset.y = radius * Math.cos(phi); + offset.z = radius * Math.sin(phi) * Math.cos(theta); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + + position.copy(scope.target).add(offset); + + scope.object.lookAt(scope.target); + + if (scope.enableDamping === true) { + + thetaDelta *= 1 - scope.dampingFactor; + phiDelta *= 1 - scope.dampingFactor; + } else { + + thetaDelta = 0; + phiDelta = 0; + } + + scale = 1; + panOffset.set(0, 0, 0); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { + + scope.dispatchEvent(changeEvent); + + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + + return true; + } + + return false; }; + })(); - this.getAzimuthalAngle = function () { + this.dispose = function () { - return theta; + scope.domElement.removeEventListener('contextmenu', onContextMenu, false); + scope.domElement.removeEventListener('mousedown', onMouseDown, false); + scope.domElement.removeEventListener('mousewheel', onMouseWheel, false); + scope.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox + scope.domElement.removeEventListener('touchstart', onTouchStart, false); + scope.domElement.removeEventListener('touchend', onTouchEnd, false); + scope.domElement.removeEventListener('touchmove', onTouchMove, false); + + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + document.removeEventListener('mouseout', onMouseUp, false); + + window.removeEventListener('keydown', onKeyDown, false); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var theta; + var phi; + + var phiDelta = 0; + var thetaDelta = 0; + var scale = 1; + var panOffset = new _three2['default'].Vector3(); + var zoomChanged = false; + + var rotateStart = new _three2['default'].Vector2(); + var rotateEnd = new _three2['default'].Vector2(); + var rotateDelta = new _three2['default'].Vector2(); + + var panStart = new _three2['default'].Vector2(); + var panEnd = new _three2['default'].Vector2(); + var panDelta = new _three2['default'].Vector2(); + + var dollyStart = new _three2['default'].Vector2(); + var dollyEnd = new _three2['default'].Vector2(); + var dollyDelta = new _three2['default'].Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + } + + function getZoomScale() { + + return Math.pow(0.95, scope.zoomSpeed); + } + + function rotateLeft(angle) { + + thetaDelta -= angle; + } + + function rotateUp(angle) { + + phiDelta -= angle; + } + + var panLeft = (function () { + + var v = new _three2['default'].Vector3(); + + // return function panLeft( distance, objectMatrix ) { + // + // var te = objectMatrix.elements; + // + // // get X column of objectMatrix + // v.set( te[ 0 ], te[ 1 ], te[ 2 ] ); + // + // v.multiplyScalar( - distance ); + // + // panOffset.add( v ); + // + // }; + + // Fixed panning to x/y plane + return function panLeft(distance, objectMatrix) { + var te = objectMatrix.elements; + // var adjDist = distance / Math.cos(phi); + + v.set(te[0], 0, te[2]); + v.multiplyScalar(-distance); + + panOffset.add(v); }; + })(); - this.rotateLeft = function ( angle ) { + // Fixed panning to x/y plane + var panUp = (function () { - thetaDelta -= angle; + var v = new _three2['default'].Vector3(); + // return function panUp( distance, objectMatrix ) { + // + // var te = objectMatrix.elements; + // + // // get Y column of objectMatrix + // v.set( te[ 4 ], te[ 5 ], te[ 6 ] ); + // + // v.multiplyScalar( distance ); + // + // panOffset.add( v ); + // + // }; + + return function panUp(distance, objectMatrix) { + var te = objectMatrix.elements; + var adjDist = distance / Math.cos(phi); + + v.set(te[4], 0, te[6]); + v.multiplyScalar(adjDist); + + panOffset.add(v); }; + })(); - this.rotateUp = function ( angle ) { + // deltaX and deltaY are in pixels; right and down are positive + var pan = (function () { - phiDelta -= angle; + var offset = new _three2['default'].Vector3(); - }; + return function (deltaX, deltaY) { - // pass in distance in world space to move left - this.panLeft = function() { + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; - var v = new THREE.Vector3(); - - return function panLeft(distance) { - var te = this.object.matrix.elements; - var adjDist = distance / Math.cos(phi); - - v.set(te[ 0 ], 0, te[ 2 ]).normalize(); - v.multiplyScalar(-adjDist); - - panOffset.add(v); - }; - - }(); - - // pass in distance in world space to move up - this.panUp = function() { - - var v = new THREE.Vector3(); - - return function panUp(distance) { - var te = this.object.matrix.elements; - var adjDist = distance / Math.cos(phi); - - v.set(te[ 8 ], 0, te[ 10 ]).normalize(); - v.multiplyScalar(-adjDist); - - panOffset.add(v); - }; - - }(); - - // pass in x,y of change desired in pixel space, - // right and down are positive - this.pan = function ( deltaX, deltaY, screenWidth, screenHeight ) { - - if ( scope.object instanceof THREE.PerspectiveCamera ) { + if (scope.object instanceof _three2['default'].PerspectiveCamera) { // perspective var position = scope.object.position; - var offset = position.clone().sub( scope.target ); + offset.copy(position).sub(scope.target); var targetDistance = offset.length(); // half of the fov is center to top of screen - targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0); // we actually don't use screenWidth, since perspective camera is fixed to screen height - scope.panLeft( 2 * deltaX * targetDistance / screenHeight ); - scope.panUp( 2 * deltaY * targetDistance / screenHeight ); - - } else if ( scope.object instanceof THREE.OrthographicCamera ) { + panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); + } else if (scope.object instanceof _three2['default'].OrthographicCamera) { // orthographic - scope.panLeft( deltaX * ( scope.object.right - scope.object.left ) / screenWidth ); - scope.panUp( deltaY * ( scope.object.top - scope.object.bottom ) / screenHeight ); - + panLeft(deltaX * (scope.object.right - scope.object.left) / element.clientWidth, scope.object.matrix); + panUp(deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight, scope.object.matrix); } else { - // camera neither orthographic or perspective - console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); - + // camera neither orthographic nor perspective + console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.'); + scope.enablePan = false; } - }; + })(); - this.dollyIn = function ( dollyScale ) { + function dollyIn(dollyScale) { - if ( scope.object instanceof THREE.PerspectiveCamera ) { + if (scope.object instanceof _three2['default'].PerspectiveCamera) { - scale /= dollyScale; + scale /= dollyScale; + } else if (scope.object instanceof _three2['default'].OrthographicCamera) { - } else if ( scope.object instanceof THREE.OrthographicCamera ) { + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { - scope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom * dollyScale ) ); - scope.object.updateProjectionMatrix(); - zoomChanged = true; + console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.'); + scope.enableZoom = false; + } + } - } else { + function dollyOut(dollyScale) { - console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + if (scope.object instanceof _three2['default'].PerspectiveCamera) { - } + scale *= dollyScale; + } else if (scope.object instanceof _three2['default'].OrthographicCamera) { - }; + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { - this.dollyOut = function ( dollyScale ) { + console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.'); + scope.enableZoom = false; + } + } - if ( scope.object instanceof THREE.PerspectiveCamera ) { - - scale *= dollyScale; - - } else if ( scope.object instanceof THREE.OrthographicCamera ) { - - scope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / dollyScale ) ); - scope.object.updateProjectionMatrix(); - zoomChanged = true; - - } else { - - console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); - - } - - }; - - this.update = function() { - - var offset = new THREE.Vector3(); - - // so camera.up is the orbit axis - var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); - var quatInverse = quat.clone().inverse(); - - var lastPosition = new THREE.Vector3(); - var lastQuaternion = new THREE.Quaternion(); - - return function () { - - var position = this.object.position; - - offset.copy( position ).sub( this.target ); - - // rotate offset to "y-axis-is-up" space - offset.applyQuaternion( quat ); - - // angle from z-axis around y-axis - - theta = Math.atan2( offset.x, offset.z ); - - // angle from y-axis - - phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y ); - - theta += thetaDelta; - phi += phiDelta; - - // restrict theta to be between desired limits - theta = Math.max( this.minAzimuthAngle, Math.min( this.maxAzimuthAngle, theta ) ); - - // restrict phi to be between desired limits - phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) ); - - // restrict phi to be betwee EPS and PI-EPS - phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) ); - - var radius = offset.length() * scale; - - // restrict radius to be between desired limits - radius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) ); - - // move target to panned location - this.target.add( panOffset ); - - offset.x = radius * Math.sin( phi ) * Math.sin( theta ); - offset.y = radius * Math.cos( phi ); - offset.z = radius * Math.sin( phi ) * Math.cos( theta ); - - // rotate offset back to "camera-up-vector-is-up" space - offset.applyQuaternion( quatInverse ); - - position.copy( this.target ).add( offset ); - - this.object.lookAt( this.target ); - - if ( this.enableDamping === true ) { - - thetaDelta *= ( 1 - this.dampingFactor ); - phiDelta *= ( 1 - this.dampingFactor ); - - } else { - - thetaDelta = 0; - phiDelta = 0; - - } - - scale = 1; - panOffset.set( 0, 0, 0 ); - - // update condition is: - // min(camera displacement, camera rotation in radians)^2 > EPS - // using small-angle approximation cos(x/2) = 1 - x^2 / 8 - - if ( zoomChanged || - lastPosition.distanceToSquared( this.object.position ) > EPS || - 8 * ( 1 - lastQuaternion.dot( this.object.quaternion ) ) > EPS ) { - - lastPosition.copy( this.object.position ); - lastQuaternion.copy( this.object.quaternion ); - zoomChanged = false; - - return true; - - } - - return false; - - }; - - }(); - - }; - - - // This set of controls performs orbiting, dollying (zooming), and panning. It maintains - // the "up" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is - // supported. // - // Orbit - left mouse / touch: one finger move - // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish - // Pan - right mouse, or arrow keys / touch: three finter swipe + // event callbacks - update the object state + // - function OrbitControls ( object, domElement ) { + function handleMouseDownRotate(event) { - var constraint = new OrbitConstraint( object ); + //console.log( 'handleMouseDownRotate' ); - this.domElement = ( domElement !== undefined ) ? domElement : document; + rotateStart.set(event.clientX, event.clientY); + } - // API + function handleMouseDownDolly(event) { - Object.defineProperty( this, 'constraint', { + //console.log( 'handleMouseDownDolly' ); - get: function() { + dollyStart.set(event.clientX, event.clientY); + } - return constraint; + function handleMouseDownPan(event) { - } + //console.log( 'handleMouseDownPan' ); - } ); + panStart.set(event.clientX, event.clientY); + } - this.getPolarAngle = function () { + function handleMouseMoveRotate(event) { - return constraint.getPolarAngle(); + //console.log( 'handleMouseMoveRotate' ); - }; + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart); - this.getAzimuthalAngle = function () { + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; - return constraint.getAzimuthalAngle(); + // rotating across whole screen goes 360 degrees around + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); - }; + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); - // Set to false to disable this control - this.enabled = true; + rotateStart.copy(rotateEnd); - // center is old, deprecated; use "target" instead - this.center = this.target; + scope.update(); + } - // This option actually enables dollying in and out; left as "zoom" for - // backwards compatibility. - // Set to false to disable zooming - this.enableZoom = true; - this.zoomSpeed = 1.0; + function handleMouseMoveDolly(event) { - // Set to false to disable rotating - this.enableRotate = true; - this.rotateSpeed = 1.0; + //console.log( 'handleMouseMoveDolly' ); - // Set to false to disable panning - this.enablePan = true; - this.keyPanSpeed = 7.0; // pixels moved per arrow key push + dollyEnd.set(event.clientX, event.clientY); - // Set to true to automatically rotate around the target - // If auto-rotate is enabled, you must call controls.update() in your animation loop - this.autoRotate = false; - this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + dollyDelta.subVectors(dollyEnd, dollyStart); - // Set to false to disable use of the keys - this.enableKeys = true; + if (dollyDelta.y > 0) { - // The four arrow keys - this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + dollyIn(getZoomScale()); + } else if (dollyDelta.y < 0) { - // Mouse buttons - this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + dollyOut(getZoomScale()); + } - //////////// - // internals + dollyStart.copy(dollyEnd); - var scope = this; + scope.update(); + } - var rotateStart = new THREE.Vector2(); - var rotateEnd = new THREE.Vector2(); - var rotateDelta = new THREE.Vector2(); + function handleMouseMovePan(event) { - var panStart = new THREE.Vector2(); - var panEnd = new THREE.Vector2(); - var panDelta = new THREE.Vector2(); + //console.log( 'handleMouseMovePan' ); - var dollyStart = new THREE.Vector2(); - var dollyEnd = new THREE.Vector2(); - var dollyDelta = new THREE.Vector2(); + panEnd.set(event.clientX, event.clientY); - var STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 }; + panDelta.subVectors(panEnd, panStart); - var state = STATE.NONE; + pan(panDelta.x, panDelta.y); - // for reset + panStart.copy(panEnd); - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - this.zoom0 = this.object.zoom; + scope.update(); + } - // events + function handleMouseUp(event) { - var changeEvent = { type: 'change' }; - var startEvent = { type: 'start' }; - var endEvent = { type: 'end' }; + //console.log( 'handleMouseUp' ); - // pass in x,y of change desired in pixel space, - // right and down are positive - function pan( deltaX, deltaY ) { + } - var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + function handleMouseWheel(event) { - constraint.pan( deltaX, deltaY, element.clientWidth, element.clientHeight ); + //console.log( 'handleMouseWheel' ); + + var delta = 0; + + if (event.wheelDelta !== undefined) { + + // WebKit / Opera / Explorer 9 + + delta = event.wheelDelta; + } else if (event.detail !== undefined) { + + // Firefox + + delta = -event.detail; + } + + if (delta > 0) { + + dollyOut(getZoomScale()); + } else if (delta < 0) { + + dollyIn(getZoomScale()); + } + + scope.update(); + } + + function handleKeyDown(event) { + + //console.log( 'handleKeyDown' ); + + switch (event.keyCode) { + + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + scope.update(); + break; + + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + scope.update(); + break; + + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + scope.update(); + break; + + } + } + + function handleTouchStartRotate(event) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + + function handleTouchStartDolly(event) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyStart.set(0, distance); + } + + function handleTouchStartPan(event) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + + function handleTouchMoveRotate(event) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + + rotateStart.copy(rotateEnd); + + scope.update(); + } + + function handleTouchMoveDolly(event) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyEnd.set(0, distance); + + dollyDelta.subVectors(dollyEnd, dollyStart); + + if (dollyDelta.y > 0) { + + dollyOut(getZoomScale()); + } else if (dollyDelta.y < 0) { + + dollyIn(getZoomScale()); + } + + dollyStart.copy(dollyEnd); + + scope.update(); + } + + function handleTouchMovePan(event) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + + panDelta.subVectors(panEnd, panStart); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + + scope.update(); + } + + function handleTouchEnd(event) {} + + //console.log( 'handleTouchEnd' ); + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown(event) { + + if (scope.enabled === false) return; + + event.preventDefault(); + + if (event.button === scope.mouseButtons.ORBIT) { + + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + } else if (event.button === scope.mouseButtons.ZOOM) { + + if (scope.enableZoom === false) return; + + handleMouseDownDolly(event); + + state = STATE.DOLLY; + } else if (event.button === scope.mouseButtons.PAN) { + + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + } + + if (state !== STATE.NONE) { + + document.addEventListener('mousemove', onMouseMove, false); + document.addEventListener('mouseup', onMouseUp, false); + document.addEventListener('mouseout', onMouseUp, false); + + scope.dispatchEvent(startEvent); + } + } + + function onMouseMove(event) { + + if (scope.enabled === false) return; + + event.preventDefault(); + + if (state === STATE.ROTATE) { + + if (scope.enableRotate === false) return; + + handleMouseMoveRotate(event); + } else if (state === STATE.DOLLY) { + + if (scope.enableZoom === false) return; + + handleMouseMoveDolly(event); + } else if (state === STATE.PAN) { + + if (scope.enablePan === false) return; + + handleMouseMovePan(event); + } + } + + function onMouseUp(event) { + + if (scope.enabled === false) return; + + handleMouseUp(event); + + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + document.removeEventListener('mouseout', onMouseUp, false); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + } + + function onMouseWheel(event) { + + if (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel(event); + + scope.dispatchEvent(startEvent); // not sure why these are here... + scope.dispatchEvent(endEvent); + } + + function onKeyDown(event) { + + if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return; + + handleKeyDown(event); + } + + function onTouchStart(event) { + + if (scope.enabled === false) return; + + switch (event.touches.length) { + + case 1: + // one-fingered touch: rotate + + if (scope.enableRotate === false) return; + + handleTouchStartRotate(event); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: + // two-fingered touch: dolly + + if (scope.enableZoom === false) return; + + handleTouchStartDolly(event); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: + // three-fingered touch: pan + + if (scope.enablePan === false) return; + + handleTouchStartPan(event); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; } - this.update = function () { + if (state !== STATE.NONE) { - if ( this.autoRotate && state === STATE.NONE ) { + scope.dispatchEvent(startEvent); + } + } - constraint.rotateLeft( getAutoRotationAngle() ); + function onTouchMove(event) { - } + if (scope.enabled === false) return; - if ( constraint.update() === true ) { + event.preventDefault(); + event.stopPropagation(); - this.dispatchEvent( changeEvent ); + switch (event.touches.length) { - } + case 1: + // one-fingered touch: rotate - }; + if (scope.enableRotate === false) return; + if (state !== STATE.TOUCH_ROTATE) return; // is this needed?... - this.reset = function () { + handleTouchMoveRotate(event); - state = STATE.NONE; + break; - this.target.copy( this.target0 ); - this.object.position.copy( this.position0 ); - this.object.zoom = this.zoom0; + case 2: + // two-fingered touch: dolly - this.object.updateProjectionMatrix(); - this.dispatchEvent( changeEvent ); + if (scope.enableZoom === false) return; + if (state !== STATE.TOUCH_DOLLY) return; // is this needed?... - this.update(); + handleTouchMoveDolly(event); - }; + break; - function getAutoRotationAngle() { + case 3: + // three-fingered touch: pan - return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + if (scope.enablePan === false) return; + if (state !== STATE.TOUCH_PAN) return; // is this needed?... + + handleTouchMovePan(event); + + break; + + default: + + state = STATE.NONE; } + } - function getZoomScale() { + function onTouchEnd(event) { - return Math.pow( 0.95, scope.zoomSpeed ); + if (scope.enabled === false) return; + handleTouchEnd(event); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + } + + function onContextMenu(event) { + + event.preventDefault(); + } + + // + + scope.domElement.addEventListener('contextmenu', onContextMenu, false); + + scope.domElement.addEventListener('mousedown', onMouseDown, false); + scope.domElement.addEventListener('mousewheel', onMouseWheel, false); + scope.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox + + scope.domElement.addEventListener('touchstart', onTouchStart, false); + scope.domElement.addEventListener('touchend', onTouchEnd, false); + scope.domElement.addEventListener('touchmove', onTouchMove, false); + + window.addEventListener('keydown', onKeyDown, false); + + // force an update at start + + this.update(); + }; + + OrbitControls.prototype = Object.create(_three2['default'].EventDispatcher.prototype); + OrbitControls.prototype.constructor = _three2['default'].OrbitControls; + + Object.defineProperties(OrbitControls.prototype, { + + center: { + + get: function get() { + + console.warn('THREE.OrbitControls: .center has been renamed to .target'); + return this.target; } - function onMouseDown( event ) { + }, - if ( scope.enabled === false ) return; + // backward compatibility - event.preventDefault(); + noZoom: { - if ( event.button === scope.mouseButtons.ORBIT ) { + get: function get() { - if ( scope.enableRotate === false ) return; + console.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + return !this.enableZoom; + }, - state = STATE.ROTATE; - - rotateStart.set( event.clientX, event.clientY ); - - } else if ( event.button === scope.mouseButtons.ZOOM ) { - - if ( scope.enableZoom === false ) return; - - state = STATE.DOLLY; - - dollyStart.set( event.clientX, event.clientY ); - - } else if ( event.button === scope.mouseButtons.PAN ) { - - if ( scope.enablePan === false ) return; - - state = STATE.PAN; - - panStart.set( event.clientX, event.clientY ); - - } - - if ( state !== STATE.NONE ) { - - document.addEventListener( 'mousemove', onMouseMove, false ); - document.addEventListener( 'mouseup', onMouseUp, false ); - scope.dispatchEvent( startEvent ); - - } + set: function set(value) { + console.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + this.enableZoom = !value; } - function onMouseMove( event ) { + }, - if ( scope.enabled === false ) return; + noRotate: { - event.preventDefault(); + get: function get() { - var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + console.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + return !this.enableRotate; + }, - if ( state === STATE.ROTATE ) { - - if ( scope.enableRotate === false ) return; - - rotateEnd.set( event.clientX, event.clientY ); - rotateDelta.subVectors( rotateEnd, rotateStart ); - - // rotating across whole screen goes 360 degrees around - constraint.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); - - // rotating up and down along whole screen attempts to go 360, but limited to 180 - constraint.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); - - rotateStart.copy( rotateEnd ); - - } else if ( state === STATE.DOLLY ) { - - if ( scope.enableZoom === false ) return; - - dollyEnd.set( event.clientX, event.clientY ); - dollyDelta.subVectors( dollyEnd, dollyStart ); - - if ( dollyDelta.y > 0 ) { - - constraint.dollyIn( getZoomScale() ); - - } else if ( dollyDelta.y < 0 ) { - - constraint.dollyOut( getZoomScale() ); - - } - - dollyStart.copy( dollyEnd ); - - } else if ( state === STATE.PAN ) { - - if ( scope.enablePan === false ) return; - - panEnd.set( event.clientX, event.clientY ); - panDelta.subVectors( panEnd, panStart ); - - pan( panDelta.x, panDelta.y ); - - panStart.copy( panEnd ); - - } - - if ( state !== STATE.NONE ) scope.update(); + set: function set(value) { + console.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + this.enableRotate = !value; } - function onMouseUp( /* event */ ) { + }, - if ( scope.enabled === false ) return; + noPan: { - document.removeEventListener( 'mousemove', onMouseMove, false ); - document.removeEventListener( 'mouseup', onMouseUp, false ); - scope.dispatchEvent( endEvent ); - state = STATE.NONE; + get: function get() { + console.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + return !this.enablePan; + }, + + set: function set(value) { + + console.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + this.enablePan = !value; } - function onMouseWheel( event ) { + }, - if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return; + noKeys: { - event.preventDefault(); - event.stopPropagation(); + get: function get() { - var delta = 0; + console.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + return !this.enableKeys; + }, - if ( event.wheelDelta !== undefined ) { - - // WebKit / Opera / Explorer 9 - - delta = event.wheelDelta; - - } else if ( event.detail !== undefined ) { - - // Firefox - - delta = - event.detail; - - } - - if ( delta > 0 ) { - - constraint.dollyOut( getZoomScale() ); - - } else if ( delta < 0 ) { - - constraint.dollyIn( getZoomScale() ); - - } - - scope.update(); - scope.dispatchEvent( startEvent ); - scope.dispatchEvent( endEvent ); + set: function set(value) { + console.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + this.enableKeys = !value; } - function onKeyDown( event ) { + }, - if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + staticMoving: { - switch ( event.keyCode ) { + get: function get() { - case scope.keys.UP: - pan( 0, scope.keyPanSpeed ); - scope.update(); - break; + console.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + return !this.constraint.enableDamping; + }, - case scope.keys.BOTTOM: - pan( 0, - scope.keyPanSpeed ); - scope.update(); - break; - - case scope.keys.LEFT: - pan( scope.keyPanSpeed, 0 ); - scope.update(); - break; - - case scope.keys.RIGHT: - pan( - scope.keyPanSpeed, 0 ); - scope.update(); - break; - - } + set: function set(value) { + console.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + this.constraint.enableDamping = !value; } - function touchstart( event ) { + }, - if ( scope.enabled === false ) return; + dynamicDampingFactor: { - switch ( event.touches.length ) { + get: function get() { - case 1: // one-fingered touch: rotate + console.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + return this.constraint.dampingFactor; + }, - if ( scope.enableRotate === false ) return; - - state = STATE.TOUCH_ROTATE; - - rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - break; - - case 2: // two-fingered touch: dolly - - if ( scope.enableZoom === false ) return; - - state = STATE.TOUCH_DOLLY; - - var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; - var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; - var distance = Math.sqrt( dx * dx + dy * dy ); - dollyStart.set( 0, distance ); - break; - - case 3: // three-fingered touch: pan - - if ( scope.enablePan === false ) return; - - state = STATE.TOUCH_PAN; - - panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - break; - - default: - - state = STATE.NONE; - - } - - if ( state !== STATE.NONE ) scope.dispatchEvent( startEvent ); + set: function set(value) { + console.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + this.constraint.dampingFactor = value; } - function touchmove( event ) { + } - if ( scope.enabled === false ) return; + }); - event.preventDefault(); - event.stopPropagation(); - - var element = scope.domElement === document ? scope.domElement.body : scope.domElement; - - switch ( event.touches.length ) { - - case 1: // one-fingered touch: rotate - - if ( scope.enableRotate === false ) return; - if ( state !== STATE.TOUCH_ROTATE ) return; - - rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - rotateDelta.subVectors( rotateEnd, rotateStart ); - - // rotating across whole screen goes 360 degrees around - constraint.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); - // rotating up and down along whole screen attempts to go 360, but limited to 180 - constraint.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); - - rotateStart.copy( rotateEnd ); - - scope.update(); - break; - - case 2: // two-fingered touch: dolly - - if ( scope.enableZoom === false ) return; - if ( state !== STATE.TOUCH_DOLLY ) return; - - var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; - var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; - var distance = Math.sqrt( dx * dx + dy * dy ); - - dollyEnd.set( 0, distance ); - dollyDelta.subVectors( dollyEnd, dollyStart ); - - if ( dollyDelta.y > 0 ) { - - constraint.dollyOut( getZoomScale() ); - - } else if ( dollyDelta.y < 0 ) { - - constraint.dollyIn( getZoomScale() ); - - } - - dollyStart.copy( dollyEnd ); - - scope.update(); - break; - - case 3: // three-fingered touch: pan - - if ( scope.enablePan === false ) return; - if ( state !== STATE.TOUCH_PAN ) return; - - panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - panDelta.subVectors( panEnd, panStart ); - - pan( panDelta.x, panDelta.y ); - - panStart.copy( panEnd ); - - scope.update(); - break; - - default: - - state = STATE.NONE; - - } - - } - - function touchend( /* event */ ) { - - if ( scope.enabled === false ) return; - - scope.dispatchEvent( endEvent ); - state = STATE.NONE; - - } - - function contextmenu( event ) { - - event.preventDefault(); - - } - - this.dispose = function() { - - this.domElement.removeEventListener( 'contextmenu', contextmenu, false ); - this.domElement.removeEventListener( 'mousedown', onMouseDown, false ); - this.domElement.removeEventListener( 'mousewheel', onMouseWheel, false ); - this.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox - - this.domElement.removeEventListener( 'touchstart', touchstart, false ); - this.domElement.removeEventListener( 'touchend', touchend, false ); - this.domElement.removeEventListener( 'touchmove', touchmove, false ); - - document.removeEventListener( 'mousemove', onMouseMove, false ); - document.removeEventListener( 'mouseup', onMouseUp, false ); - - window.removeEventListener( 'keydown', onKeyDown, false ); - - } - - this.domElement.addEventListener( 'contextmenu', contextmenu, false ); - - this.domElement.addEventListener( 'mousedown', onMouseDown, false ); - this.domElement.addEventListener( 'mousewheel', onMouseWheel, false ); - this.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox - - this.domElement.addEventListener( 'touchstart', touchstart, false ); - this.domElement.addEventListener( 'touchend', touchend, false ); - this.domElement.addEventListener( 'touchmove', touchmove, false ); - - window.addEventListener( 'keydown', onKeyDown, false ); - - // force an update at start - this.update(); - - }; - - OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); - OrbitControls.prototype.constructor = OrbitControls; - - Object.defineProperties( OrbitControls.prototype, { - - object: { - - get: function () { - - return this.constraint.object; - - } - - }, - - target: { - - get: function () { - - return this.constraint.target; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: target is now immutable. Use target.set() instead.' ); - this.constraint.target.copy( value ); - - } - - }, - - minDistance : { - - get: function () { - - return this.constraint.minDistance; - - }, - - set: function ( value ) { - - this.constraint.minDistance = value; - - } - - }, - - maxDistance : { - - get: function () { - - return this.constraint.maxDistance; - - }, - - set: function ( value ) { - - this.constraint.maxDistance = value; - - } - - }, - - minZoom : { - - get: function () { - - return this.constraint.minZoom; - - }, - - set: function ( value ) { - - this.constraint.minZoom = value; - - } - - }, - - maxZoom : { - - get: function () { - - return this.constraint.maxZoom; - - }, - - set: function ( value ) { - - this.constraint.maxZoom = value; - - } - - }, - - minPolarAngle : { - - get: function () { - - return this.constraint.minPolarAngle; - - }, - - set: function ( value ) { - - this.constraint.minPolarAngle = value; - - } - - }, - - maxPolarAngle : { - - get: function () { - - return this.constraint.maxPolarAngle; - - }, - - set: function ( value ) { - - this.constraint.maxPolarAngle = value; - - } - - }, - - minAzimuthAngle : { - - get: function () { - - return this.constraint.minAzimuthAngle; - - }, - - set: function ( value ) { - - this.constraint.minAzimuthAngle = value; - - } - - }, - - maxAzimuthAngle : { - - get: function () { - - return this.constraint.maxAzimuthAngle; - - }, - - set: function ( value ) { - - this.constraint.maxAzimuthAngle = value; - - } - - }, - - enableDamping : { - - get: function () { - - return this.constraint.enableDamping; - - }, - - set: function ( value ) { - - this.constraint.enableDamping = value; - - } - - }, - - dampingFactor : { - - get: function () { - - return this.constraint.dampingFactor; - - }, - - set: function ( value ) { - - this.constraint.dampingFactor = value; - - } - - }, - - // backward compatibility - - noZoom: { - - get: function () { - - console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); - return ! this.enableZoom; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); - this.enableZoom = ! value; - - } - - }, - - noRotate: { - - get: function () { - - console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); - return ! this.enableRotate; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); - this.enableRotate = ! value; - - } - - }, - - noPan: { - - get: function () { - - console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); - return ! this.enablePan; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); - this.enablePan = ! value; - - } - - }, - - noKeys: { - - get: function () { - - console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); - return ! this.enableKeys; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); - this.enableKeys = ! value; - - } - - }, - - staticMoving : { - - get: function () { - - console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); - return ! this.constraint.enableDamping; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); - this.constraint.enableDamping = ! value; - - } - - }, - - dynamicDampingFactor : { - - get: function () { - - console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); - return this.constraint.dampingFactor; - - }, - - set: function ( value ) { - - console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); - this.constraint.dampingFactor = value; - - } - - } - - } ); - - return OrbitControls; - } - + exports['default'] = OrbitControls; + module.exports = exports['default']; /***/ }, /* 31 */ diff --git a/dist/vizicities.min.js b/dist/vizicities.min.js index fdd0698..9516f7e 100644 --- a/dist/vizicities.min.js +++ b/dist/vizicities.min.js @@ -1,4 +1,4 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("proj4"),require("THREE")):"function"==typeof define&&define.amd?define(["proj4","THREE"],t):"object"==typeof exports?exports.VIZI=t(require("proj4"),require("THREE")):e.VIZI=t(e.proj4,e.THREE)}(this,function(e,t){return function(e){function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var t={};return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.p="",__webpack_require__(0)}([function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=_interopRequireDefault(r),o=n(28),a=_interopRequireDefault(o),u=n(31),s=_interopRequireDefault(u),l=n(33),c=_interopRequireDefault(l),f=n(11),h=_interopRequireDefault(f),p=n(10),d=_interopRequireDefault(p),v={version:"0.3",World:i["default"],Controls:a["default"],EnvironmentLayer:s["default"],ImageTileLayer:c["default"],Point:h["default"],LatLon:d["default"]};t["default"]=v,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n-1&&this._layers.splice(t,1),this._engine._scene.remove(e._layer),e.destroy(),this.emit("layerRemoved"),this}},{key:"addControls",value:function(e){return e._addToWorld(this),this._controls.push(e),this.emit("controlsAdded",e),this}},{key:"removeControls",value:function(e){}}]),World}(a["default"]);t["default"]=function(e,t){return new m(e,t)},e.exports=t["default"]},function(e,t,n){"use strict";function EE(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function EventEmitter(){}var r="function"!=typeof Object.create?"~":!1;EventEmitter.prototype._events=void 0,EventEmitter.prototype.listeners=function(e,t){var n=r?r+e:e,i=this._events&&this._events[n];if(t)return!!i;if(!i)return[];if(i.fn)return[i.fn];for(var o=0,a=i.length,u=new Array(a);a>o;o++)u[o]=i[o].fn;return u},EventEmitter.prototype.emit=function(e,t,n,i,o,a){var u=r?r+e:e;if(!this._events||!this._events[u])return!1;var s,l,c=this._events[u],f=arguments.length;if("function"==typeof c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),f){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,i),!0;case 5:return c.fn.call(c.context,t,n,i,o),!0;case 6:return c.fn.call(c.context,t,n,i,o,a),!0}for(l=1,s=new Array(f-1);f>l;l++)s[l-1]=arguments[l];c.fn.apply(c.context,s)}else{var h,p=c.length;for(l=0;p>l;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),f){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;default:if(!s)for(h=1,s=new Array(f-1);f>h;h++)s[h-1]=arguments[h];c[l].fn.apply(c[l].context,s)}}return!0},EventEmitter.prototype.on=function(e,t,n){var i=new EE(t,n||this),o=r?r+e:e;return this._events||(this._events=r?{}:Object.create(null)),this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],i]:this._events[o].push(i):this._events[o]=i,this},EventEmitter.prototype.once=function(e,t,n){var i=new EE(t,n||this,!0),o=r?r+e:e;return this._events||(this._events=r?{}:Object.create(null)),this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],i]:this._events[o].push(i):this._events[o]=i,this},EventEmitter.prototype.removeListener=function(e,t,n,i){var o=r?r+e:e;if(!this._events||!this._events[o])return this;var a=this._events[o],u=[];if(t)if(a.fn)(a.fn!==t||i&&!a.once||n&&a.context!==n)&&u.push(a);else for(var s=0,l=a.length;l>s;s++)(a[s].fn!==t||i&&!a[s].once||n&&a[s].context!==n)&&u.push(a[s]);return u.length?this._events[o]=1===u.length?u[0]:u:delete this._events[o],this},EventEmitter.prototype.removeAllListeners=function(e){return this._events?(e?delete this._events[r?r+e:e]:this._events=r?{}:Object.create(null),this):this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prototype.setMaxListeners=function(){return this},EventEmitter.prefixed=r,e.exports=EventEmitter},function(e,t,n){function isIndex(e,t){return e="number"==typeof e||s.test(e)?+e:-1,t=null==t?o:t,e>-1&&e%1==0&&t>e}function assignValue(e,t,n){var r=e[t];(!eq(r,n)||eq(r,l[t])&&!c.call(e,t)||void 0===n&&!(t in e))&&(e[t]=n)}function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function copyObject(e,t,n){return copyObjectWith(e,t,n)}function copyObjectWith(e,t,n,r){n||(n={});for(var i=-1,o=t.length;++i1?n[i-1]:void 0,a=i>2?n[2]:void 0;for(o="function"==typeof o?(i--,o):void 0,a&&isIterateeCall(n[0],n[1],a)&&(o=3>i?void 0:o,i=1),t=Object(t);++r-1&&e%1==0&&o>=e}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var r=n(4),i=n(5),o=9007199254740991,a="[object Function]",u="[object GeneratorFunction]",s=/^(?:0|[1-9]\d*)$/,l=Object.prototype,c=l.hasOwnProperty,f=l.toString,h=baseProperty("length"),p=createAssigner(function(e,t){copyObject(t,r(t),e)});e.exports=p},function(e,t){function baseTimes(e,t){for(var n=-1,r=Array(e);++n-1&&e%1==0&&t>e}function baseHas(e,t){return l.call(e,t)||"object"==typeof e&&t in e&&null===f(e)}function baseKeys(e){return p(Object(e))}function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function indexKeys(e){var t=e?e.length:void 0;return isLength(t)&&(v(e)||isString(e)||isArguments(e))?baseTimes(t,String):null}function isPrototype(e){var t=e&&e.constructor,n="function"==typeof t&&t.prototype||s;return e===n}function isArguments(e){return isArrayLikeObject(e)&&l.call(e,"callee")&&(!h.call(e,"callee")||c.call(e)==r)}function isArrayLike(e){return null!=e&&!("function"==typeof e&&isFunction(e))&&isLength(d(e))}function isArrayLikeObject(e){return isObjectLike(e)&&isArrayLike(e)}function isFunction(e){var t=isObject(e)?c.call(e):"";return t==i||t==o}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&n>=e}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isString(e){return"string"==typeof e||!v(e)&&isObjectLike(e)&&c.call(e)==a}function keys(e){var t=isPrototype(e);if(!t&&!isArrayLike(e))return baseKeys(e);var n=indexKeys(e),r=!!n,i=n||[],o=i.length;for(var a in e)!baseHas(e,a)||r&&("length"==a||isIndex(a,o))||t&&"constructor"==a||i.push(a);return i}var n=9007199254740991,r="[object Arguments]",i="[object Function]",o="[object GeneratorFunction]",a="[object String]",u=/^(?:0|[1-9]\d*)$/,s=Object.prototype,l=s.hasOwnProperty,c=s.toString,f=Object.getPrototypeOf,h=s.propertyIsEnumerable,p=Object.keys,d=baseProperty("length"),v=Array.isArray;e.exports=keys},function(e,t){function apply(e,t,n){var r=n.length;switch(r){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function rest(e,t){if("function"!=typeof e)throw new TypeError(n);return t=v(void 0===t?e.length-1:toInteger(t),0),function(){for(var n=arguments,r=-1,i=v(n.length-t,0),o=Array(i);++re?-1:1;return t*i}var n=e%1;return e===e?n?e-n:e:0}function toNumber(e){if(isObject(e)){var t=isFunction(e.valueOf)?e.valueOf():e;e=isObject(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(s,"");var n=c.test(e);return n||f.test(e)?h(e.slice(2),n?2:8):l.test(e)?o:+e}var n="Expected a function",r=1/0,i=1.7976931348623157e308,o=NaN,a="[object Function]",u="[object GeneratorFunction]",s=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,f=/^0o[0-7]+$/i,h=parseInt,p=Object.prototype,d=p.toString,v=Math.max;e.exports=rest},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(7),i=_interopRequireDefault(r),o=n(15),a=_interopRequireDefault(o),u=n(17),s=_interopRequireDefault(u),l=n(19),c=_interopRequireDefault(l),f=n(20),h=_interopRequireDefault(f),p={};p.EPSG3857=i["default"],p.EPSG900913=r.EPSG900913,p.EPSG3395=a["default"],p.EPSG4326=s["default"],p.Simple=c["default"],p.Proj4=h["default"],t["default"]=p,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(13),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f={code:"EPSG:3857",projection:s["default"],transformScale:1/(Math.PI*s["default"].R),transformation:function(){var e=1/(Math.PI*s["default"].R);return new c["default"](e,0,-e,0)}()},h=(0,i["default"])({},a["default"],f),p=(0,i["default"])({},h,{code:"EPSG:900913"});t.EPSG900913=p,t["default"]=h},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(9),a=_interopRequireDefault(o),u=n(10),s=(_interopRequireDefault(u),{wrapLon:[-180,180],R:6378137,distance:function(e,t,n){var r,i,o,a=Math.PI/180;if(n){r=e.lat*a,i=t.lat*a;var u=e.lon*a,s=t.lon*a,l=i-r,c=s-u,f=l/2,h=c/2;o=Math.sin(f)*Math.sin(f)+Math.cos(r)*Math.cos(i)*Math.sin(h)*Math.sin(h);var p=2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o));return this.R*p}return r=e.lat*a,i=t.lat*a,o=Math.sin(r)*Math.sin(i)+Math.cos(r)*Math.cos(i)*Math.cos((t.lon-e.lon)*a),this.R*Math.acos(Math.min(o,1))},pointScale:function(e,t){return this.projection.pointScale?this.projection.pointScale(e,t):[1,1]},metresToProjected:function(e,t){return e*t[1]},projectedToMetres:function(e,t){return e/t[1]},metresToWorld:function(e,t,n){var r=this.metresToProjected(e,t),i=this.scale(n);n&&(i/=2);var o=i*(this.transformScale*r)/t[1];return o},worldToMetres:function(e,t,n){var r=this.scale(n);n&&(r/=2);var i=e/r/this.transformScale*t[1],o=this.projectedToMetres(i,t);return o}});t["default"]=(0,i["default"])({},a["default"],s),e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(10),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),u=n(12),s=_interopRequireDefault(u),l={scaleFactor:1e6,latLonToPoint:function(e,t){var n=this.projection.project(e),r=this.scale(t);return t&&(r/=2),this.transformation._transform(n,r)},pointToLatLon:function(e,t){var n=this.scale(t);t&&(n/=2);var r=this.transformation.untransform(e,n);return this.projection.unproject(r)},project:function(e){return this.projection.project(e)},unproject:function(e){return this.projection.unproject(e)},scale:function(e){return e>=0?256*Math.pow(2,e):this.scaleFactor},zoom:function(e){return Math.log(e/256)/Math.LN2},getProjectedBounds:function(e){if(this.infinite)return null;var t=this.projection.bounds,n=this.scale(e);e&&(n/=2);var r=this.transformation.transform((0,a["default"])(t[0]),n),i=this.transformation.transform((0,a["default"])(t[1]),n);return[r,i]},wrapLatLon:function(e){var t=this.wrapLat?(0,s["default"])(e.lat,this.wrapLat,!0):e.lat,n=this.wrapLon?(0,s["default"])(e.lon,this.wrapLon,!0):e.lon,r=e.alt;return(0,i["default"])(t,n,r)}};t["default"]=l,e.exports=t["default"]},function(e,t){function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function defineProperties(e,t){for(var n=0;nl&&Math.abs(c)>1e-7;l++)t=a*Math.sin(s),t=Math.pow((1-t)/(1+t),a/2),c=Math.PI/2-2*Math.atan(u*t)-s,s+=c;return(0,i["default"])(s*n,e.x*n/r)},pointScale:function(e){var t=Math.PI/180,n=e.lat*t,r=Math.sin(n),i=r*r,o=Math.cos(n),a=Math.sqrt(1-this.ECC2*i)/o;return[a,a]},bounds:[[-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]]};t["default"]=u,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(18),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f={code:"EPSG:4326",projection:s["default"],transformScale:1/180,transformation:new c["default"](1/180,0,-1/180,0)},h=(0,i["default"])({},a["default"],f);t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(10),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),u={project:function(e){return(0,a["default"])(e.lon,e.lat)},unproject:function(e){return(0,i["default"])(e.y,e.x)},pointScale:function(e){var t=111132.92,n=-559.82,r=1.175,i=-.0023,o=111412.84,a=-93.5,u=.118,s=Math.PI/180,l=e.lat*s,c=t+n*Math.cos(2*l)+r*Math.cos(4*l)+i*Math.cos(6*l),f=o*Math.cos(l)+a*Math.cos(3*l)+u*Math.cos(5*l);return[1/c,1/f]},bounds:[[-180,-90],[180,90]]};t["default"]=u,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(9),a=_interopRequireDefault(o),u=n(18),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f={projection:s["default"],transformation:new c["default"](1,0,1,0),scale:function(e){return e?Math.pow(2,e):1},zoom:function(e){return Math.log(e)/Math.LN2},distance:function(e,t){var n=t.lon-e.lon,r=t.lat-e.lat;return Math.sqrt(n*n+r*r)},infinite:!0},h=(0,i["default"])({},a["default"],f);t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(21),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f=function(e,t,n){var r=(0,s["default"])(t,n),i=r.bounds[1][0]-r.bounds[0][0],o=r.bounds[1][1]-r.bounds[0][1],a=i/2,u=o/2,l=1/a,f=1/u,h=Math.min(l,f),p=h*(r.bounds[0][0]+a),d=h*(r.bounds[0][1]+u);return{code:e,projection:r,transformScale:h,transformation:new c["default"](h,-p,-h,d)}},h=function(e,t,n){return(0,i["default"])({},a["default"],f(e,t,n))};t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(22),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o),u=n(11),s=_interopRequireDefault(u),l=function(e,t){var n=(0,i["default"])(e),r=function(e){return(0,s["default"])(n.forward([e.lon,e.lat]))},o=function(e){var t=n.inverse([e.x,e.y]);return(0,a["default"])(t[1],t[0])};return{project:r,unproject:o,pointScale:function(e,t){return[1,1]},bounds:function(){if(t)return t;var e=r([-90,-180]),n=r([90,180]);return[e,n]}()}};t["default"]=l,e.exports=t["default"]},function(t,n){t.exports=e},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;no||8*(1-d.dot(this.object.quaternion))>o?(p.copy(this.object.position),d.copy(this.object.quaternion),c=!1,!0):!1}}()}function OrbitControls(t,n){function pan(e,t){var n=i.domElement===document?i.domElement.body:i.domElement;r.pan(e,t,n.clientWidth,n.clientHeight)}function getAutoRotationAngle(){return 2*Math.PI/60/60*i.autoRotateSpeed}function getZoomScale(){return Math.pow(.95,i.zoomSpeed)}function onMouseDown(e){if(i.enabled!==!1){if(e.preventDefault(),e.button===i.mouseButtons.ORBIT){if(i.enableRotate===!1)return;v=d.ROTATE,o.set(e.clientX,e.clientY)}else if(e.button===i.mouseButtons.ZOOM){if(i.enableZoom===!1)return;v=d.DOLLY,f.set(e.clientX,e.clientY)}else if(e.button===i.mouseButtons.PAN){if(i.enablePan===!1)return;v=d.PAN,s.set(e.clientX,e.clientY)}v!==d.NONE&&(document.addEventListener("mousemove",onMouseMove,!1),document.addEventListener("mouseup",onMouseUp,!1),i.dispatchEvent(m))}}function onMouseMove(e){if(i.enabled!==!1){e.preventDefault();var t=i.domElement===document?i.domElement.body:i.domElement;if(v===d.ROTATE){if(i.enableRotate===!1)return;a.set(e.clientX,e.clientY),u.subVectors(a,o),r.rotateLeft(2*Math.PI*u.x/t.clientWidth*i.rotateSpeed),r.rotateUp(2*Math.PI*u.y/t.clientHeight*i.rotateSpeed),o.copy(a)}else if(v===d.DOLLY){if(i.enableZoom===!1)return;h.set(e.clientX,e.clientY),p.subVectors(h,f),p.y>0?r.dollyIn(getZoomScale()):p.y<0&&r.dollyOut(getZoomScale()),f.copy(h)}else if(v===d.PAN){if(i.enablePan===!1)return;l.set(e.clientX,e.clientY),c.subVectors(l,s),pan(c.x,c.y),s.copy(l)}v!==d.NONE&&i.update()}}function onMouseUp(){i.enabled!==!1&&(document.removeEventListener("mousemove",onMouseMove,!1),document.removeEventListener("mouseup",onMouseUp,!1),i.dispatchEvent(_),v=d.NONE)}function onMouseWheel(e){if(i.enabled!==!1&&i.enableZoom!==!1&&v===d.NONE){e.preventDefault(),e.stopPropagation();var t=0;void 0!==e.wheelDelta?t=e.wheelDelta:void 0!==e.detail&&(t=-e.detail),t>0?r.dollyOut(getZoomScale()):0>t&&r.dollyIn(getZoomScale()),i.update(),i.dispatchEvent(m),i.dispatchEvent(_)}}function onKeyDown(e){if(i.enabled!==!1&&i.enableKeys!==!1&&i.enablePan!==!1)switch(e.keyCode){case i.keys.UP:pan(0,i.keyPanSpeed),i.update();break;case i.keys.BOTTOM:pan(0,-i.keyPanSpeed),i.update();break;case i.keys.LEFT:pan(i.keyPanSpeed,0),i.update();break;case i.keys.RIGHT:pan(-i.keyPanSpeed,0),i.update()}}function touchstart(e){if(i.enabled!==!1){switch(e.touches.length){case 1:if(i.enableRotate===!1)return;v=d.TOUCH_ROTATE,o.set(e.touches[0].pageX,e.touches[0].pageY);break;case 2:if(i.enableZoom===!1)return;v=d.TOUCH_DOLLY;var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);f.set(0,r);break;case 3:if(i.enablePan===!1)return;v=d.TOUCH_PAN,s.set(e.touches[0].pageX,e.touches[0].pageY);break;default:v=d.NONE}v!==d.NONE&&i.dispatchEvent(m)}}function touchmove(e){if(i.enabled!==!1){e.preventDefault(),e.stopPropagation();var t=i.domElement===document?i.domElement.body:i.domElement;switch(e.touches.length){case 1:if(i.enableRotate===!1)return;if(v!==d.TOUCH_ROTATE)return;a.set(e.touches[0].pageX,e.touches[0].pageY),u.subVectors(a,o),r.rotateLeft(2*Math.PI*u.x/t.clientWidth*i.rotateSpeed),r.rotateUp(2*Math.PI*u.y/t.clientHeight*i.rotateSpeed),o.copy(a),i.update();break;case 2:if(i.enableZoom===!1)return;if(v!==d.TOUCH_DOLLY)return;var n=e.touches[0].pageX-e.touches[1].pageX,y=e.touches[0].pageY-e.touches[1].pageY,m=Math.sqrt(n*n+y*y);h.set(0,m),p.subVectors(h,f),p.y>0?r.dollyOut(getZoomScale()):p.y<0&&r.dollyIn(getZoomScale()),f.copy(h),i.update();break;case 3:if(i.enablePan===!1)return;if(v!==d.TOUCH_PAN)return;l.set(e.touches[0].pageX,e.touches[0].pageY),c.subVectors(l,s),pan(c.x,c.y),s.copy(l),i.update();break;default:v=d.NONE}}}function touchend(){i.enabled!==!1&&(i.dispatchEvent(_),v=d.NONE)}function contextmenu(e){e.preventDefault()}var r=new OrbitConstraint(t);this.domElement=void 0!==n?n:document,Object.defineProperty(this,"constraint",{get:function(){return r}}),this.getPolarAngle=function(){return r.getPolarAngle()},this.getAzimuthalAngle=function(){return r.getAzimuthalAngle()},this.enabled=!0,this.center=this.target,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.enableKeys=!0,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40},this.mouseButtons={ORBIT:e.MOUSE.LEFT,ZOOM:e.MOUSE.MIDDLE,PAN:e.MOUSE.RIGHT};var i=this,o=new e.Vector2,a=new e.Vector2,u=new e.Vector2,s=new e.Vector2,l=new e.Vector2,c=new e.Vector2,f=new e.Vector2,h=new e.Vector2,p=new e.Vector2,d={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},v=d.NONE;this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom;var y={type:"change"},m={type:"start"},_={type:"end"};this.update=function(){this.autoRotate&&v===d.NONE&&r.rotateLeft(getAutoRotationAngle()),r.update()===!0&&this.dispatchEvent(y)},this.reset=function(){v=d.NONE,this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(y),this.update()},this.dispose=function(){this.domElement.removeEventListener("contextmenu",contextmenu,!1),this.domElement.removeEventListener("mousedown",onMouseDown,!1),this.domElement.removeEventListener("mousewheel",onMouseWheel,!1),this.domElement.removeEventListener("MozMousePixelScroll",onMouseWheel,!1),this.domElement.removeEventListener("touchstart",touchstart,!1),this.domElement.removeEventListener("touchend",touchend,!1),this.domElement.removeEventListener("touchmove",touchmove,!1),document.removeEventListener("mousemove",onMouseMove,!1),document.removeEventListener("mouseup",onMouseUp,!1),window.removeEventListener("keydown",onKeyDown,!1)},this.domElement.addEventListener("contextmenu",contextmenu,!1),this.domElement.addEventListener("mousedown",onMouseDown,!1),this.domElement.addEventListener("mousewheel",onMouseWheel,!1),this.domElement.addEventListener("MozMousePixelScroll",onMouseWheel,!1),this.domElement.addEventListener("touchstart",touchstart,!1),this.domElement.addEventListener("touchend",touchend,!1),this.domElement.addEventListener("touchmove",touchmove,!1),window.addEventListener("keydown",onKeyDown,!1),this.update()}var t=e.MOUSE;return t||(t={LEFT:0,MIDDLE:1,RIGHT:2}),OrbitControls.prototype=Object.create(e.EventDispatcher.prototype),OrbitControls.prototype.constructor=OrbitControls,Object.defineProperties(OrbitControls.prototype,{object:{get:function(){return this.constraint.object}},target:{get:function(){return this.constraint.target},set:function(e){console.warn("THREE.OrbitControls: target is now immutable. Use target.set() instead."),this.constraint.target.copy(e)}},minDistance:{get:function(){return this.constraint.minDistance},set:function(e){this.constraint.minDistance=e}},maxDistance:{get:function(){return this.constraint.maxDistance},set:function(e){this.constraint.maxDistance=e}},minZoom:{get:function(){return this.constraint.minZoom},set:function(e){this.constraint.minZoom=e}},maxZoom:{get:function(){return this.constraint.maxZoom},set:function(e){this.constraint.maxZoom=e}},minPolarAngle:{get:function(){return this.constraint.minPolarAngle},set:function(e){this.constraint.minPolarAngle=e}},maxPolarAngle:{get:function(){return this.constraint.maxPolarAngle},set:function(e){this.constraint.maxPolarAngle=e}},minAzimuthAngle:{get:function(){return this.constraint.minAzimuthAngle},set:function(e){this.constraint.minAzimuthAngle=e}},maxAzimuthAngle:{get:function(){return this.constraint.maxAzimuthAngle},set:function(e){this.constraint.maxAzimuthAngle=e}},enableDamping:{get:function(){return this.constraint.enableDamping},set:function(e){this.constraint.enableDamping=e}},dampingFactor:{get:function(){return this.constraint.dampingFactor},set:function(e){this.constraint.dampingFactor=e}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.constraint.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.constraint.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor=e}}}),OrbitControls}},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;nn)return!1;if(r.length1}},{key:"_removeTiles",value:function(){for(var e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e])}},{key:"_createTile",value:function(e,t){}},{key:"_requestTile",value:function(e,t){var n=this._tileCache.getTile(e);return n||(n=this._createTile(e,t),this._tileCache.setTile(e,n)),n}},{key:"_destroyTile",value:function(e){this._layer.remove(e),e.destroy()}},{key:"destroy",value:function(){var e;for(e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e]);for(e=this._layer.children.length-1;e>=0;e--)this._layer.remove(this._layer.children[e]);this._tileCache.destroy(),this._tileCache=null,this._world=null,this._tiles=null,this._layer=null,this._frustum=null}}]),TileLayer}(a["default"]);t["default"]=f,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n=t)&&priv(this,"max",1/0);var n=e.length||naiveLength;"function"!=typeof n&&(n=naiveLength),priv(this,"lengthCalculator",n),priv(this,"allowStale",e.stale||!1),priv(this,"maxAge",e.maxAge||0),priv(this,"dispose",e.dispose),this.reset()}function forEachStep(e,t,n,r){var i=n.value;isStale(e,i)&&(del(e,n),priv(e,"allowStale")||(i=void 0)),i&&t.call(r,i.value,i.key,e)}function get(e,t,n){var r=priv(e,"cache").get(t);if(r){var i=r.value;isStale(e,i)?(del(e,r),priv(e,"allowStale")||(i=void 0)):n&&priv(e,"lruList").unshiftNode(r),i&&(i=i.value)}return i}function isStale(e,t){if(!t||!t.maxAge&&!priv(e,"maxAge"))return!1;var n=!1,r=Date.now()-t.now;return n=t.maxAge?r>t.maxAge:priv(e,"maxAge")&&r>priv(e,"maxAge")}function trim(e){if(priv(e,"length")>priv(e,"max"))for(var t=priv(e,"lruList").tail;priv(e,"length")>priv(e,"max")&&null!==t;){var n=t.prev;del(e,t),t=n}}function del(e,t){if(t){var n=t.value;priv(e,"dispose")&&priv(e,"dispose").call(this,n.key,n.value),priv(e,"length",priv(e,"length")-n.length),priv(e,"cache")["delete"](n.key),priv(e,"lruList").removeNode(t)}}function Entry(e,t,n,r,i){this.key=e,this.value=t,this.length=n,this.now=r,this.maxAge=i||0}e.exports=LRUCache;var r,i=n(37),o=n(40),a=n(43),u={},s="function"==typeof Symbol;r=s?function(e){return Symbol["for"](e)}:function(e){return"_"+e},Object.defineProperty(LRUCache.prototype,"max",{set:function(e){(!e||"number"!=typeof e||0>=e)&&(e=1/0),priv(this,"max",e),trim(this)},get:function(){return priv(this,"max")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"allowStale",{set:function(e){priv(this,"allowStale",!!e)},get:function(){return priv(this,"allowStale")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"maxAge",{set:function(e){(!e||"number"!=typeof e||0>e)&&(e=0),priv(this,"maxAge",e),trim(this)},get:function(){return priv(this,"maxAge")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"lengthCalculator",{set:function(e){"function"!=typeof e&&(e=naiveLength),e!==priv(this,"lengthCalculator")&&(priv(this,"lengthCalculator",e),priv(this,"length",0),priv(this,"lruList").forEach(function(e){e.length=priv(this,"lengthCalculator").call(this,e.value,e.key),priv(this,"length",priv(this,"length")+e.length)},this)),trim(this)},get:function(){return priv(this,"lengthCalculator")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"length",{get:function(){return priv(this,"length")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"itemCount",{get:function(){return priv(this,"lruList").length},enumerable:!0}),LRUCache.prototype.rforEach=function(e,t){t=t||this;for(var n=priv(this,"lruList").tail;null!==n;){var r=n.prev;forEachStep(this,e,n,t),n=r}},LRUCache.prototype.forEach=function(e,t){t=t||this;for(var n=priv(this,"lruList").head;null!==n;){var r=n.next;forEachStep(this,e,n,t),n=r}},LRUCache.prototype.keys=function(){return priv(this,"lruList").toArray().map(function(e){return e.key},this)},LRUCache.prototype.values=function(){return priv(this,"lruList").toArray().map(function(e){return e.value},this)},LRUCache.prototype.reset=function(){priv(this,"dispose")&&priv(this,"lruList")&&priv(this,"lruList").length&&priv(this,"lruList").forEach(function(e){priv(this,"dispose").call(this,e.key,e.value)},this),priv(this,"cache",new i),priv(this,"lruList",new a),priv(this,"length",0)},LRUCache.prototype.dump=function(){return priv(this,"lruList").map(function(e){return isStale(this,e)?void 0:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}},this).toArray().filter(function(e){return e})},LRUCache.prototype.dumpLru=function(){return priv(this,"lruList")},LRUCache.prototype.inspect=function(e,t){var n="LRUCache {",r=!1,i=priv(this,"allowStale");i&&(n+="\n allowStale: true",r=!0);var a=priv(this,"max");a&&a!==1/0&&(r&&(n+=","),n+="\n max: "+o.inspect(a,t),r=!0);var u=priv(this,"maxAge");u&&(r&&(n+=","),n+="\n maxAge: "+o.inspect(u,t),r=!0);var s=priv(this,"lengthCalculator");s&&s!==naiveLength&&(r&&(n+=","),n+="\n length: "+o.inspect(priv(this,"length"),t),r=!0);var l=!1;return priv(this,"lruList").forEach(function(e){l?n+=",\n ":(r&&(n+=",\n"),l=!0,n+="\n ");var i=o.inspect(e.key).split("\n").join("\n "),a={value:e.value};e.maxAge!==u&&(a.maxAge=e.maxAge),s!==naiveLength&&(a.length=e.length),isStale(this,e)&&(a.stale=!0),a=o.inspect(a,t).split("\n").join("\n "),n+=i+" => "+a}),(l||r)&&(n+="\n"),n+="}"},LRUCache.prototype.set=function(e,t,n){n=n||priv(this,"maxAge");var r=n?Date.now():0,i=priv(this,"lengthCalculator").call(this,t,e);if(priv(this,"cache").has(e)){if(i>priv(this,"max"))return del(this,priv(this,"cache").get(e)),!1;var o=priv(this,"cache").get(e),a=o.value;return priv(this,"dispose")&&priv(this,"dispose").call(this,e,a.value),a.now=r,a.maxAge=n,a.value=t,priv(this,"length",priv(this,"length")+(i-a.length)),a.length=i,this.get(e),trim(this),!0}var u=new Entry(e,t,i,r,n);return u.length>priv(this,"max")?(priv(this,"dispose")&&priv(this,"dispose").call(this,e,t),!1):(priv(this,"length",priv(this,"length")+u.length),priv(this,"lruList").unshift(u),priv(this,"cache").set(e,priv(this,"lruList").head),trim(this),!0)},LRUCache.prototype.has=function(e){if(!priv(this,"cache").has(e))return!1;var t=priv(this,"cache").get(e).value;return isStale(this,t)?!1:!0},LRUCache.prototype.get=function(e){return get(this,e,!0)},LRUCache.prototype.peek=function(e){return get(this,e,!1)},LRUCache.prototype.pop=function(){var e=priv(this,"lruList").tail;return e?(del(this,e),e.value):null},LRUCache.prototype.del=function(e){del(this,priv(this,"cache").get(e))},LRUCache.prototype.load=function(e){this.reset();for(var t=Date.now(),n=e.length-1;n>=0;n--){var r=e[n],i=r.e||0;if(0===i)this.set(r.k,r.v);else{var o=i-t;o>0&&this.set(r.k,r.v,o)}}},LRUCache.prototype.prune=function(){var e=this;priv(this,"cache").forEach(function(t,n){get(e,n,!1)})}},function(e,t,n){(function(t){"pseudomap"===t.env.npm_package_name&&"test"===t.env.npm_lifecycle_script&&(t.env.TEST_PSEUDOMAP="true"),"function"!=typeof Map||t.env.TEST_PSEUDOMAP?e.exports=n(39):e.exports=Map}).call(t,n(38))},function(e,t){function cleanUpNextTick(){o=!1,n.length?i=n.concat(i):a=-1,i.length&&drainQueue()}function drainQueue(){if(!o){var e=setTimeout(cleanUpNextTick);o=!0;for(var t=i.length;t;){for(n=i,i=[];++a1)for(var n=1;n=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),isBoolean(n)?r.showHidden=n:n&&t._extend(r,n),isUndefined(r.showHidden)&&(r.showHidden=!1),isUndefined(r.depth)&&(r.depth=2),isUndefined(r.colors)&&(r.colors=!1),isUndefined(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=stylizeWithColor),formatValue(r,e,r.depth)}function stylizeWithColor(e,t){var n=inspect.styles[t];return n?"["+inspect.colors[n][0]+"m"+e+"["+inspect.colors[n][1]+"m":e}function stylizeNoColor(e,t){return e}function arrayToHash(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function formatValue(e,n,r){if(e.customInspect&&n&&isFunction(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return isString(i)||(i=formatValue(e,i,r)),i}var o=formatPrimitive(e,n);if(o)return o;var a=Object.keys(n),u=arrayToHash(a);if(e.showHidden&&(a=Object.getOwnPropertyNames(n)),isError(n)&&(a.indexOf("message")>=0||a.indexOf("description")>=0))return formatError(n);if(0===a.length){if(isFunction(n)){var s=n.name?": "+n.name:"";return e.stylize("[Function"+s+"]","special")}if(isRegExp(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(isDate(n))return e.stylize(Date.prototype.toString.call(n),"date");if(isError(n))return formatError(n)}var l="",c=!1,f=["{","}"];if(isArray(n)&&(c=!0,f=["[","]"]),isFunction(n)){var h=n.name?": "+n.name:"";l=" [Function"+h+"]"}if(isRegExp(n)&&(l=" "+RegExp.prototype.toString.call(n)),isDate(n)&&(l=" "+Date.prototype.toUTCString.call(n)),isError(n)&&(l=" "+formatError(n)),0===a.length&&(!c||0==n.length))return f[0]+l+f[1];if(0>r)return isRegExp(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special");e.seen.push(n);var p;return p=c?formatArray(e,n,r,u,a):a.map(function(t){return formatProperty(e,n,r,u,t,c)}),e.seen.pop(),reduceToSingleString(p,l,f)}function formatPrimitive(e,t){if(isUndefined(t))return e.stylize("undefined","undefined");if(isString(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return isNumber(t)?e.stylize(""+t,"number"):isBoolean(t)?e.stylize(""+t,"boolean"):isNull(t)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,t,n,r,i){for(var o=[],a=0,u=t.length;u>a;++a)hasOwnProperty(t,String(a))?o.push(formatProperty(e,t,n,r,String(a),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,t,n,r,i,!0))}),o}function formatProperty(e,t,n,r,i,o){var a,u,s;if(s=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},s.get?u=s.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):s.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(r,i)||(a="["+i+"]"),u||(e.seen.indexOf(s.value)<0?(u=isNull(n)?formatValue(e,s.value,null):formatValue(e,s.value,n-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(a)){if(o&&i.match(/^\d+$/))return u;a=JSON.stringify(""+i),a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+u}function reduceToSingleString(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,t=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),u[e.getMonth()],t].join(" ")}function hasOwnProperty(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var i=/%[sdj%]/g;t.format=function(e){if(!isString(e)){for(var t=[],n=0;n=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(t){return"[Circular]"}default:return e}}),u=r[n];o>n;u=r[++n])a+=isNull(u)||!isObject(u)?" "+u:" "+inspect(u);return a},t.deprecate=function(n,i){function deprecated(){if(!o){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),o=!0}return n.apply(this,arguments)}if(isUndefined(e.process))return function(){return t.deprecate(n,i).apply(this,arguments)};if(r.noDeprecation===!0)return n;var o=!1;return deprecated};var o,a={};t.debuglog=function(e){if(isUndefined(o)&&(o=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!a[e])if(new RegExp("\\b"+e+"\\b","i").test(o)){var n=r.pid;a[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else a[e]=function(){};return a[e]},t.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=isArray,t.isBoolean=isBoolean,t.isNull=isNull,t.isNullOrUndefined=isNullOrUndefined,t.isNumber=isNumber,t.isString=isString,t.isSymbol=isSymbol,t.isUndefined=isUndefined,t.isRegExp=isRegExp,t.isObject=isObject,t.isDate=isDate,t.isError=isError,t.isFunction=isFunction,t.isPrimitive=isPrimitive,t.isBuffer=n(41);var u=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];t.log=function(){console.log("%s - %s",timestamp(),t.format.apply(t,arguments))},t.inherits=n(42),t._extend=function(e,t){if(!t||!isObject(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}).call(t,function(){return this}(),n(38))},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t){function Yallist(e){var t=this;if(t instanceof Yallist||(t=new Yallist),t.tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach(function(e){t.push(e)});else if(arguments.length>0)for(var n=0,r=arguments.length;r>n;n++)t.push(arguments[n]);return t}function push(e,t){e.tail=new Node(t,e.tail,null,e),e.head||(e.head=e.tail),e.length++}function unshift(e,t){e.head=new Node(t,null,e.head,e),e.tail||(e.tail=e.head),e.length++}function Node(e,t,n,r){return this instanceof Node?(this.list=r,this.value=e,t?(t.next=this,this.prev=t):this.prev=null,void(n?(n.prev=this,this.next=n):this.next=null)):new Node(e,t,n,r)}e.exports=Yallist,Yallist.Node=Node,Yallist.create=Yallist,Yallist.prototype.removeNode=function(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");var t=e.next,n=e.prev;t&&(t.prev=n),n&&(n.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=n),e.list.length--,e.next=null,e.prev=null,e.list=null},Yallist.prototype.unshiftNode=function(e){if(e!==this.head){e.list&&e.list.removeNode(e);var t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}},Yallist.prototype.pushNode=function(e){if(e!==this.tail){e.list&&e.list.removeNode(e);var t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}},Yallist.prototype.push=function(){for(var e=0,t=arguments.length;t>e;e++)push(this,arguments[e]);return this.length},Yallist.prototype.unshift=function(){for(var e=0,t=arguments.length;t>e;e++)unshift(this,arguments[e]);return this.length},Yallist.prototype.pop=function(){if(this.tail){var e=this.tail.value;return this.tail=this.tail.prev,this.tail.next=null,this.length--,e}},Yallist.prototype.shift=function(){if(this.head){var e=this.head.value;return this.head=this.head.next,this.head.prev=null,this.length--,e}},Yallist.prototype.forEach=function(e,t){t=t||this;for(var n=this.head,r=0;null!==n;r++)e.call(t,n.value,r,this),n=n.next},Yallist.prototype.forEachReverse=function(e,t){t=t||this;for(var n=this.tail,r=this.length-1;null!==n;r--)e.call(t,n.value,r,this),n=n.prev},Yallist.prototype.get=function(e){for(var t=0,n=this.head;null!==n&&e>t;t++)n=n.next;return t===e&&null!==n?n.value:void 0},Yallist.prototype.getReverse=function(e){for(var t=0,n=this.tail;null!==n&&e>t;t++)n=n.prev;return t===e&&null!==n?n.value:void 0},Yallist.prototype.map=function(e,t){t=t||this;for(var n=new Yallist,r=this.head;null!==r;)n.push(e.call(t,r.value,this)),r=r.next;return n},Yallist.prototype.mapReverse=function(e,t){t=t||this;for(var n=new Yallist,r=this.tail;null!==r;)n.push(e.call(t,r.value,this)),r=r.prev;return n},Yallist.prototype.reduce=function(e,t){var n,r=this.head;if(arguments.length>1)n=t;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");r=this.head.next,n=this.head.value}for(var i=0;null!==r;i++)n=e(n,r.value,i),r=r.next;return n},Yallist.prototype.reduceReverse=function(e,t){var n,r=this.tail;if(arguments.length>1)n=t;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");r=this.tail.prev,n=this.tail.value}for(var i=this.length-1;null!==r;i--)n=e(n,r.value,i),r=r.prev;return n},Yallist.prototype.toArray=function(){for(var e=new Array(this.length),t=0,n=this.head;null!==n;t++)e[t]=n.value,n=n.next;return e},Yallist.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,n=this.tail;null!==n;t++)e[t]=n.value,n=n.prev;return e},Yallist.prototype.slice=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var n=new Yallist;if(e>t||0>t)return n;0>e&&(e=0),t>this.length&&(t=this.length);for(var r=0,i=this.head;null!==i&&e>r;r++)i=i.next;for(;null!==i&&t>r;r++,i=i.next)n.push(i.value);return n},Yallist.prototype.sliceReverse=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var n=new Yallist;if(e>t||0>t)return n;0>e&&(e=0),t>this.length&&(t=this.length);for(var r=this.length,i=this.tail;null!==i&&r>t;r--)i=i.prev;for(;null!==i&&r>e;r--,i=i.prev)n.push(i.value);return n},Yallist.prototype.reverse=function(){for(var e=this.head,t=this.tail,n=e;null!==n;n=n.prev){var r=n.prev;n.prev=n.next,n.next=r}return this.head=t,this.tail=e,this}},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n0;i--){var o=1<=e||e>t?complete(c,o):l=setTimeout(delayed,e)}function flush(){return(l&&c||o&&y)&&(a=e.apply(s,i)),cancel(),a}function maxDelayed(){complete(y,l)}function debounced(){if(i=arguments,u=d(),s=this,c=y&&(l||!h),v===!1)var n=h&&!l;else{o||h||(f=u);var r=v-(u-f),p=0>=r||r>v;p?(o&&(o=clearTimeout(o)),f=u,a=e.apply(s,i)):o||(o=setTimeout(maxDelayed,r))}return p&&l?l=clearTimeout(l):l||t===v||(l=setTimeout(delayed,t)),n&&(p=!0,a=e.apply(s,i)),!p||l||o||(i=s=void 0),a}var i,o,a,u,s,l,c,f=0,h=!1,v=!1,y=!0;if("function"!=typeof e)throw new TypeError(n);return t=toNumber(t)||0,isObject(r)&&(h=!!r.leading,v="maxWait"in r&&p(toNumber(r.maxWait)||0,t),y="trailing"in r?!!r.trailing:y),debounced.cancel=cancel,debounced.flush=flush,debounced}function isFunction(e){var t=isObject(e)?h.call(e):"";return t==i||t==o}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function toNumber(e){if(isObject(e)){var t=isFunction(e.valueOf)?e.valueOf():e;e=isObject(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(a,"");var n=s.test(e);return n||l.test(e)?c(e.slice(2),n?2:8):u.test(e)?r:+e}var n="Expected a function",r=NaN,i="[object Function]",o="[object GeneratorFunction]",a=/^\s+|\s+$/g,u=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt,f=Object.prototype,h=f.toString,p=Math.max,d=Date.now;e.exports=debounce}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("proj4"),require("THREE")):"function"==typeof define&&define.amd?define(["proj4","THREE"],t):"object"==typeof exports?exports.VIZI=t(require("proj4"),require("THREE")):e.VIZI=t(e.proj4,e.THREE)}(this,function(e,t){return function(e){function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var t={};return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.p="",__webpack_require__(0)}([function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=_interopRequireDefault(r),o=n(28),a=_interopRequireDefault(o),u=n(31),l=_interopRequireDefault(u),s=n(33),c=_interopRequireDefault(s),f=n(11),h=_interopRequireDefault(f),p=n(10),d=_interopRequireDefault(p),v={version:"0.3",World:i["default"],Controls:a["default"],EnvironmentLayer:l["default"],ImageTileLayer:c["default"],Point:h["default"],LatLon:d["default"]};t["default"]=v,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n-1&&this._layers.splice(t,1),this._engine._scene.remove(e._layer),e.destroy(),this.emit("layerRemoved"),this}},{key:"addControls",value:function(e){return e._addToWorld(this),this._controls.push(e),this.emit("controlsAdded",e),this}},{key:"removeControls",value:function(e){}}]),World}(a["default"]);t["default"]=function(e,t){return new _(e,t)},e.exports=t["default"]},function(e,t,n){"use strict";function EE(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function EventEmitter(){}var r="function"!=typeof Object.create?"~":!1;EventEmitter.prototype._events=void 0,EventEmitter.prototype.listeners=function(e,t){var n=r?r+e:e,i=this._events&&this._events[n];if(t)return!!i;if(!i)return[];if(i.fn)return[i.fn];for(var o=0,a=i.length,u=new Array(a);a>o;o++)u[o]=i[o].fn;return u},EventEmitter.prototype.emit=function(e,t,n,i,o,a){var u=r?r+e:e;if(!this._events||!this._events[u])return!1;var l,s,c=this._events[u],f=arguments.length;if("function"==typeof c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),f){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,i),!0;case 5:return c.fn.call(c.context,t,n,i,o),!0;case 6:return c.fn.call(c.context,t,n,i,o,a),!0}for(s=1,l=new Array(f-1);f>s;s++)l[s-1]=arguments[s];c.fn.apply(c.context,l)}else{var h,p=c.length;for(s=0;p>s;s++)switch(c[s].once&&this.removeListener(e,c[s].fn,void 0,!0),f){case 1:c[s].fn.call(c[s].context);break;case 2:c[s].fn.call(c[s].context,t);break;case 3:c[s].fn.call(c[s].context,t,n);break;default:if(!l)for(h=1,l=new Array(f-1);f>h;h++)l[h-1]=arguments[h];c[s].fn.apply(c[s].context,l)}}return!0},EventEmitter.prototype.on=function(e,t,n){var i=new EE(t,n||this),o=r?r+e:e;return this._events||(this._events=r?{}:Object.create(null)),this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],i]:this._events[o].push(i):this._events[o]=i,this},EventEmitter.prototype.once=function(e,t,n){var i=new EE(t,n||this,!0),o=r?r+e:e;return this._events||(this._events=r?{}:Object.create(null)),this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],i]:this._events[o].push(i):this._events[o]=i,this},EventEmitter.prototype.removeListener=function(e,t,n,i){var o=r?r+e:e;if(!this._events||!this._events[o])return this;var a=this._events[o],u=[];if(t)if(a.fn)(a.fn!==t||i&&!a.once||n&&a.context!==n)&&u.push(a);else for(var l=0,s=a.length;s>l;l++)(a[l].fn!==t||i&&!a[l].once||n&&a[l].context!==n)&&u.push(a[l]);return u.length?this._events[o]=1===u.length?u[0]:u:delete this._events[o],this},EventEmitter.prototype.removeAllListeners=function(e){return this._events?(e?delete this._events[r?r+e:e]:this._events=r?{}:Object.create(null),this):this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prototype.setMaxListeners=function(){return this},EventEmitter.prefixed=r,e.exports=EventEmitter},function(e,t,n){function isIndex(e,t){return e="number"==typeof e||l.test(e)?+e:-1,t=null==t?o:t,e>-1&&e%1==0&&t>e}function assignValue(e,t,n){var r=e[t];(!eq(r,n)||eq(r,s[t])&&!c.call(e,t)||void 0===n&&!(t in e))&&(e[t]=n)}function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function copyObject(e,t,n){return copyObjectWith(e,t,n)}function copyObjectWith(e,t,n,r){n||(n={});for(var i=-1,o=t.length;++i1?n[i-1]:void 0,a=i>2?n[2]:void 0;for(o="function"==typeof o?(i--,o):void 0,a&&isIterateeCall(n[0],n[1],a)&&(o=3>i?void 0:o,i=1),t=Object(t);++r-1&&e%1==0&&o>=e}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var r=n(4),i=n(5),o=9007199254740991,a="[object Function]",u="[object GeneratorFunction]",l=/^(?:0|[1-9]\d*)$/,s=Object.prototype,c=s.hasOwnProperty,f=s.toString,h=baseProperty("length"),p=createAssigner(function(e,t){copyObject(t,r(t),e)});e.exports=p},function(e,t){function baseTimes(e,t){for(var n=-1,r=Array(e);++n-1&&e%1==0&&t>e}function baseHas(e,t){return s.call(e,t)||"object"==typeof e&&t in e&&null===f(e)}function baseKeys(e){return p(Object(e))}function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function indexKeys(e){var t=e?e.length:void 0;return isLength(t)&&(v(e)||isString(e)||isArguments(e))?baseTimes(t,String):null}function isPrototype(e){var t=e&&e.constructor,n="function"==typeof t&&t.prototype||l;return e===n}function isArguments(e){return isArrayLikeObject(e)&&s.call(e,"callee")&&(!h.call(e,"callee")||c.call(e)==r)}function isArrayLike(e){return null!=e&&!("function"==typeof e&&isFunction(e))&&isLength(d(e))}function isArrayLikeObject(e){return isObjectLike(e)&&isArrayLike(e)}function isFunction(e){var t=isObject(e)?c.call(e):"";return t==i||t==o}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&n>=e}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isString(e){return"string"==typeof e||!v(e)&&isObjectLike(e)&&c.call(e)==a}function keys(e){var t=isPrototype(e);if(!t&&!isArrayLike(e))return baseKeys(e);var n=indexKeys(e),r=!!n,i=n||[],o=i.length;for(var a in e)!baseHas(e,a)||r&&("length"==a||isIndex(a,o))||t&&"constructor"==a||i.push(a);return i}var n=9007199254740991,r="[object Arguments]",i="[object Function]",o="[object GeneratorFunction]",a="[object String]",u=/^(?:0|[1-9]\d*)$/,l=Object.prototype,s=l.hasOwnProperty,c=l.toString,f=Object.getPrototypeOf,h=l.propertyIsEnumerable,p=Object.keys,d=baseProperty("length"),v=Array.isArray;e.exports=keys},function(e,t){function apply(e,t,n){var r=n.length;switch(r){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function rest(e,t){if("function"!=typeof e)throw new TypeError(n);return t=v(void 0===t?e.length-1:toInteger(t),0),function(){for(var n=arguments,r=-1,i=v(n.length-t,0),o=Array(i);++re?-1:1;return t*i}var n=e%1;return e===e?n?e-n:e:0}function toNumber(e){if(isObject(e)){var t=isFunction(e.valueOf)?e.valueOf():e;e=isObject(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=c.test(e);return n||f.test(e)?h(e.slice(2),n?2:8):s.test(e)?o:+e}var n="Expected a function",r=1/0,i=1.7976931348623157e308,o=NaN,a="[object Function]",u="[object GeneratorFunction]",l=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,f=/^0o[0-7]+$/i,h=parseInt,p=Object.prototype,d=p.toString,v=Math.max;e.exports=rest},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(7),i=_interopRequireDefault(r),o=n(15),a=_interopRequireDefault(o),u=n(17),l=_interopRequireDefault(u),s=n(19),c=_interopRequireDefault(s),f=n(20),h=_interopRequireDefault(f),p={};p.EPSG3857=i["default"],p.EPSG900913=r.EPSG900913,p.EPSG3395=a["default"],p.EPSG4326=l["default"],p.Simple=c["default"],p.Proj4=h["default"],t["default"]=p,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(13),l=_interopRequireDefault(u),s=n(14),c=_interopRequireDefault(s),f={code:"EPSG:3857",projection:l["default"],transformScale:1/(Math.PI*l["default"].R),transformation:function(){var e=1/(Math.PI*l["default"].R);return new c["default"](e,0,-e,0)}()},h=(0,i["default"])({},a["default"],f),p=(0,i["default"])({},h,{code:"EPSG:900913"});t.EPSG900913=p,t["default"]=h},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(9),a=_interopRequireDefault(o),u=n(10),l=(_interopRequireDefault(u),{wrapLon:[-180,180],R:6378137,distance:function(e,t,n){var r,i,o,a=Math.PI/180;if(n){r=e.lat*a,i=t.lat*a;var u=e.lon*a,l=t.lon*a,s=i-r,c=l-u,f=s/2,h=c/2;o=Math.sin(f)*Math.sin(f)+Math.cos(r)*Math.cos(i)*Math.sin(h)*Math.sin(h);var p=2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o));return this.R*p}return r=e.lat*a,i=t.lat*a,o=Math.sin(r)*Math.sin(i)+Math.cos(r)*Math.cos(i)*Math.cos((t.lon-e.lon)*a),this.R*Math.acos(Math.min(o,1))},pointScale:function(e,t){return this.projection.pointScale?this.projection.pointScale(e,t):[1,1]},metresToProjected:function(e,t){return e*t[1]},projectedToMetres:function(e,t){return e/t[1]},metresToWorld:function(e,t,n){var r=this.metresToProjected(e,t),i=this.scale(n);n&&(i/=2);var o=i*(this.transformScale*r)/t[1];return o},worldToMetres:function(e,t,n){var r=this.scale(n);n&&(r/=2);var i=e/r/this.transformScale*t[1],o=this.projectedToMetres(i,t);return o}});t["default"]=(0,i["default"])({},a["default"],l),e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(10),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),u=n(12),l=_interopRequireDefault(u),s={scaleFactor:1e6,latLonToPoint:function(e,t){var n=this.projection.project(e),r=this.scale(t);return t&&(r/=2),this.transformation._transform(n,r)},pointToLatLon:function(e,t){var n=this.scale(t);t&&(n/=2);var r=this.transformation.untransform(e,n);return this.projection.unproject(r)},project:function(e){return this.projection.project(e)},unproject:function(e){return this.projection.unproject(e)},scale:function(e){return e>=0?256*Math.pow(2,e):this.scaleFactor},zoom:function(e){return Math.log(e/256)/Math.LN2},getProjectedBounds:function(e){if(this.infinite)return null;var t=this.projection.bounds,n=this.scale(e);e&&(n/=2);var r=this.transformation.transform((0,a["default"])(t[0]),n),i=this.transformation.transform((0,a["default"])(t[1]),n);return[r,i]},wrapLatLon:function(e){var t=this.wrapLat?(0,l["default"])(e.lat,this.wrapLat,!0):e.lat,n=this.wrapLon?(0,l["default"])(e.lon,this.wrapLon,!0):e.lon,r=e.alt;return(0,i["default"])(t,n,r)}};t["default"]=s,e.exports=t["default"]},function(e,t){function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function defineProperties(e,t){for(var n=0;ns&&Math.abs(c)>1e-7;s++)t=a*Math.sin(l),t=Math.pow((1-t)/(1+t),a/2),c=Math.PI/2-2*Math.atan(u*t)-l,l+=c;return(0,i["default"])(l*n,e.x*n/r)},pointScale:function(e){var t=Math.PI/180,n=e.lat*t,r=Math.sin(n),i=r*r,o=Math.cos(n),a=Math.sqrt(1-this.ECC2*i)/o;return[a,a]},bounds:[[-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]]};t["default"]=u,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(18),l=_interopRequireDefault(u),s=n(14),c=_interopRequireDefault(s),f={code:"EPSG:4326",projection:l["default"],transformScale:1/180,transformation:new c["default"](1/180,0,-1/180,0)},h=(0,i["default"])({},a["default"],f);t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(10),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),u={project:function(e){return(0,a["default"])(e.lon,e.lat)},unproject:function(e){return(0,i["default"])(e.y,e.x)},pointScale:function(e){var t=111132.92,n=-559.82,r=1.175,i=-.0023,o=111412.84,a=-93.5,u=.118,l=Math.PI/180,s=e.lat*l,c=t+n*Math.cos(2*s)+r*Math.cos(4*s)+i*Math.cos(6*s),f=o*Math.cos(s)+a*Math.cos(3*s)+u*Math.cos(5*s);return[1/c,1/f]},bounds:[[-180,-90],[180,90]]};t["default"]=u,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(9),a=_interopRequireDefault(o),u=n(18),l=_interopRequireDefault(u),s=n(14),c=_interopRequireDefault(s),f={projection:l["default"],transformation:new c["default"](1,0,1,0),scale:function(e){return e?Math.pow(2,e):1},zoom:function(e){return Math.log(e)/Math.LN2},distance:function(e,t){var n=t.lon-e.lon,r=t.lat-e.lat;return Math.sqrt(n*n+r*r)},infinite:!0},h=(0,i["default"])({},a["default"],f);t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(21),l=_interopRequireDefault(u),s=n(14),c=_interopRequireDefault(s),f=function(e,t,n){var r=(0,l["default"])(t,n),i=r.bounds[1][0]-r.bounds[0][0],o=r.bounds[1][1]-r.bounds[0][1],a=i/2,u=o/2,s=1/a,f=1/u,h=Math.min(s,f),p=h*(r.bounds[0][0]+a),d=h*(r.bounds[0][1]+u);return{code:e,projection:r,transformScale:h,transformation:new c["default"](h,-p,-h,d)}},h=function(e,t,n){return(0,i["default"])({},a["default"],f(e,t,n))};t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(22),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o),u=n(11),l=_interopRequireDefault(u),s=function(e,t){var n=(0,i["default"])(e),r=function(e){return(0,l["default"])(n.forward([e.lon,e.lat]))},o=function(e){var t=n.inverse([e.x,e.y]);return(0,a["default"])(t[1],t[0])};return{project:r,unproject:o,pointScale:function(e,t){return[1,1]},bounds:function(){if(t)return t;var e=r([-90,-180]),n=r([90,180]);return[e,n]}()}};t["default"]=s,e.exports=t["default"]},function(t,n){t.exports=e},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n0?dollyIn(getZoomScale()):P.y<0&&dollyOut(getZoomScale()),O.copy(E),o.update()}function handleMouseMovePan(e){w.set(e.clientX,e.clientY),M.subVectors(w,b),R(M.x,M.y),b.copy(w),o.update()}function handleMouseUp(e){}function handleMouseWheel(e){var t=0;void 0!==e.wheelDelta?t=e.wheelDelta:void 0!==e.detail&&(t=-e.detail),t>0?dollyOut(getZoomScale()):0>t&&dollyIn(getZoomScale()),o.update()}function handleKeyDown(e){switch(e.keyCode){case o.keys.UP:R(0,o.keyPanSpeed),o.update();break;case o.keys.BOTTOM:R(0,-o.keyPanSpeed),o.update();break;case o.keys.LEFT:R(o.keyPanSpeed,0),o.update();break;case o.keys.RIGHT:R(-o.keyPanSpeed,0),o.update()}}function handleTouchStartRotate(e){_.set(e.touches[0].pageX,e.touches[0].pageY)}function handleTouchStartDolly(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);O.set(0,r)}function handleTouchStartPan(e){b.set(e.touches[0].pageX,e.touches[0].pageY)}function handleTouchMoveRotate(e){m.set(e.touches[0].pageX,e.touches[0].pageY),g.subVectors(m,_);var t=o.domElement===document?o.domElement.body:o.domElement;rotateLeft(2*Math.PI*g.x/t.clientWidth*o.rotateSpeed),rotateUp(2*Math.PI*g.y/t.clientHeight*o.rotateSpeed),_.copy(m),o.update()}function handleTouchMoveDolly(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);E.set(0,r),P.subVectors(E,O),P.y>0?dollyOut(getZoomScale()):P.y<0&&dollyIn(getZoomScale()),O.copy(E),o.update()}function handleTouchMovePan(e){w.set(e.touches[0].pageX,e.touches[0].pageY),M.subVectors(w,b),R(M.x,M.y),b.copy(w),o.update()}function handleTouchEnd(e){}function onMouseDown(e){if(o.enabled!==!1){if(e.preventDefault(),e.button===o.mouseButtons.ORBIT){if(o.enableRotate===!1)return;handleMouseDownRotate(e),c=s.ROTATE}else if(e.button===o.mouseButtons.ZOOM){if(o.enableZoom===!1)return;handleMouseDownDolly(e),c=s.DOLLY}else if(e.button===o.mouseButtons.PAN){if(o.enablePan===!1)return;handleMouseDownPan(e),c=s.PAN}c!==s.NONE&&(document.addEventListener("mousemove",onMouseMove,!1),document.addEventListener("mouseup",onMouseUp,!1),document.addEventListener("mouseout",onMouseUp,!1),o.dispatchEvent(u))}}function onMouseMove(e){if(o.enabled!==!1)if(e.preventDefault(),c===s.ROTATE){if(o.enableRotate===!1)return;handleMouseMoveRotate(e)}else if(c===s.DOLLY){if(o.enableZoom===!1)return;handleMouseMoveDolly(e)}else if(c===s.PAN){if(o.enablePan===!1)return;handleMouseMovePan(e)}}function onMouseUp(e){o.enabled!==!1&&(handleMouseUp(e),document.removeEventListener("mousemove",onMouseMove,!1),document.removeEventListener("mouseup",onMouseUp,!1),document.removeEventListener("mouseout",onMouseUp,!1),o.dispatchEvent(l),c=s.NONE)}function onMouseWheel(e){o.enabled!==!1&&o.enableZoom!==!1&&c===s.NONE&&(e.preventDefault(),e.stopPropagation(),handleMouseWheel(e),o.dispatchEvent(u),o.dispatchEvent(l))}function onKeyDown(e){o.enabled!==!1&&o.enableKeys!==!1&&o.enablePan!==!1&&handleKeyDown(e)}function onTouchStart(e){if(o.enabled!==!1){switch(e.touches.length){case 1:if(o.enableRotate===!1)return;handleTouchStartRotate(e),c=s.TOUCH_ROTATE;break;case 2:if(o.enableZoom===!1)return;handleTouchStartDolly(e),c=s.TOUCH_DOLLY;break;case 3:if(o.enablePan===!1)return;handleTouchStartPan(e),c=s.TOUCH_PAN;break;default:c=s.NONE}c!==s.NONE&&o.dispatchEvent(u)}}function onTouchMove(e){if(o.enabled!==!1)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:if(o.enableRotate===!1)return;if(c!==s.TOUCH_ROTATE)return;handleTouchMoveRotate(e);break;case 2:if(o.enableZoom===!1)return;if(c!==s.TOUCH_DOLLY)return;handleTouchMoveDolly(e);break;case 3:if(o.enablePan===!1)return;if(c!==s.TOUCH_PAN)return;handleTouchMovePan(e);break;default:c=s.NONE}}function onTouchEnd(e){o.enabled!==!1&&(handleTouchEnd(e),o.dispatchEvent(l),c=s.NONE)}function onContextMenu(e){e.preventDefault()}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.target=new i["default"].Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-(1/0),this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.25,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.enableKeys=!0,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40},this.mouseButtons={ORBIT:i["default"].MOUSE.LEFT,ZOOM:i["default"].MOUSE.MIDDLE,PAN:i["default"].MOUSE.RIGHT},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this.getPolarAngle=function(){return r},this.getAzimuthalAngle=function(){return n},this.reset=function(){o.target.copy(o.target0),o.object.position.copy(o.position0),o.object.zoom=o.zoom0,o.object.updateProjectionMatrix(),o.dispatchEvent(a),o.update(),c=s.NONE},this.update=function(){var t=new i["default"].Vector3,u=(new i["default"].Quaternion).setFromUnitVectors(e.up,new i["default"].Vector3(0,1,0)),l=u.clone().inverse(),_=new i["default"].Vector3,m=new i["default"].Quaternion;return function(){var e=o.object.position;t.copy(e).sub(o.target),t.applyQuaternion(u),n=Math.atan2(t.x,t.z),r=Math.atan2(Math.sqrt(t.x*t.x+t.z*t.z),t.y),o.autoRotate&&c===s.NONE&&rotateLeft(getAutoRotationAngle()),n+=p,r+=h,n=Math.max(o.minAzimuthAngle,Math.min(o.maxAzimuthAngle,n)),r=Math.max(o.minPolarAngle,Math.min(o.maxPolarAngle,r)),r=Math.max(f,Math.min(Math.PI-f,r));var i=t.length()*d;return i=Math.max(o.minDistance,Math.min(o.maxDistance,i)),o.target.add(v),t.x=i*Math.sin(r)*Math.sin(n),t.y=i*Math.cos(r),t.z=i*Math.sin(r)*Math.cos(n),t.applyQuaternion(l),e.copy(o.target).add(t),o.object.lookAt(o.target),o.enableDamping===!0?(p*=1-o.dampingFactor,h*=1-o.dampingFactor):(p=0,h=0),d=1,v.set(0,0,0),y||_.distanceToSquared(o.object.position)>f||8*(1-m.dot(o.object.quaternion))>f?(o.dispatchEvent(a),_.copy(o.object.position),m.copy(o.object.quaternion),y=!1,!0):!1}}(),this.dispose=function(){o.domElement.removeEventListener("contextmenu",onContextMenu,!1),o.domElement.removeEventListener("mousedown",onMouseDown,!1),o.domElement.removeEventListener("mousewheel",onMouseWheel,!1),o.domElement.removeEventListener("MozMousePixelScroll",onMouseWheel,!1),o.domElement.removeEventListener("touchstart",onTouchStart,!1),o.domElement.removeEventListener("touchend",onTouchEnd,!1),o.domElement.removeEventListener("touchmove",onTouchMove,!1),document.removeEventListener("mousemove",onMouseMove,!1),document.removeEventListener("mouseup",onMouseUp,!1),document.removeEventListener("mouseout",onMouseUp,!1),window.removeEventListener("keydown",onKeyDown,!1)};var n,r,o=this,a={type:"change"},u={type:"start"},l={type:"end"},s={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},c=s.NONE,f=1e-6,h=0,p=0,d=1,v=new i["default"].Vector3,y=!1,_=new i["default"].Vector2,m=new i["default"].Vector2,g=new i["default"].Vector2,b=new i["default"].Vector2,w=new i["default"].Vector2,M=new i["default"].Vector2,O=new i["default"].Vector2,E=new i["default"].Vector2,P=new i["default"].Vector2,j=function(){var e=new i["default"].Vector3;return function(t,n){var r=n.elements;e.set(r[0],0,r[2]),e.multiplyScalar(-t),v.add(e)}}(),x=function(){var e=new i["default"].Vector3;return function(t,n){var i=n.elements,o=t/Math.cos(r);e.set(i[4],0,i[6]),e.multiplyScalar(o),v.add(e)}}(),R=function(){var e=new i["default"].Vector3;return function(t,n){var r=o.domElement===document?o.domElement.body:o.domElement;if(o.object instanceof i["default"].PerspectiveCamera){var a=o.object.position;e.copy(a).sub(o.target);var u=e.length();u*=Math.tan(o.object.fov/2*Math.PI/180),j(2*t*u/r.clientHeight,o.object.matrix),x(2*n*u/r.clientHeight,o.object.matrix)}else o.object instanceof i["default"].OrthographicCamera?(j(t*(o.object.right-o.object.left)/r.clientWidth,o.object.matrix),x(n*(o.object.top-o.object.bottom)/r.clientHeight,o.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),o.enablePan=!1)}}();o.domElement.addEventListener("contextmenu",onContextMenu,!1),o.domElement.addEventListener("mousedown",onMouseDown,!1),o.domElement.addEventListener("mousewheel",onMouseWheel,!1),o.domElement.addEventListener("MozMousePixelScroll",onMouseWheel,!1),o.domElement.addEventListener("touchstart",onTouchStart,!1),o.domElement.addEventListener("touchend",onTouchEnd,!1),o.domElement.addEventListener("touchmove",onTouchMove,!1),window.addEventListener("keydown",onKeyDown,!1),this.update()};o.prototype=Object.create(i["default"].EventDispatcher.prototype),o.prototype.constructor=i["default"].OrbitControls,Object.defineProperties(o.prototype,{center:{get:function(){return console.warn("THREE.OrbitControls: .center has been renamed to .target"),this.target}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.constraint.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.constraint.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor=e}}}),t["default"]=o,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;nn)return!1;if(r.length1}},{key:"_removeTiles",value:function(){for(var e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e])}},{key:"_createTile",value:function(e,t){}},{key:"_requestTile",value:function(e,t){var n=this._tileCache.getTile(e);return n||(n=this._createTile(e,t),this._tileCache.setTile(e,n)),n}},{key:"_destroyTile",value:function(e){this._layer.remove(e),e.destroy()}},{key:"destroy",value:function(){var e;for(e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e]);for(e=this._layer.children.length-1;e>=0;e--)this._layer.remove(this._layer.children[e]);this._tileCache.destroy(),this._tileCache=null,this._world=null,this._tiles=null,this._layer=null,this._frustum=null}}]),TileLayer}(a["default"]);t["default"]=f,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n=t)&&priv(this,"max",1/0);var n=e.length||naiveLength;"function"!=typeof n&&(n=naiveLength),priv(this,"lengthCalculator",n),priv(this,"allowStale",e.stale||!1),priv(this,"maxAge",e.maxAge||0),priv(this,"dispose",e.dispose),this.reset()}function forEachStep(e,t,n,r){var i=n.value;isStale(e,i)&&(del(e,n),priv(e,"allowStale")||(i=void 0)),i&&t.call(r,i.value,i.key,e)}function get(e,t,n){var r=priv(e,"cache").get(t);if(r){var i=r.value;isStale(e,i)?(del(e,r),priv(e,"allowStale")||(i=void 0)):n&&priv(e,"lruList").unshiftNode(r),i&&(i=i.value)}return i}function isStale(e,t){if(!t||!t.maxAge&&!priv(e,"maxAge"))return!1;var n=!1,r=Date.now()-t.now;return n=t.maxAge?r>t.maxAge:priv(e,"maxAge")&&r>priv(e,"maxAge")}function trim(e){if(priv(e,"length")>priv(e,"max"))for(var t=priv(e,"lruList").tail;priv(e,"length")>priv(e,"max")&&null!==t;){var n=t.prev;del(e,t),t=n}}function del(e,t){if(t){var n=t.value;priv(e,"dispose")&&priv(e,"dispose").call(this,n.key,n.value),priv(e,"length",priv(e,"length")-n.length),priv(e,"cache")["delete"](n.key),priv(e,"lruList").removeNode(t)}}function Entry(e,t,n,r,i){this.key=e,this.value=t,this.length=n,this.now=r,this.maxAge=i||0}e.exports=LRUCache;var r,i=n(37),o=n(40),a=n(43),u={},l="function"==typeof Symbol;r=l?function(e){return Symbol["for"](e)}:function(e){return"_"+e},Object.defineProperty(LRUCache.prototype,"max",{set:function(e){(!e||"number"!=typeof e||0>=e)&&(e=1/0),priv(this,"max",e),trim(this)},get:function(){return priv(this,"max")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"allowStale",{set:function(e){priv(this,"allowStale",!!e)},get:function(){return priv(this,"allowStale")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"maxAge",{set:function(e){(!e||"number"!=typeof e||0>e)&&(e=0),priv(this,"maxAge",e),trim(this)},get:function(){return priv(this,"maxAge")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"lengthCalculator",{set:function(e){"function"!=typeof e&&(e=naiveLength),e!==priv(this,"lengthCalculator")&&(priv(this,"lengthCalculator",e),priv(this,"length",0),priv(this,"lruList").forEach(function(e){e.length=priv(this,"lengthCalculator").call(this,e.value,e.key),priv(this,"length",priv(this,"length")+e.length)},this)),trim(this)},get:function(){return priv(this,"lengthCalculator")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"length",{get:function(){return priv(this,"length")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"itemCount",{get:function(){return priv(this,"lruList").length},enumerable:!0}),LRUCache.prototype.rforEach=function(e,t){t=t||this;for(var n=priv(this,"lruList").tail;null!==n;){var r=n.prev;forEachStep(this,e,n,t),n=r}},LRUCache.prototype.forEach=function(e,t){t=t||this;for(var n=priv(this,"lruList").head;null!==n;){var r=n.next;forEachStep(this,e,n,t),n=r}},LRUCache.prototype.keys=function(){return priv(this,"lruList").toArray().map(function(e){return e.key},this)},LRUCache.prototype.values=function(){return priv(this,"lruList").toArray().map(function(e){return e.value},this)},LRUCache.prototype.reset=function(){priv(this,"dispose")&&priv(this,"lruList")&&priv(this,"lruList").length&&priv(this,"lruList").forEach(function(e){priv(this,"dispose").call(this,e.key,e.value)},this),priv(this,"cache",new i),priv(this,"lruList",new a),priv(this,"length",0)},LRUCache.prototype.dump=function(){return priv(this,"lruList").map(function(e){return isStale(this,e)?void 0:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}},this).toArray().filter(function(e){return e})},LRUCache.prototype.dumpLru=function(){return priv(this,"lruList")},LRUCache.prototype.inspect=function(e,t){var n="LRUCache {",r=!1,i=priv(this,"allowStale");i&&(n+="\n allowStale: true",r=!0);var a=priv(this,"max");a&&a!==1/0&&(r&&(n+=","),n+="\n max: "+o.inspect(a,t),r=!0);var u=priv(this,"maxAge");u&&(r&&(n+=","),n+="\n maxAge: "+o.inspect(u,t),r=!0);var l=priv(this,"lengthCalculator");l&&l!==naiveLength&&(r&&(n+=","),n+="\n length: "+o.inspect(priv(this,"length"),t),r=!0);var s=!1;return priv(this,"lruList").forEach(function(e){s?n+=",\n ":(r&&(n+=",\n"),s=!0,n+="\n ");var i=o.inspect(e.key).split("\n").join("\n "),a={value:e.value};e.maxAge!==u&&(a.maxAge=e.maxAge),l!==naiveLength&&(a.length=e.length),isStale(this,e)&&(a.stale=!0),a=o.inspect(a,t).split("\n").join("\n "),n+=i+" => "+a}),(s||r)&&(n+="\n"),n+="}"},LRUCache.prototype.set=function(e,t,n){n=n||priv(this,"maxAge");var r=n?Date.now():0,i=priv(this,"lengthCalculator").call(this,t,e);if(priv(this,"cache").has(e)){if(i>priv(this,"max"))return del(this,priv(this,"cache").get(e)),!1;var o=priv(this,"cache").get(e),a=o.value;return priv(this,"dispose")&&priv(this,"dispose").call(this,e,a.value),a.now=r,a.maxAge=n,a.value=t,priv(this,"length",priv(this,"length")+(i-a.length)),a.length=i,this.get(e),trim(this),!0}var u=new Entry(e,t,i,r,n);return u.length>priv(this,"max")?(priv(this,"dispose")&&priv(this,"dispose").call(this,e,t),!1):(priv(this,"length",priv(this,"length")+u.length),priv(this,"lruList").unshift(u),priv(this,"cache").set(e,priv(this,"lruList").head),trim(this),!0)},LRUCache.prototype.has=function(e){if(!priv(this,"cache").has(e))return!1;var t=priv(this,"cache").get(e).value;return isStale(this,t)?!1:!0},LRUCache.prototype.get=function(e){return get(this,e,!0)},LRUCache.prototype.peek=function(e){return get(this,e,!1)},LRUCache.prototype.pop=function(){var e=priv(this,"lruList").tail;return e?(del(this,e),e.value):null},LRUCache.prototype.del=function(e){del(this,priv(this,"cache").get(e))},LRUCache.prototype.load=function(e){this.reset();for(var t=Date.now(),n=e.length-1;n>=0;n--){var r=e[n],i=r.e||0;if(0===i)this.set(r.k,r.v);else{var o=i-t;o>0&&this.set(r.k,r.v,o)}}},LRUCache.prototype.prune=function(){var e=this;priv(this,"cache").forEach(function(t,n){get(e,n,!1)})}},function(e,t,n){(function(t){"pseudomap"===t.env.npm_package_name&&"test"===t.env.npm_lifecycle_script&&(t.env.TEST_PSEUDOMAP="true"),"function"!=typeof Map||t.env.TEST_PSEUDOMAP?e.exports=n(39):e.exports=Map}).call(t,n(38))},function(e,t){function cleanUpNextTick(){o=!1,n.length?i=n.concat(i):a=-1,i.length&&drainQueue()}function drainQueue(){if(!o){var e=setTimeout(cleanUpNextTick);o=!0;for(var t=i.length;t;){for(n=i,i=[];++a1)for(var n=1;n=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),isBoolean(n)?r.showHidden=n:n&&t._extend(r,n),isUndefined(r.showHidden)&&(r.showHidden=!1),isUndefined(r.depth)&&(r.depth=2),isUndefined(r.colors)&&(r.colors=!1),isUndefined(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=stylizeWithColor),formatValue(r,e,r.depth)}function stylizeWithColor(e,t){var n=inspect.styles[t];return n?"["+inspect.colors[n][0]+"m"+e+"["+inspect.colors[n][1]+"m":e}function stylizeNoColor(e,t){return e}function arrayToHash(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function formatValue(e,n,r){if(e.customInspect&&n&&isFunction(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return isString(i)||(i=formatValue(e,i,r)),i}var o=formatPrimitive(e,n);if(o)return o;var a=Object.keys(n),u=arrayToHash(a);if(e.showHidden&&(a=Object.getOwnPropertyNames(n)),isError(n)&&(a.indexOf("message")>=0||a.indexOf("description")>=0))return formatError(n);if(0===a.length){if(isFunction(n)){var l=n.name?": "+n.name:"";return e.stylize("[Function"+l+"]","special")}if(isRegExp(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(isDate(n))return e.stylize(Date.prototype.toString.call(n),"date");if(isError(n))return formatError(n)}var s="",c=!1,f=["{","}"];if(isArray(n)&&(c=!0,f=["[","]"]),isFunction(n)){var h=n.name?": "+n.name:"";s=" [Function"+h+"]"}if(isRegExp(n)&&(s=" "+RegExp.prototype.toString.call(n)),isDate(n)&&(s=" "+Date.prototype.toUTCString.call(n)),isError(n)&&(s=" "+formatError(n)),0===a.length&&(!c||0==n.length))return f[0]+s+f[1];if(0>r)return isRegExp(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special");e.seen.push(n);var p;return p=c?formatArray(e,n,r,u,a):a.map(function(t){return formatProperty(e,n,r,u,t,c)}),e.seen.pop(),reduceToSingleString(p,s,f)}function formatPrimitive(e,t){if(isUndefined(t))return e.stylize("undefined","undefined");if(isString(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return isNumber(t)?e.stylize(""+t,"number"):isBoolean(t)?e.stylize(""+t,"boolean"):isNull(t)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,t,n,r,i){for(var o=[],a=0,u=t.length;u>a;++a)hasOwnProperty(t,String(a))?o.push(formatProperty(e,t,n,r,String(a),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,t,n,r,i,!0))}),o}function formatProperty(e,t,n,r,i,o){var a,u,l;if(l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},l.get?u=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(r,i)||(a="["+i+"]"),u||(e.seen.indexOf(l.value)<0?(u=isNull(n)?formatValue(e,l.value,null):formatValue(e,l.value,n-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(a)){if(o&&i.match(/^\d+$/))return u;a=JSON.stringify(""+i),a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+u}function reduceToSingleString(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,t=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),u[e.getMonth()],t].join(" ")}function hasOwnProperty(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var i=/%[sdj%]/g;t.format=function(e){if(!isString(e)){for(var t=[],n=0;n=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(t){return"[Circular]"}default:return e}}),u=r[n];o>n;u=r[++n])a+=isNull(u)||!isObject(u)?" "+u:" "+inspect(u);return a},t.deprecate=function(n,i){function deprecated(){if(!o){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),o=!0}return n.apply(this,arguments)}if(isUndefined(e.process))return function(){return t.deprecate(n,i).apply(this,arguments)};if(r.noDeprecation===!0)return n;var o=!1;return deprecated};var o,a={};t.debuglog=function(e){if(isUndefined(o)&&(o=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!a[e])if(new RegExp("\\b"+e+"\\b","i").test(o)){var n=r.pid;a[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else a[e]=function(){};return a[e]},t.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=isArray,t.isBoolean=isBoolean,t.isNull=isNull,t.isNullOrUndefined=isNullOrUndefined,t.isNumber=isNumber,t.isString=isString,t.isSymbol=isSymbol,t.isUndefined=isUndefined,t.isRegExp=isRegExp,t.isObject=isObject,t.isDate=isDate,t.isError=isError,t.isFunction=isFunction,t.isPrimitive=isPrimitive,t.isBuffer=n(41);var u=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];t.log=function(){console.log("%s - %s",timestamp(),t.format.apply(t,arguments))},t.inherits=n(42),t._extend=function(e,t){if(!t||!isObject(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}).call(t,function(){return this}(),n(38))},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t){function Yallist(e){var t=this;if(t instanceof Yallist||(t=new Yallist),t.tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach(function(e){t.push(e)});else if(arguments.length>0)for(var n=0,r=arguments.length;r>n;n++)t.push(arguments[n]);return t}function push(e,t){e.tail=new Node(t,e.tail,null,e),e.head||(e.head=e.tail),e.length++}function unshift(e,t){e.head=new Node(t,null,e.head,e),e.tail||(e.tail=e.head),e.length++}function Node(e,t,n,r){return this instanceof Node?(this.list=r,this.value=e,t?(t.next=this,this.prev=t):this.prev=null,void(n?(n.prev=this,this.next=n):this.next=null)):new Node(e,t,n,r)}e.exports=Yallist,Yallist.Node=Node,Yallist.create=Yallist,Yallist.prototype.removeNode=function(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");var t=e.next,n=e.prev;t&&(t.prev=n),n&&(n.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=n),e.list.length--,e.next=null,e.prev=null,e.list=null},Yallist.prototype.unshiftNode=function(e){if(e!==this.head){e.list&&e.list.removeNode(e);var t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}},Yallist.prototype.pushNode=function(e){if(e!==this.tail){e.list&&e.list.removeNode(e);var t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}},Yallist.prototype.push=function(){for(var e=0,t=arguments.length;t>e;e++)push(this,arguments[e]);return this.length},Yallist.prototype.unshift=function(){for(var e=0,t=arguments.length;t>e;e++)unshift(this,arguments[e]);return this.length},Yallist.prototype.pop=function(){if(this.tail){var e=this.tail.value;return this.tail=this.tail.prev,this.tail.next=null,this.length--,e}},Yallist.prototype.shift=function(){if(this.head){var e=this.head.value;return this.head=this.head.next,this.head.prev=null,this.length--,e}},Yallist.prototype.forEach=function(e,t){t=t||this;for(var n=this.head,r=0;null!==n;r++)e.call(t,n.value,r,this),n=n.next},Yallist.prototype.forEachReverse=function(e,t){t=t||this;for(var n=this.tail,r=this.length-1;null!==n;r--)e.call(t,n.value,r,this),n=n.prev},Yallist.prototype.get=function(e){for(var t=0,n=this.head;null!==n&&e>t;t++)n=n.next;return t===e&&null!==n?n.value:void 0},Yallist.prototype.getReverse=function(e){for(var t=0,n=this.tail;null!==n&&e>t;t++)n=n.prev;return t===e&&null!==n?n.value:void 0},Yallist.prototype.map=function(e,t){t=t||this;for(var n=new Yallist,r=this.head;null!==r;)n.push(e.call(t,r.value,this)),r=r.next;return n},Yallist.prototype.mapReverse=function(e,t){t=t||this;for(var n=new Yallist,r=this.tail;null!==r;)n.push(e.call(t,r.value,this)),r=r.prev;return n},Yallist.prototype.reduce=function(e,t){var n,r=this.head;if(arguments.length>1)n=t;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");r=this.head.next,n=this.head.value}for(var i=0;null!==r;i++)n=e(n,r.value,i),r=r.next;return n},Yallist.prototype.reduceReverse=function(e,t){var n,r=this.tail;if(arguments.length>1)n=t;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");r=this.tail.prev,n=this.tail.value}for(var i=this.length-1;null!==r;i--)n=e(n,r.value,i),r=r.prev;return n},Yallist.prototype.toArray=function(){for(var e=new Array(this.length),t=0,n=this.head;null!==n;t++)e[t]=n.value,n=n.next;return e},Yallist.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,n=this.tail;null!==n;t++)e[t]=n.value,n=n.prev;return e},Yallist.prototype.slice=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var n=new Yallist;if(e>t||0>t)return n;0>e&&(e=0),t>this.length&&(t=this.length);for(var r=0,i=this.head;null!==i&&e>r;r++)i=i.next;for(;null!==i&&t>r;r++,i=i.next)n.push(i.value);return n},Yallist.prototype.sliceReverse=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var n=new Yallist;if(e>t||0>t)return n;0>e&&(e=0),t>this.length&&(t=this.length);for(var r=this.length,i=this.tail;null!==i&&r>t;r--)i=i.prev;for(;null!==i&&r>e;r--,i=i.prev)n.push(i.value);return n},Yallist.prototype.reverse=function(){for(var e=this.head,t=this.tail,n=e;null!==n;n=n.prev){var r=n.prev;n.prev=n.next,n.next=r}return this.head=t,this.tail=e,this}},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n0;i--){var o=1<=e||e>t?complete(c,o):s=setTimeout(delayed,e)}function flush(){return(s&&c||o&&y)&&(a=e.apply(l,i)),cancel(),a}function maxDelayed(){complete(y,s)}function debounced(){if(i=arguments,u=d(),l=this,c=y&&(s||!h),v===!1)var n=h&&!s;else{o||h||(f=u);var r=v-(u-f),p=0>=r||r>v;p?(o&&(o=clearTimeout(o)),f=u,a=e.apply(l,i)):o||(o=setTimeout(maxDelayed,r))}return p&&s?s=clearTimeout(s):s||t===v||(s=setTimeout(delayed,t)),n&&(p=!0,a=e.apply(l,i)),!p||s||o||(i=l=void 0),a}var i,o,a,u,l,s,c,f=0,h=!1,v=!1,y=!0;if("function"!=typeof e)throw new TypeError(n);return t=toNumber(t)||0,isObject(r)&&(h=!!r.leading,v="maxWait"in r&&p(toNumber(r.maxWait)||0,t),y="trailing"in r?!!r.trailing:y),debounced.cancel=cancel,debounced.flush=flush,debounced}function isFunction(e){var t=isObject(e)?h.call(e):"";return t==i||t==o}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function toNumber(e){if(isObject(e)){var t=isFunction(e.valueOf)?e.valueOf():e;e=isObject(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(a,"");var n=l.test(e);return n||s.test(e)?c(e.slice(2),n?2:8):u.test(e)?r:+e}var n="Expected a function",r=NaN,i="[object Function]",o="[object GeneratorFunction]",a=/^\s+|\s+$/g,u=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,s=/^0o[0-7]+$/i,c=parseInt,f=Object.prototype,h=f.toString,p=Math.max,d=Date.now;e.exports=debounce}])}); //# sourceMappingURL=vizicities.min.js.map diff --git a/dist/vizicities.min.js.map b/dist/vizicities.min.js.map index 8a5a41f..5d7aab8 100644 --- a/dist/vizicities.min.js.map +++ b/dist/vizicities.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","vizicities.min.js","webpack:/webpack/bootstrap ca2ab29585dec9c8f1eb","webpack:///src/vizicities.js","webpack:///src/World.js","webpack:///~/eventemitter3/index.js","webpack:///~/lodash.assign/index.js","webpack:///~/lodash.keys/index.js","webpack:///~/lodash.rest/index.js","webpack:///src/geo/CRS/index.js","webpack:///src/geo/CRS/CRS.EPSG3857.js","webpack:///src/geo/CRS/CRS.Earth.js","webpack:///src/geo/CRS/CRS.js","webpack:///src/geo/LatLon.js","webpack:///src/geo/Point.js","webpack:///src/util/wrapNum.js","webpack:///src/geo/projection/Projection.SphericalMercator.js","webpack:///src/util/Transformation.js","webpack:///src/geo/CRS/CRS.EPSG3395.js","webpack:///src/geo/projection/Projection.Mercator.js","webpack:///src/geo/CRS/CRS.EPSG4326.js","webpack:///src/geo/projection/Projection.LatLon.js","webpack:///src/geo/CRS/CRS.Simple.js","webpack:///src/geo/CRS/CRS.Proj4.js","webpack:///src/geo/projection/Projection.Proj4.js","webpack:/external \"proj4\"","webpack:///src/engine/Engine.js","webpack:/external \"THREE\"","webpack:///src/engine/Scene.js","webpack:///src/engine/Renderer.js","webpack:///src/engine/Camera.js","webpack:///src/controls/index.js","webpack:///src/controls/Controls.Orbit.js","webpack:///~/three-orbit-controls/index.js","webpack:///src/layer/environment/EnvironmentLayer.js","webpack:///src/layer/Layer.js","webpack:///src/layer/tile/ImageTileLayer.js","webpack:///src/layer/tile/TileLayer.js","webpack:///src/layer/tile/TileCache.js","webpack:///~/lru-cache/lib/lru-cache.js","webpack:///~/pseudomap/map.js","webpack:///~/process/browser.js","webpack:///~/pseudomap/pseudomap.js","webpack:///~/util/util.js","webpack:///~/util/support/isBufferBrowser.js","webpack:///~/inherits/inherits_browser.js","webpack:///~/yallist/yallist.js","webpack:///src/layer/tile/ImageTile.js","webpack:///src/layer/tile/Tile.js","webpack:///src/vendor/BoxHelper.js","webpack:///src/layer/tile/ImageTileLayerBaseMaterial.js","webpack:///~/lodash.throttle/index.js","webpack:///~/lodash.throttle/~/lodash.debounce/index.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_22__","__WEBPACK_EXTERNAL_MODULE_24__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_World","_World2","_controlsIndex","_controlsIndex2","_layerEnvironmentEnvironmentLayer","_layerEnvironmentEnvironmentLayer2","_layerTileImageTileLayer","_layerTileImageTileLayer2","_geoPoint","_geoPoint2","_geoLatLon","_geoLatLon2","VIZI","version","World","Controls","EnvironmentLayer","ImageTileLayer","Point","LatLon","_classCallCheck","instance","Constructor","TypeError","_inherits","subClass","superClass","prototype","create","constructor","enumerable","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","i","length","descriptor","key","protoProps","staticProps","_get","_x","_x2","_x3","_again","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","getter","get","parent","getPrototypeOf","_eventemitter3","_eventemitter32","_lodashAssign","_lodashAssign2","_geoCRSIndex","_geoCRSIndex2","_engineEngine","_engineEngine2","_EventEmitter","domId","options","defaults","crs","EPSG3857","_layers","_controls","_initContainer","_initEngine","_initEvents","_update","_container","document","getElementById","_engine","on","_onControlsMoveEnd","point","_point","x","z","_resetView","pointToLatLon","latlon","emit","_moveStart","_move","_moveEnd","_lastPosition","delta","clock","getDelta","window","requestAnimationFrame","bind","forEach","controls","update","_originLatlon","_originPoint","project","latLonToPoint","projectedPoint","_subtract","add","unproject","_camera","layer","_addToWorld","push","_scene","_layer","layerIndex","indexOf","splice","remove","destroy","EE","fn","context","once","EventEmitter","prefix","_events","listeners","event","exists","evt","available","l","ee","Array","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","listener","events","removeAllListeners","off","addListener","setMaxListeners","prefixed","isIndex","reIsUint","test","MAX_SAFE_INTEGER","assignValue","objValue","eq","objectProto","hasOwnProperty","baseProperty","copyObject","source","copyObjectWith","customizer","index","newValue","createAssigner","assigner","rest","sources","guard","isIterateeCall","isObject","type","isArrayLike","other","isFunction","isLength","getLength","tag","objectToString","funcTag","genTag","keys","toString","assign","baseTimes","n","iteratee","result","baseHas","baseKeys","nativeKeys","indexKeys","isArray","isString","isArguments","String","isPrototype","Ctor","proto","isArrayLikeObject","propertyIsEnumerable","argsTag","isObjectLike","stringTag","isProto","indexes","skipIndexes","func","thisArg","start","FUNC_ERROR_TEXT","nativeMax","toInteger","array","otherArgs","toNumber","INFINITY","sign","MAX_INTEGER","remainder","valueOf","replace","reTrim","isBinary","reIsBinary","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","parseInt","Math","max","_CRSEPSG3857","_CRSEPSG38572","_CRSEPSG3395","_CRSEPSG33952","_CRSEPSG4326","_CRSEPSG43262","_CRSSimple","_CRSSimple2","_CRSProj4","_CRSProj42","CRS","EPSG900913","EPSG3395","EPSG4326","Simple","Proj4","_CRSEarth","_CRSEarth2","_projectionProjectionSphericalMercator","_projectionProjectionSphericalMercator2","_utilTransformation","_utilTransformation2","_EPSG3857","code","projection","transformScale","PI","R","transformation","scale","_CRS","_CRS2","_LatLon","Earth","wrapLon","distance","latlon1","latlon2","accurate","lat1","lat2","a","rad","lat","lon1","lon","lon2","deltaLat","deltaLon","halfDeltaLat","halfDeltaLon","sin","cos","atan2","sqrt","acos","min","pointScale","metresToProjected","metres","projectedToMetres","projectedUnits","metresToWorld","zoom","projectedMetres","scaledMetres","worldToMetres","worldUnits","realMetres","_LatLon2","_Point","_Point2","_utilWrapNum","_utilWrapNum2","scaleFactor","_transform","untransformedPoint","untransform","pow","log","LN2","getProjectedBounds","infinite","b","bounds","s","transform","wrapLatLon","wrapLat","alt","isNaN","Error","lng","y","round","clone","_add","wrapNum","range","includeMax","d","SphericalMercator","MAX_LATITUDE","ECC","ECC2","atan","exp","k","sinLat","sinLat2","cosLat","v","h","Transformation","_a","_b","_c","_d","_projectionProjectionMercator","_projectionProjectionMercator2","_EPSG3395","Mercator","R_MINOR","r","tmp","e","con","ts","tan","phi","dphi","abs","_projectionProjectionLatLon","_projectionProjectionLatLon2","_EPSG4326","ProjectionLatLon","m1","m2","m3","m4","p1","p2","p3","latlen","lonlen","_Simple","dx","dy","_projectionProjectionProj4","_projectionProjectionProj42","_Proj4","def","diffX","diffY","halfX","halfY","scaleX","scaleY","offsetX","offsetY","_proj4","_proj42","proj","forward","inverse","bottomLeft","topRight","_three","_three2","_Scene","_Scene2","_Renderer","_Renderer2","_Camera","_Camera2","Engine","container","console","_renderer","Clock","_frustum","Frustum","render","scene","Scene","fog","Fog","renderer","WebGLRenderer","antialias","setClearColor","color","gammaInput","gammaOutput","appendChild","domElement","updateSize","setSize","clientWidth","clientHeight","addEventListener","camera","PerspectiveCamera","position","aspect","updateProjectionMatrix","_ControlsOrbit","_ControlsOrbit2","Orbit","_threeOrbitControls","_threeOrbitControls2","_OrbitControls","_this","_world","center","animate","pointDelta","metresDelta","angle","angleDelta","noZoom","world","addControls","maxPolarAngle","THREE","OrbitConstraint","Vector3","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","theta","scope","EPS","phiDelta","thetaDelta","panOffset","zoomChanged","getPolarAngle","getAzimuthalAngle","rotateLeft","rotateUp","panLeft","te","matrix","elements","adjDist","set","normalize","multiplyScalar","panUp","pan","deltaX","deltaY","screenWidth","screenHeight","offset","sub","targetDistance","fov","OrthographicCamera","right","left","top","bottom","warn","dollyIn","dollyScale","dollyOut","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","copy","applyQuaternion","radius","lookAt","distanceToSquared","dot","quaternion","OrbitControls","element","body","constraint","getAutoRotationAngle","autoRotateSpeed","getZoomScale","zoomSpeed","onMouseDown","enabled","preventDefault","button","mouseButtons","ORBIT","enableRotate","state","STATE","ROTATE","rotateStart","clientX","clientY","ZOOM","enableZoom","DOLLY","dollyStart","PAN","enablePan","panStart","NONE","onMouseMove","onMouseUp","dispatchEvent","startEvent","rotateEnd","rotateDelta","subVectors","rotateSpeed","dollyEnd","dollyDelta","panEnd","panDelta","removeEventListener","endEvent","onMouseWheel","stopPropagation","wheelDelta","detail","onKeyDown","enableKeys","keyCode","UP","keyPanSpeed","BOTTOM","LEFT","RIGHT","touchstart","touches","TOUCH_ROTATE","pageX","pageY","TOUCH_DOLLY","TOUCH_PAN","touchmove","touchend","contextmenu","autoRotate","MOUSE","MIDDLE","Vector2","target0","position0","zoom0","changeEvent","reset","dispose","EventDispatcher","noRotate","noPan","noKeys","staticMoving","dynamicDampingFactor","_Layer2","_Layer3","_Layer","_initLights","directionalLight","DirectionalLight","intesity","directionalLight2","helper","DirectionalLightHelper","helper2","size","step","gridHelper","GridHelper","_engineScene","Layer","Object3D","addLayer","_onAdd","_TileLayer2","_TileLayer3","_ImageTile","_ImageTile2","_ImageTileLayerBaseMaterial","_ImageTileLayerBaseMaterial2","_lodashThrottle","_lodashThrottle2","_TileLayer","path","_path","geom","PlaneBufferGeometry","mesh","Mesh","rotation","_baseLayer","setTimeout","_calculateLOD","_throttledWorldUpdate","_onWorldUpdate","_onWorldMove","_moveBaseLayer","quadcode","geometry","material","map","_TileCache","_TileCache2","TileLayer","maxCache","_tileCache","tile","_destroyTile","_minLOD","_maxLOD","_tiles","getCamera","projScreenMatrix","Matrix4","multiplyMatrices","projectionMatrix","matrixWorldInverse","setFromMatrix","getBounds","intersectsBox","Box3","_this2","_stop","_updateFrustum","checkList","_checklist","_requestTile","_divide","_removeTiles","_tileInFrustum","getMesh","isReady","requestTileAsync","currentItem","count","getQuadcode","_screenSpaceError","minDepth","maxDepth","quality","getCenter","dist","error","getSide","children","getTile","_createTile","setTile","_lruCache","_lruCache2","TileCache","cacheLimit","onDestroyTile","_cache","priv","val","sym","symbols","makeSymbol","naiveLength","LRUCache","lc","stale","maxAge","forEachStep","self","node","thisp","hit","isStale","del","doUse","unshiftNode","diff","Date","now","trim","walker","tail","prev","removeNode","Entry","Map","util","Yallist","hasSymbol","Symbol","mL","allowStale","mA","lC","rforEach","head","next","toArray","values","dump","filter","dumpLru","inspect","opts","str","extras","as","didFirst","item","split","join","has","unshift","peek","pop","load","arr","expiresAt","prune","process","env","npm_package_name","npm_lifecycle_script","TEST_PSEUDOMAP","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","run","clearTimeout","Item","fun","noop","nextTick","title","browser","argv","versions","binding","name","cwd","chdir","dir","umask","PseudoMap","clear","kv","same","_index","find","data","_data","res","entries","global","ctx","seen","stylize","stylizeNoColor","depth","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","style","styles","arrayToHash","hash","idx","recurseTimes","ret","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","RegExp","isDate","base","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","isNumber","isNull","match","line","substr","numLinesEst","reduce","cur","ar","arg","isNullOrUndefined","isSymbol","re","isPrimitive","o","pad","timestamp","time","getHours","getMinutes","getSeconds","getDate","months","getMonth","prop","formatRegExp","format","f","objects","Number","_","deprecate","msg","deprecated","warned","throwDeprecation","traceDeprecation","trace","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","toUpperCase","pid","bold","italic","underline","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","regexp","isBuffer","inherits","origin","fill","readUInt8","ctor","superCtor","super_","TempCtor","list","Node","pushNode","shift","forEachReverse","getReverse","mapReverse","initial","acc","reduceReverse","toArrayReverse","from","to","sliceReverse","reverse","_Tile2","_Tile3","_vendorBoxHelper","_vendorBoxHelper2","ImageTile","_Tile","_mesh","_createMesh","_requestTexture","_abortRequest","_image","_center","_side","MeshBasicMaterial","depthWrite","localMesh","box","_createDebugMesh","canvas","createElement","width","height","getContext","font","fillStyle","fillText","_quadcode","_tile","texture","Texture","magFilter","LinearFilter","minFilter","LinearMipMapLinearFilter","anisotropy","needsUpdate","transparent","urlParams","url","_getTileURL","image","_texture","_ready","crossOrigin","src","r2d","tileURLRegex","Tile","_quadcodeToTile","_boundsLatLon","_tileBoundsWGS84","_boundsWorld","_tileBoundsFromWGS84","_boundsToCenter","_getSide","child","fromCharCode","floor","random","lastIndex","mask","q","boundsWGS84","sw","ne","_tile2lon","w","_tile2lat","BoxHelper","indices","Uint16Array","positions","Float32Array","BufferGeometry","setIndex","BufferAttribute","addAttribute","LineSegments","LineBasicMaterial","linewidth","setFromObject","isEmpty","attributes","computeBoundingSphere","colour","fillRect","throttle","wait","leading","trailing","debounce","maxWait","cancel","timeoutId","maxTimeoutId","lastCalled","trailingCall","complete","isCalled","delayed","remaining","stamp","flush","maxDelayed","debounced","leadingCall"],"mappings":"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","file":"vizicities.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _World = __webpack_require__(1);\n\t\n\tvar _World2 = _interopRequireDefault(_World);\n\t\n\tvar _controlsIndex = __webpack_require__(28);\n\t\n\tvar _controlsIndex2 = _interopRequireDefault(_controlsIndex);\n\t\n\tvar _layerEnvironmentEnvironmentLayer = __webpack_require__(31);\n\t\n\tvar _layerEnvironmentEnvironmentLayer2 = _interopRequireDefault(_layerEnvironmentEnvironmentLayer);\n\t\n\tvar _layerTileImageTileLayer = __webpack_require__(33);\n\t\n\tvar _layerTileImageTileLayer2 = _interopRequireDefault(_layerTileImageTileLayer);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar VIZI = {\n\t version: '0.3',\n\t\n\t // Public API\n\t World: _World2['default'],\n\t Controls: _controlsIndex2['default'],\n\t EnvironmentLayer: _layerEnvironmentEnvironmentLayer2['default'],\n\t ImageTileLayer: _layerTileImageTileLayer2['default'],\n\t Point: _geoPoint2['default'],\n\t LatLon: _geoLatLon2['default']\n\t};\n\t\n\texports['default'] = VIZI;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _geoCRSIndex = __webpack_require__(6);\n\t\n\tvar _geoCRSIndex2 = _interopRequireDefault(_geoCRSIndex);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _engineEngine = __webpack_require__(23);\n\t\n\tvar _engineEngine2 = _interopRequireDefault(_engineEngine);\n\t\n\t// Pretty much any event someone using ViziCities would need will be emitted or\n\t// proxied by World (eg. render events, etc)\n\t\n\tvar World = (function (_EventEmitter) {\n\t _inherits(World, _EventEmitter);\n\t\n\t function World(domId, options) {\n\t _classCallCheck(this, World);\n\t\n\t _get(Object.getPrototypeOf(World.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t crs: _geoCRSIndex2['default'].EPSG3857\n\t };\n\t\n\t this.options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._layers = [];\n\t this._controls = [];\n\t\n\t this._initContainer(domId);\n\t this._initEngine();\n\t this._initEvents();\n\t\n\t // Kick off the update and render loop\n\t this._update();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(World, [{\n\t key: '_initContainer',\n\t value: function _initContainer(domId) {\n\t this._container = document.getElementById(domId);\n\t }\n\t }, {\n\t key: '_initEngine',\n\t value: function _initEngine() {\n\t this._engine = (0, _engineEngine2['default'])(this._container);\n\t\n\t // Engine events\n\t //\n\t // Consider proxying these through events on World for public access\n\t // this._engine.on('preRender', () => {});\n\t // this._engine.on('postRender', () => {});\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t this.on('controlsMoveEnd', this._onControlsMoveEnd);\n\t }\n\t }, {\n\t key: '_onControlsMoveEnd',\n\t value: function _onControlsMoveEnd(point) {\n\t var _point = (0, _geoPoint2['default'])(point.x, point.z);\n\t this._resetView(this.pointToLatLon(_point), _point);\n\t }\n\t\n\t // Reset world view\n\t }, {\n\t key: '_resetView',\n\t value: function _resetView(latlon, point) {\n\t this.emit('preResetView');\n\t\n\t this._moveStart();\n\t this._move(latlon, point);\n\t this._moveEnd();\n\t\n\t this.emit('postResetView');\n\t }\n\t }, {\n\t key: '_moveStart',\n\t value: function _moveStart() {\n\t this.emit('moveStart');\n\t }\n\t }, {\n\t key: '_move',\n\t value: function _move(latlon, point) {\n\t this._lastPosition = latlon;\n\t this.emit('move', latlon, point);\n\t }\n\t }, {\n\t key: '_moveEnd',\n\t value: function _moveEnd() {\n\t this.emit('moveEnd');\n\t }\n\t }, {\n\t key: '_update',\n\t value: function _update() {\n\t var delta = this._engine.clock.getDelta();\n\t\n\t // Once _update is called it will run forever, for now\n\t window.requestAnimationFrame(this._update.bind(this));\n\t\n\t // Update controls\n\t this._controls.forEach(function (controls) {\n\t controls.update();\n\t });\n\t\n\t this.emit('preUpdate');\n\t this._engine.update(delta);\n\t this.emit('postUpdate');\n\t }\n\t\n\t // Set world view\n\t }, {\n\t key: 'setView',\n\t value: function setView(latlon) {\n\t // Store initial geographic coordinate for the [0,0,0] world position\n\t //\n\t // The origin point doesn't move in three.js / 3D space so only set it once\n\t // here instead of every time _resetView is called\n\t //\n\t // If it was updated every time then coorindates would shift over time and\n\t // would be out of place / context with previously-placed points (0,0 would\n\t // refer to a different point each time)\n\t this._originLatlon = latlon;\n\t this._originPoint = this.project(latlon);\n\t\n\t this._resetView(latlon);\n\t return this;\n\t }\n\t\n\t // Return world geographic position\n\t }, {\n\t key: 'getPosition',\n\t value: function getPosition() {\n\t return this._lastPosition;\n\t }\n\t\n\t // Transform geographic coordinate to world point\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the origin point of the projection (not the world)\n\t }, {\n\t key: 'project',\n\t value: function project(latlon) {\n\t return this.options.crs.latLonToPoint((0, _geoLatLon2['default'])(latlon));\n\t }\n\t\n\t // Transform world point to geographic coordinate\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a point relative to the origin point of the\n\t // projection (not the world) and returns a geographic coordinate\n\t }, {\n\t key: 'unproject',\n\t value: function unproject(point) {\n\t return this.options.crs.pointToLatLon((0, _geoPoint2['default'])(point));\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the three.js / 3D origin (0,0)\n\t }, {\n\t key: 'latLonToPoint',\n\t value: function latLonToPoint(latlon) {\n\t var projectedPoint = this.project((0, _geoLatLon2['default'])(latlon));\n\t return projectedPoint._subtract(this._originPoint);\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a point relative to the three.js / 3D origin (0,0)\n\t // and returns the exact geographic coordinate at that point\n\t }, {\n\t key: 'pointToLatLon',\n\t value: function pointToLatLon(point) {\n\t var projectedPoint = (0, _geoPoint2['default'])(point).add(this._originPoint);\n\t return this.unproject(projectedPoint);\n\t }\n\t\n\t // Unsure if it's a good idea to expose this here for components like\n\t // GridLayer to use (eg. to keep track of a frustum)\n\t }, {\n\t key: 'getCamera',\n\t value: function getCamera() {\n\t return this._engine._camera;\n\t }\n\t }, {\n\t key: 'addLayer',\n\t value: function addLayer(layer) {\n\t layer._addToWorld(this);\n\t\n\t this._layers.push(layer);\n\t\n\t // Could move this into Layer but it'll do here for now\n\t this._engine._scene.add(layer._layer);\n\t\n\t this.emit('layerAdded', layer);\n\t return this;\n\t }\n\t\n\t // Remove layer and perform clean up operations\n\t }, {\n\t key: 'removeLayer',\n\t value: function removeLayer(layer) {\n\t var layerIndex = this._layers.indexOf(layer);\n\t\n\t if (layerIndex > -1) {\n\t // Remove from this._layers\n\t this._layers.splice(layerIndex, 1);\n\t };\n\t\n\t this._engine._scene.remove(layer._layer);\n\t\n\t layer.destroy();\n\t\n\t this.emit('layerRemoved');\n\t return this;\n\t }\n\t }, {\n\t key: 'addControls',\n\t value: function addControls(controls) {\n\t controls._addToWorld(this);\n\t\n\t this._controls.push(controls);\n\t\n\t this.emit('controlsAdded', controls);\n\t return this;\n\t }\n\t }, {\n\t key: 'removeControls',\n\t value: function removeControls(controls) {}\n\t }]);\n\t\n\t return World;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (domId, options) {\n\t return new World(domId, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t//\n\t// We store our EE objects in a plain object whose properties are event names.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// `~` to make sure that the built-in object properties are not overridden or\n\t// used as an attack vector.\n\t// We also assume that `Object.create(null)` is available when the event name\n\t// is an ES6 Symbol.\n\t//\n\tvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\t\n\t/**\n\t * Representation of a single EventEmitter function.\n\t *\n\t * @param {Function} fn Event handler to be called.\n\t * @param {Mixed} context Context for function execution.\n\t * @param {Boolean} once Only emit once\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\t\n\t/**\n\t * Minimal EventEmitter interface that is molded against the Node.js\n\t * EventEmitter interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() { /* Nothing to set */ }\n\t\n\t/**\n\t * Holds the assigned EventEmitters by name.\n\t *\n\t * @type {Object}\n\t * @private\n\t */\n\tEventEmitter.prototype._events = undefined;\n\t\n\t/**\n\t * Return a list of assigned event listeners.\n\t *\n\t * @param {String} event The events that should be listed.\n\t * @param {Boolean} exists We only need to know if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events && this._events[evt];\n\t\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\t\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\t\n\t return ee;\n\t};\n\t\n\t/**\n\t * Emit an event to all registered event listeners.\n\t *\n\t * @param {String} event The name of the event.\n\t * @returns {Boolean} Indication if we've emitted an event.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return false;\n\t\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\t\n\t if ('function' === typeof listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\t\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\t\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\t\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\t\n\t return true;\n\t};\n\t\n\t/**\n\t * Register a new EventListener for the given event.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Functon} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Add an EventListener that's only called once.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove event listeners.\n\t *\n\t * @param {String} event The event we want to remove.\n\t * @param {Function} fn The listener that we need to find.\n\t * @param {Mixed} context Only remove listeners matching this context.\n\t * @param {Boolean} once Only remove once listeners.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return this;\n\t\n\t var listeners = this._events[evt]\n\t , events = [];\n\t\n\t if (fn) {\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn !== fn\n\t || (once && !listeners.once)\n\t || (context && listeners.context !== context)\n\t ) {\n\t events.push(listeners);\n\t }\n\t } else {\n\t for (var i = 0, length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) {\n\t this._events[evt] = events.length === 1 ? events[0] : events;\n\t } else {\n\t delete this._events[evt];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove all listeners or only the listeners for the specified event.\n\t *\n\t * @param {String} event The event want to remove all listeners for.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t if (!this._events) return this;\n\t\n\t if (event) delete this._events[prefix ? prefix + event : event];\n\t else this._events = prefix ? {} : Object.create(null);\n\t\n\t return this;\n\t};\n\t\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\t\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\t\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\t\n\t//\n\t// Expose the module.\n\t//\n\tif (true) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar keys = __webpack_require__(4),\n\t rest = __webpack_require__(5);\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if ((!eq(objValue, value) ||\n\t (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object) {\n\t return copyObjectWith(source, props, object);\n\t}\n\t\n\t/**\n\t * This function is like `copyObject` except that it accepts a function to\n\t * customize copied values.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObjectWith(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index],\n\t newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\t\n\t assignValue(object, key, newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return rest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Checks if the provided arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Assigns own enumerable properties of source objects to the destination\n\t * object. Source objects are applied from left to right. Subsequent sources\n\t * overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.e = 5;\n\t * }\n\t *\n\t * Foo.prototype.d = 4;\n\t * Bar.prototype.f = 6;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3, 'e': 5 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t copyObject(source, keys(source), object);\n\t});\n\t\n\tmodule.exports = assign;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t stringTag = '[object String]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar getPrototypeOf = Object.getPrototypeOf,\n\t propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeKeys = Object.keys;\n\t\n\t/**\n\t * The base implementation of `_.has` without support for deep paths.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} key The key to check.\n\t * @returns {boolean} Returns `true` if `key` exists, else `false`.\n\t */\n\tfunction baseHas(object, key) {\n\t // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n\t // that are composed entirely of index properties, return `false` for\n\t // `hasOwnProperty` checks of them.\n\t return hasOwnProperty.call(object, key) ||\n\t (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't skip the constructor\n\t * property of prototypes or treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @type Function\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t return nativeKeys(Object(object));\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Creates an array of index keys for `object` values of arrays,\n\t * `arguments` objects, and strings, otherwise `null` is returned.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array|null} Returns index keys, else `null`.\n\t */\n\tfunction indexKeys(object) {\n\t var length = object ? object.length : undefined;\n\t if (isLength(length) &&\n\t (isArray(object) || isString(object) || isArguments(object))) {\n\t return baseTimes(length, String);\n\t }\n\t return null;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\tfunction isString(value) {\n\t return typeof value == 'string' ||\n\t (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n\t}\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t var isProto = isPrototype(object);\n\t if (!(isProto || isArrayLike(object))) {\n\t return baseKeys(object);\n\t }\n\t var indexes = indexKeys(object),\n\t skipIndexes = !!indexes,\n\t result = indexes || [],\n\t length = result.length;\n\t\n\t for (var key in object) {\n\t if (baseHas(object, key) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n\t !(isProto && key == 'constructor')) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\tmodule.exports = keys;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar INFINITY = 1 / 0,\n\t MAX_INTEGER = 1.7976931348623157e+308,\n\t NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {...*} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t var length = args.length;\n\t switch (length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Creates a function that invokes `func` with the `this` binding of the\n\t * created function and arguments from `start` and beyond provided as an array.\n\t *\n\t * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t * @example\n\t *\n\t * var say = _.rest(function(what, names) {\n\t * return what + ' ' + _.initial(names).join(', ') +\n\t * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n\t * });\n\t *\n\t * say('hello', 'fred', 'barney', 'pebbles');\n\t * // => 'hello fred, barney, & pebbles'\n\t */\n\tfunction rest(func, start) {\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t switch (start) {\n\t case 0: return func.call(this, array);\n\t case 1: return func.call(this, args[0], array);\n\t case 2: return func.call(this, args[0], args[1], array);\n\t }\n\t var otherArgs = Array(start + 1);\n\t index = -1;\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to an integer.\n\t *\n\t * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.toInteger(3);\n\t * // => 3\n\t *\n\t * _.toInteger(Number.MIN_VALUE);\n\t * // => 0\n\t *\n\t * _.toInteger(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toInteger('3');\n\t * // => 3\n\t */\n\tfunction toInteger(value) {\n\t if (!value) {\n\t return value === 0 ? value : 0;\n\t }\n\t value = toNumber(value);\n\t if (value === INFINITY || value === -INFINITY) {\n\t var sign = (value < 0 ? -1 : 1);\n\t return sign * MAX_INTEGER;\n\t }\n\t var remainder = value % 1;\n\t return value === value ? (remainder ? value - remainder : value) : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = rest;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _CRSEPSG3857 = __webpack_require__(7);\n\t\n\tvar _CRSEPSG38572 = _interopRequireDefault(_CRSEPSG3857);\n\t\n\tvar _CRSEPSG3395 = __webpack_require__(15);\n\t\n\tvar _CRSEPSG33952 = _interopRequireDefault(_CRSEPSG3395);\n\t\n\tvar _CRSEPSG4326 = __webpack_require__(17);\n\t\n\tvar _CRSEPSG43262 = _interopRequireDefault(_CRSEPSG4326);\n\t\n\tvar _CRSSimple = __webpack_require__(19);\n\t\n\tvar _CRSSimple2 = _interopRequireDefault(_CRSSimple);\n\t\n\tvar _CRSProj4 = __webpack_require__(20);\n\t\n\tvar _CRSProj42 = _interopRequireDefault(_CRSProj4);\n\t\n\tvar CRS = {};\n\t\n\tCRS.EPSG3857 = _CRSEPSG38572['default'];\n\tCRS.EPSG900913 = _CRSEPSG3857.EPSG900913;\n\tCRS.EPSG3395 = _CRSEPSG33952['default'];\n\tCRS.EPSG4326 = _CRSEPSG43262['default'];\n\tCRS.Simple = _CRSSimple2['default'];\n\tCRS.Proj4 = _CRSProj42['default'];\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionSphericalMercator = __webpack_require__(13);\n\t\n\tvar _projectionProjectionSphericalMercator2 = _interopRequireDefault(_projectionProjectionSphericalMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3857 = {\n\t code: 'EPSG:3857',\n\t projection: _projectionProjectionSphericalMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3857 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3857);\n\t\n\tvar EPSG900913 = (0, _lodashAssign2['default'])({}, EPSG3857, {\n\t code: 'EPSG:900913'\n\t});\n\t\n\texports.EPSG900913 = EPSG900913;\n\texports['default'] = EPSG3857;\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Earth is the base class for all CRS representing Earth.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar Earth = {\n\t wrapLon: [-180, 180],\n\t\n\t R: 6378137,\n\t\n\t // Distance between two geographical points using spherical law of cosines\n\t // approximation or Haversine\n\t //\n\t // See: http://www.movable-type.co.uk/scripts/latlong.html\n\t distance: function distance(latlon1, latlon2, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var lat1;\n\t var lat2;\n\t\n\t var a;\n\t\n\t if (!accurate) {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\t\n\t return this.R * Math.acos(Math.min(a, 1));\n\t } else {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t var lon1 = latlon1.lon * rad;\n\t var lon2 = latlon2.lon * rad;\n\t\n\t var deltaLat = lat2 - lat1;\n\t var deltaLon = lon2 - lon1;\n\t\n\t var halfDeltaLat = deltaLat / 2;\n\t var halfDeltaLon = deltaLon / 2;\n\t\n\t a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\t\n\t var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\n\t return this.R * c;\n\t }\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Defaults to a scale factor of 1 if no calculation method exists\n\t //\n\t // Probably need to run this through the CRS transformation or similar so the\n\t // resulting scale is relative to the dimensions of the world space\n\t // Eg. 1 metre in projected space is likly scaled up or down to some other\n\t // number\n\t pointScale: function pointScale(latlon, accurate) {\n\t return this.projection.pointScale ? this.projection.pointScale(latlon, accurate) : [1, 1];\n\t },\n\t\n\t // Convert real metres to projected units\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t metresToProjected: function metresToProjected(metres, pointScale) {\n\t return metres * pointScale[1];\n\t },\n\t\n\t // Convert projected units to real metres\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t projectedToMetres: function projectedToMetres(projectedUnits, pointScale) {\n\t return projectedUnits / pointScale[1];\n\t },\n\t\n\t // Convert real metres to a value in world (WebGL) units\n\t metresToWorld: function metresToWorld(metres, pointScale, zoom) {\n\t // Transform metres to projected metres using the latitude point scale\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t var projectedMetres = this.metresToProjected(metres, pointScale);\n\t\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t // Scale projected metres\n\t var scaledMetres = scale * (this.transformScale * projectedMetres) / pointScale[1];\n\t\n\t return scaledMetres;\n\t },\n\t\n\t // Convert world (WebGL) units to a value in real metres\n\t worldToMetres: function worldToMetres(worldUnits, pointScale, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var projectedUnits = worldUnits / scale / this.transformScale * pointScale[1];\n\t var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\t\n\t return realMetres;\n\t }\n\t};\n\t\n\texports['default'] = (0, _lodashAssign2['default'])({}, _CRS2['default'], Earth);\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar _utilWrapNum = __webpack_require__(12);\n\t\n\tvar _utilWrapNum2 = _interopRequireDefault(_utilWrapNum);\n\t\n\tvar CRS = {\n\t // Scale factor determines final dimensions of world space\n\t //\n\t // Projection transformation in range -1 to 1 is multiplied by scale factor to\n\t // find final world coordinates\n\t //\n\t // Scale factor can be considered as half the amount of the desired dimension\n\t // for the largest side when transformation is equal to 1 or -1, or as the\n\t // distance between 0 and 1 on the largest side\n\t //\n\t // For example, if you want the world dimensions to be between -1000 and 1000\n\t // then the scale factor will be 1000\n\t scaleFactor: 1000000,\n\t\n\t // Converts geo coords to pixel / WebGL ones\n\t latLonToPoint: function latLonToPoint(latlon, zoom) {\n\t var projectedPoint = this.projection.project(latlon);\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t return this.transformation._transform(projectedPoint, scale);\n\t },\n\t\n\t // Converts pixel / WebGL coords to geo coords\n\t pointToLatLon: function pointToLatLon(point, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var untransformedPoint = this.transformation.untransform(point, scale);\n\t\n\t return this.projection.unproject(untransformedPoint);\n\t },\n\t\n\t // Converts geo coords to projection-specific coords (e.g. in meters)\n\t project: function project(latlon) {\n\t return this.projection.project(latlon);\n\t },\n\t\n\t // Converts projected coords to geo coords\n\t unproject: function unproject(point) {\n\t return this.projection.unproject(point);\n\t },\n\t\n\t // If zoom is provided, returns the map width in pixels for a given zoom\n\t // Else, provides fixed scale value\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom >= 0) {\n\t return 256 * Math.pow(2, zoom);\n\t // Else, return fixed scale value to expand projected coordinates from\n\t // their 0 to 1 range into something more practical\n\t } else {\n\t return this.scaleFactor;\n\t }\n\t },\n\t\n\t // Returns zoom level for a given scale value\n\t // This only works with a scale value that is based on map pixel width\n\t zoom: function zoom(scale) {\n\t return Math.log(scale / 256) / Math.LN2;\n\t },\n\t\n\t // Returns the bounds of the world in projected coords if applicable\n\t getProjectedBounds: function getProjectedBounds(zoom) {\n\t if (this.infinite) {\n\t return null;\n\t }\n\t\n\t var b = this.projection.bounds;\n\t var s = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t s /= 2;\n\t }\n\t\n\t // Bottom left\n\t var min = this.transformation.transform((0, _Point2['default'])(b[0]), s);\n\t\n\t // Top right\n\t var max = this.transformation.transform((0, _Point2['default'])(b[1]), s);\n\t\n\t return [min, max];\n\t },\n\t\n\t // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n\t // wrapLon: [min, max],\n\t // wrapLat: [min, max],\n\t\n\t // If true, the coordinate space will be unbounded (infinite in all directions)\n\t // infinite: false,\n\t\n\t // Wraps geo coords in certain ranges if applicable\n\t wrapLatLon: function wrapLatLon(latlon) {\n\t var lat = this.wrapLat ? (0, _utilWrapNum2['default'])(latlon.lat, this.wrapLat, true) : latlon.lat;\n\t var lon = this.wrapLon ? (0, _utilWrapNum2['default'])(latlon.lon, this.wrapLon, true) : latlon.lon;\n\t var alt = latlon.alt;\n\t\n\t return (0, _LatLon2['default'])(lat, lon, alt);\n\t }\n\t};\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * LatLon is a helper class for ensuring consistent geographic coordinates.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n\t */\n\t\n\tvar LatLon = (function () {\n\t function LatLon(lat, lon, alt) {\n\t _classCallCheck(this, LatLon);\n\t\n\t if (isNaN(lat) || isNaN(lon)) {\n\t throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n\t }\n\t\n\t this.lat = +lat;\n\t this.lon = +lon;\n\t\n\t if (alt !== undefined) {\n\t this.alt = +alt;\n\t }\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t //\n\t // Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n\t // Also converts between lng and lon\n\t\n\t _createClass(LatLon, [{\n\t key: 'clone',\n\t value: function clone() {\n\t return new LatLon(this.lat, this.lon, this.alt);\n\t }\n\t }]);\n\t\n\t return LatLon;\n\t})();\n\t\n\texports['default'] = function (a, b, c) {\n\t if (a instanceof LatLon) {\n\t return a;\n\t }\n\t if (Array.isArray(a) && typeof a[0] !== 'object') {\n\t if (a.length === 3) {\n\t return new LatLon(a[0], a[1], a[2]);\n\t }\n\t if (a.length === 2) {\n\t return new LatLon(a[0], a[1]);\n\t }\n\t return null;\n\t }\n\t if (a === undefined || a === null) {\n\t return a;\n\t }\n\t if (typeof a === 'object' && 'lat' in a) {\n\t return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n\t }\n\t if (b === undefined) {\n\t return null;\n\t }\n\t return new LatLon(a, b, c);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * Point is a helper class for ensuring consistent world positions.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n\t */\n\t\n\tvar Point = (function () {\n\t function Point(x, y, round) {\n\t _classCallCheck(this, Point);\n\t\n\t this.x = round ? Math.round(x) : x;\n\t this.y = round ? Math.round(y) : y;\n\t }\n\t\n\t // Accepts (point), ([x, y]) and (x, y, round)\n\t\n\t _createClass(Point, [{\n\t key: \"clone\",\n\t value: function clone() {\n\t return new Point(this.x, this.y);\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"add\",\n\t value: function add(point) {\n\t return this.clone()._add(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_add\",\n\t value: function _add(point) {\n\t this.x += point.x;\n\t this.y += point.y;\n\t return this;\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"subtract\",\n\t value: function subtract(point) {\n\t return this.clone()._subtract(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_subtract\",\n\t value: function _subtract(point) {\n\t this.x -= point.x;\n\t this.y -= point.y;\n\t return this;\n\t }\n\t }]);\n\t\n\t return Point;\n\t})();\n\t\n\tvar _point = function _point(x, y, round) {\n\t if (x instanceof Point) {\n\t return x;\n\t }\n\t if (Array.isArray(x)) {\n\t return new Point(x[0], x[1]);\n\t }\n\t if (x === undefined || x === null) {\n\t return x;\n\t }\n\t return new Point(x, y, round);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports[\"default\"] = _point;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/*\n\t * Wrap the given number to lie within a certain range (eg. longitude)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n\t */\n\t\n\tvar wrapNum = function wrapNum(x, range, includeMax) {\n\t var max = range[1];\n\t var min = range[0];\n\t var d = max - min;\n\t return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n\t};\n\t\n\texports[\"default\"] = wrapNum;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n\t * used by default.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar SphericalMercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t MAX_LATITUDE: 85.0511287798,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var max = this.MAX_LATITUDE;\n\t var lat = Math.max(Math.min(max, latlon.lat), -max);\n\t var sin = Math.sin(lat * d);\n\t\n\t return (0, _Point2['default'])(this.R * latlon.lon * d, this.R * Math.log((1 + sin) / (1 - sin)) / 2);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t\n\t return (0, _LatLon2['default'])((2 * Math.atan(Math.exp(point.y / this.R)) - Math.PI / 2) * d, point.x * d / this.R);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Accurate scale factor uses proper Web Mercator scaling\n\t // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t // See: http://jsfiddle.net/robhawkes/yws924cf/\n\t pointScale: function pointScale(latlon, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var k;\n\t\n\t if (!accurate) {\n\t k = 1 / Math.cos(latlon.lat * rad);\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t } else {\n\t var lat = latlon.lat * rad;\n\t var lon = latlon.lon * rad;\n\t\n\t var a = this.R;\n\t\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t\n\t var cosLat = Math.cos(lat);\n\t\n\t // Radius meridian\n\t var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\t\n\t // Radius prime meridian\n\t var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\t\n\t // Scale N/S\n\t var h = a / p / cosLat;\n\t\n\t // Scale E/W\n\t k = a / v / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, h];\n\t }\n\t },\n\t\n\t // Not using this.R due to scoping\n\t bounds: (function () {\n\t var d = 6378137 * Math.PI;\n\t return [[-d, -d], [d, d]];\n\t })()\n\t};\n\t\n\texports['default'] = SphericalMercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * Transformation is an utility class to perform simple point transformations\n\t * through a 2d-matrix.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n\t */\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar Transformation = (function () {\n\t function Transformation(a, b, c, d) {\n\t _classCallCheck(this, Transformation);\n\t\n\t this._a = a;\n\t this._b = b;\n\t this._c = c;\n\t this._d = d;\n\t }\n\t\n\t _createClass(Transformation, [{\n\t key: 'transform',\n\t value: function transform(point, scale) {\n\t // Copy input point as to not destroy the original data\n\t return this._transform(point.clone(), scale);\n\t }\n\t\n\t // Destructive transform (faster)\n\t }, {\n\t key: '_transform',\n\t value: function _transform(point, scale) {\n\t scale = scale || 1;\n\t\n\t point.x = scale * (this._a * point.x + this._b);\n\t point.y = scale * (this._c * point.y + this._d);\n\t return point;\n\t }\n\t }, {\n\t key: 'untransform',\n\t value: function untransform(point, scale) {\n\t scale = scale || 1;\n\t return (0, _geoPoint2['default'])((point.x / scale - this._b) / this._a, (point.y / scale - this._d) / this._c);\n\t }\n\t }]);\n\t\n\t return Transformation;\n\t})();\n\t\n\texports['default'] = Transformation;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionMercator = __webpack_require__(16);\n\t\n\tvar _projectionProjectionMercator2 = _interopRequireDefault(_projectionProjectionMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3395 = {\n\t code: 'EPSG:3395',\n\t projection: _projectionProjectionMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3395 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3395);\n\t\n\texports['default'] = EPSG3395;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Mercator projection that takes into account that the Earth is not a perfect\n\t * sphere. Less popular than spherical mercator; used by projections like\n\t * EPSG:3395.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Mercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t R_MINOR: 6356752.314245179,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var r = this.R;\n\t var y = latlon.lat * d;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var con = e * Math.sin(y);\n\t\n\t var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n\t y = -r * Math.log(Math.max(ts, 1E-10));\n\t\n\t return (0, _Point2['default'])(latlon.lon * d * r, y);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t var r = this.R;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var ts = Math.exp(-point.y / r);\n\t var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\t\n\t for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n\t con = e * Math.sin(phi);\n\t con = Math.pow((1 - con) / (1 + con), e / 2);\n\t dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n\t phi += dphi;\n\t }\n\t\n\t return (0, _LatLon2['default'])(phi * d, point.x * d / r);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t pointScale: function pointScale(latlon) {\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t var cosLat = Math.cos(lat);\n\t\n\t var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t },\n\t\n\t bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n\t};\n\t\n\texports['default'] = Mercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG4326 = {\n\t code: 'EPSG:4326',\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / 180,\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t //\n\t // TODO: Cannot use this.transformScale due to scope\n\t transformation: new _utilTransformation2['default'](1 / 180, 0, -1 / 180, 0)\n\t};\n\t\n\tvar EPSG4326 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG4326);\n\t\n\texports['default'] = EPSG4326;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n\t * and Simple.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar ProjectionLatLon = {\n\t project: function project(latlon) {\n\t return (0, _Point2['default'])(latlon.lon, latlon.lat);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t return (0, _LatLon2['default'])(point.y, point.x);\n\t },\n\t\n\t // Scale factor for converting between real metres and degrees\n\t //\n\t // degrees = realMetres * pointScale\n\t // realMetres = degrees / pointScale\n\t //\n\t // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n\t // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n\t pointScale: function pointScale(latlon) {\n\t var m1 = 111132.92;\n\t var m2 = -559.82;\n\t var m3 = 1.175;\n\t var m4 = -0.0023;\n\t var p1 = 111412.84;\n\t var p2 = -93.5;\n\t var p3 = 0.118;\n\t\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t\n\t var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n\t var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\t\n\t return [1 / latlen, 1 / lonlen];\n\t },\n\t\n\t bounds: [[-180, -90], [180, 90]]\n\t};\n\t\n\texports['default'] = ProjectionLatLon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n\t * maps.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Simple = {\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Straight 1:1 mapping (-1, -1 would be top-left)\n\t transformation: new _utilTransformation2['default'](1, 0, 1, 0),\n\t\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom) {\n\t return Math.pow(2, zoom);\n\t // Else, make no change to scale – may need to increase this or make it a\n\t // user-definable variable\n\t } else {\n\t return 1;\n\t }\n\t },\n\t\n\t zoom: function zoom(scale) {\n\t return Math.log(scale) / Math.LN2;\n\t },\n\t\n\t distance: function distance(latlon1, latlon2) {\n\t var dx = latlon2.lon - latlon1.lon;\n\t var dy = latlon2.lat - latlon1.lat;\n\t\n\t return Math.sqrt(dx * dx + dy * dy);\n\t },\n\t\n\t infinite: true\n\t};\n\t\n\tvar Simple = (0, _lodashAssign2['default'])({}, _CRS2['default'], _Simple);\n\t\n\texports['default'] = Simple;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Proj4 for any Proj4-supported CRS.\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionProj4 = __webpack_require__(21);\n\t\n\tvar _projectionProjectionProj42 = _interopRequireDefault(_projectionProjectionProj4);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Proj4 = function _Proj4(code, def, bounds) {\n\t var projection = (0, _projectionProjectionProj42['default'])(def, bounds);\n\t\n\t // Transformation calcuations\n\t var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n\t var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\t\n\t var halfX = diffX / 2;\n\t var halfY = diffY / 2;\n\t\n\t // This is the raw scale factor\n\t var scaleX = 1 / halfX;\n\t var scaleY = 1 / halfY;\n\t\n\t // Find the minimum scale factor\n\t //\n\t // The minimum scale factor comes from the largest side and is the one\n\t // you want to use for both axis so they stay relative in dimension\n\t var scale = Math.min(scaleX, scaleY);\n\t\n\t // Find amount to offset each axis by to make the central point lie on\n\t // the [0,0] origin\n\t var offsetX = scale * (projection.bounds[0][0] + halfX);\n\t var offsetY = scale * (projection.bounds[0][1] + halfY);\n\t\n\t return {\n\t code: code,\n\t projection: projection,\n\t\n\t transformScale: scale,\n\t\n\t // Map the input to a [-1,1] range with [0,0] in the centre\n\t transformation: new _utilTransformation2['default'](scale, -offsetX, -scale, offsetY)\n\t };\n\t};\n\t\n\tvar Proj4 = function Proj4(code, def, bounds) {\n\t return (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _Proj4(code, def, bounds));\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Proj4 support for any projection.\n\t */\n\t\n\tvar _proj4 = __webpack_require__(22);\n\t\n\tvar _proj42 = _interopRequireDefault(_proj4);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Proj4 = function Proj4(def, bounds) {\n\t var proj = (0, _proj42['default'])(def);\n\t\n\t var project = function project(latlon) {\n\t return (0, _Point2['default'])(proj.forward([latlon.lon, latlon.lat]));\n\t };\n\t\n\t var unproject = function unproject(point) {\n\t var inverse = proj.inverse([point.x, point.y]);\n\t return (0, _LatLon2['default'])(inverse[1], inverse[0]);\n\t };\n\t\n\t return {\n\t project: project,\n\t unproject: unproject,\n\t\n\t // Scale factor for converting between real metres and projected metres\\\n\t //\n\t // Need to work out the best way to provide the pointScale calculations\n\t // for custom, unknown projections (if wanting to override default)\n\t //\n\t // For now, user can manually override crs.pointScale or\n\t // crs.projection.pointScale\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t pointScale: function pointScale(latlon, accurate) {\n\t return [1, 1];\n\t },\n\t\n\t // Try and calculate bounds if none are provided\n\t //\n\t // This will provide incorrect bounds for some projections, so perhaps make\n\t // bounds a required input instead\n\t bounds: (function () {\n\t if (bounds) {\n\t return bounds;\n\t } else {\n\t var bottomLeft = project([-90, -180]);\n\t var topRight = project([90, 180]);\n\t\n\t return [bottomLeft, topRight];\n\t }\n\t })()\n\t };\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\tvar _Renderer = __webpack_require__(26);\n\t\n\tvar _Renderer2 = _interopRequireDefault(_Renderer);\n\t\n\tvar _Camera = __webpack_require__(27);\n\t\n\tvar _Camera2 = _interopRequireDefault(_Camera);\n\t\n\tvar Engine = (function (_EventEmitter) {\n\t _inherits(Engine, _EventEmitter);\n\t\n\t function Engine(container) {\n\t _classCallCheck(this, Engine);\n\t\n\t console.log('Init Engine');\n\t\n\t _get(Object.getPrototypeOf(Engine.prototype), 'constructor', this).call(this);\n\t\n\t this._scene = _Scene2['default'];\n\t this._renderer = (0, _Renderer2['default'])(container);\n\t this._camera = (0, _Camera2['default'])(container);\n\t this.clock = new _three2['default'].Clock();\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(Engine, [{\n\t key: 'update',\n\t value: function update(delta) {\n\t this.emit('preRender');\n\t this._renderer.render(this._scene, this._camera);\n\t this.emit('postRender');\n\t }\n\t }]);\n\t\n\t return Engine;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (container) {\n\t return new Engine(container);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can be imported from anywhere and will still reference the same scene,\n\t// though there is a helper reference in Engine.scene\n\t\n\texports['default'] = (function () {\n\t var scene = new _three2['default'].Scene();\n\t scene.fog = new _three2['default'].Fog(0xffffff, 1, 15000);\n\t return scene;\n\t})();\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\t// This can only be accessed from Engine.renderer if you want to reference the\n\t// same scene in multiple places\n\t\n\texports['default'] = function (container) {\n\t var renderer = new _three2['default'].WebGLRenderer({\n\t antialias: true\n\t });\n\t\n\t renderer.setClearColor(_Scene2['default'].fog.color, 1);\n\t\n\t // Gamma settings make things look nicer\n\t renderer.gammaInput = true;\n\t renderer.gammaOutput = true;\n\t\n\t container.appendChild(renderer.domElement);\n\t\n\t var updateSize = function updateSize() {\n\t renderer.setSize(container.clientWidth, container.clientHeight);\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return renderer;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can only be accessed from Engine.camera if you want to reference the\n\t// same scene in multiple places\n\t\n\t// TODO: Ensure that FOV looks natural on all aspect ratios\n\t// http://stackoverflow.com/q/26655930/997339\n\t\n\texports['default'] = function (container) {\n\t var camera = new _three2['default'].PerspectiveCamera(45, 1, 1, 40000);\n\t camera.position.y = 400;\n\t camera.position.z = 400;\n\t\n\t var updateSize = function updateSize() {\n\t camera.aspect = container.clientWidth / container.clientHeight;\n\t camera.updateProjectionMatrix();\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return camera;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _ControlsOrbit = __webpack_require__(29);\n\t\n\tvar _ControlsOrbit2 = _interopRequireDefault(_ControlsOrbit);\n\t\n\tvar Controls = {\n\t Orbit: _ControlsOrbit2['default']\n\t};\n\t\n\texports['default'] = Controls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _threeOrbitControls = __webpack_require__(30);\n\t\n\tvar _threeOrbitControls2 = _interopRequireDefault(_threeOrbitControls);\n\t\n\tvar _OrbitControls = (0, _threeOrbitControls2['default'])(_three2['default']);\n\t\n\tvar Orbit = (function (_EventEmitter) {\n\t _inherits(Orbit, _EventEmitter);\n\t\n\t function Orbit() {\n\t _classCallCheck(this, Orbit);\n\t\n\t _get(Object.getPrototypeOf(Orbit.prototype), 'constructor', this).call(this);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Proxy control events\n\t //\n\t // There's currently no distinction between pan, orbit and zoom events\n\t\n\t _createClass(Orbit, [{\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t var _this = this;\n\t\n\t this._controls.addEventListener('start', function (event) {\n\t _this._world.emit('controlsMoveStart', event.target.center);\n\t });\n\t\n\t this._controls.addEventListener('change', function (event) {\n\t _this._world.emit('controlsMove', event.target.center);\n\t });\n\t\n\t this._controls.addEventListener('end', function (event) {\n\t _this._world.emit('controlsMoveEnd', event.target.center);\n\t });\n\t }\n\t\n\t // Moving the camera along the [x,y,z] axis based on a target position\n\t }, {\n\t key: '_panTo',\n\t value: function _panTo(point, animate) {}\n\t }, {\n\t key: '_panBy',\n\t value: function _panBy(pointDelta, animate) {}\n\t\n\t // Zooming the camera in and out\n\t }, {\n\t key: '_zoomTo',\n\t value: function _zoomTo(metres, animate) {}\n\t }, {\n\t key: '_zoomBy',\n\t value: function _zoomBy(metresDelta, animate) {}\n\t\n\t // Force camera to look at something other than the target\n\t }, {\n\t key: '_lookAt',\n\t value: function _lookAt(point, animate) {}\n\t\n\t // Make camera look at the target\n\t }, {\n\t key: '_lookAtTarget',\n\t value: function _lookAtTarget() {}\n\t\n\t // Tilt (up and down)\n\t }, {\n\t key: '_tiltTo',\n\t value: function _tiltTo(angle, animate) {}\n\t }, {\n\t key: '_tiltBy',\n\t value: function _tiltBy(angleDelta, animate) {}\n\t\n\t // Rotate (left and right)\n\t }, {\n\t key: '_rotateTo',\n\t value: function _rotateTo(angle, animate) {}\n\t }, {\n\t key: '_rotateBy',\n\t value: function _rotateBy(angleDelta, animate) {}\n\t\n\t // Fly to the given point, animating pan and tilt/rotation to final position\n\t // with nice zoom out and in\n\t //\n\t // Calling flyTo a second time before the previous animation has completed\n\t // will immediately start the new animation from wherever the previous one\n\t // has got to\n\t }, {\n\t key: '_flyTo',\n\t value: function _flyTo(point, noZoom) {}\n\t\n\t // Proxy to OrbitControls.update()\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t this._controls.update();\n\t }\n\t\n\t // Add controls to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addControls(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addControls to actually add the controls\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t\n\t // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n\t // See: http://stackoverflow.com/a/26188674/997339\n\t this._controls = new _OrbitControls(world._engine._camera, world._container);\n\t\n\t // Disable keys for now as no events are fired for them anyway\n\t this._controls.keys = false;\n\t\n\t // 89 degrees\n\t this._controls.maxPolarAngle = 1.5533;\n\t\n\t // this._controls.enableDamping = true;\n\t // this._controls.dampingFactor = 0.25;\n\t\n\t this._initEvents();\n\t\n\t this.emit('added');\n\t }\n\t }]);\n\t\n\t return Orbit;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function () {\n\t return new Orbit();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 30 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(THREE) {\n\t\tvar MOUSE = THREE.MOUSE\n\t\tif (!MOUSE)\n\t\t\tMOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\t\n\t\t/**\n\t\t * @author qiao / https://github.com/qiao\n\t\t * @author mrdoob / http://mrdoob.com\n\t\t * @author alteredq / http://alteredqualia.com/\n\t\t * @author WestLangley / http://github.com/WestLangley\n\t\t * @author erich666 / http://erichaines.com\n\t\t */\n\t\t/*global THREE, console */\n\t\n\t\tfunction OrbitConstraint ( object ) {\n\t\n\t\t\tthis.object = object;\n\t\n\t\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\t\t// and where it pans with respect to.\n\t\t\tthis.target = new THREE.Vector3();\n\t\n\t\t\t// Limits to how far you can dolly in and out ( PerspectiveCamera only )\n\t\t\tthis.minDistance = 0;\n\t\t\tthis.maxDistance = Infinity;\n\t\n\t\t\t// Limits to how far you can zoom in and out ( OrthographicCamera only )\n\t\t\tthis.minZoom = 0;\n\t\t\tthis.maxZoom = Infinity;\n\t\n\t\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t\t// Range is 0 to Math.PI radians.\n\t\t\tthis.minPolarAngle = 0; // radians\n\t\t\tthis.maxPolarAngle = Math.PI; // radians\n\t\n\t\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\t\tthis.maxAzimuthAngle = Infinity; // radians\n\t\n\t\t\t// Set to true to enable damping (inertia)\n\t\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\t\tthis.enableDamping = false;\n\t\t\tthis.dampingFactor = 0.25;\n\t\n\t\t\t////////////\n\t\t\t// internals\n\t\n\t\t\tvar scope = this;\n\t\n\t\t\tvar EPS = 0.000001;\n\t\n\t\t\t// Current position in spherical coordinate system.\n\t\t\tvar theta;\n\t\t\tvar phi;\n\t\n\t\t\t// Pending changes\n\t\t\tvar phiDelta = 0;\n\t\t\tvar thetaDelta = 0;\n\t\t\tvar scale = 1;\n\t\t\tvar panOffset = new THREE.Vector3();\n\t\t\tvar zoomChanged = false;\n\t\n\t\t\t// API\n\t\n\t\t\tthis.getPolarAngle = function () {\n\t\n\t\t\t\treturn phi;\n\t\n\t\t\t};\n\t\n\t\t\tthis.getAzimuthalAngle = function () {\n\t\n\t\t\t\treturn theta;\n\t\n\t\t\t};\n\t\n\t\t\tthis.rotateLeft = function ( angle ) {\n\t\n\t\t\t\tthetaDelta -= angle;\n\t\n\t\t\t};\n\t\n\t\t\tthis.rotateUp = function ( angle ) {\n\t\n\t\t\t\tphiDelta -= angle;\n\t\n\t\t\t};\n\t\n\t\t\t// pass in distance in world space to move left\n\t\t\tthis.panLeft = function() {\n\t\n\t\t\t\tvar v = new THREE.Vector3();\n\t\n\t\t\t return function panLeft(distance) {\n\t\t\t var te = this.object.matrix.elements;\n\t\t\t var adjDist = distance / Math.cos(phi);\n\t\n\t\t\t v.set(te[ 0 ], 0, te[ 2 ]).normalize();\n\t\t\t v.multiplyScalar(-adjDist);\n\t\n\t\t\t panOffset.add(v);\n\t\t\t };\n\t\n\t\t\t}();\n\t\n\t\t\t// pass in distance in world space to move up\n\t\t\tthis.panUp = function() {\n\t\n\t\t\t\tvar v = new THREE.Vector3();\n\t\n\t\t\t return function panUp(distance) {\n\t\t\t var te = this.object.matrix.elements;\n\t\t\t var adjDist = distance / Math.cos(phi);\n\t\n\t\t\t v.set(te[ 8 ], 0, te[ 10 ]).normalize();\n\t\t\t v.multiplyScalar(-adjDist);\n\t\n\t\t\t panOffset.add(v);\n\t\t\t };\n\t\n\t\t\t}();\n\t\n\t\t\t// pass in x,y of change desired in pixel space,\n\t\t\t// right and down are positive\n\t\t\tthis.pan = function ( deltaX, deltaY, screenWidth, screenHeight ) {\n\t\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\t\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\tvar offset = position.clone().sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\t\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\t\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tscope.panLeft( 2 * deltaX * targetDistance / screenHeight );\n\t\t\t\t\tscope.panUp( 2 * deltaY * targetDistance / screenHeight );\n\t\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\t\n\t\t\t\t\t// orthographic\n\t\t\t\t\tscope.panLeft( deltaX * ( scope.object.right - scope.object.left ) / screenWidth );\n\t\t\t\t\tscope.panUp( deltaY * ( scope.object.top - scope.object.bottom ) / screenHeight );\n\t\n\t\t\t\t} else {\n\t\n\t\t\t\t\t// camera neither orthographic or perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\n\t\t\t\t}\n\t\n\t\t\t};\n\t\n\t\t\tthis.dollyIn = function ( dollyScale ) {\n\t\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\t\n\t\t\t\t\tscale /= dollyScale;\n\t\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\t\n\t\t\t\t\tscope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom * dollyScale ) );\n\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\tzoomChanged = true;\n\t\n\t\t\t\t} else {\n\t\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\n\t\t\t\t}\n\t\n\t\t\t};\n\t\n\t\t\tthis.dollyOut = function ( dollyScale ) {\n\t\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\t\n\t\t\t\t\tscale *= dollyScale;\n\t\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\t\n\t\t\t\t\tscope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / dollyScale ) );\n\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\tzoomChanged = true;\n\t\n\t\t\t\t} else {\n\t\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\n\t\t\t\t}\n\t\n\t\t\t};\n\t\n\t\t\tthis.update = function() {\n\t\n\t\t\t\tvar offset = new THREE.Vector3();\n\t\n\t\t\t\t// so camera.up is the orbit axis\n\t\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\t\tvar quatInverse = quat.clone().inverse();\n\t\n\t\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\t\n\t\t\t\treturn function () {\n\t\n\t\t\t\t\tvar position = this.object.position;\n\t\n\t\t\t\t\toffset.copy( position ).sub( this.target );\n\t\n\t\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\t\toffset.applyQuaternion( quat );\n\t\n\t\t\t\t\t// angle from z-axis around y-axis\n\t\n\t\t\t\t\ttheta = Math.atan2( offset.x, offset.z );\n\t\n\t\t\t\t\t// angle from y-axis\n\t\n\t\t\t\t\tphi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\t\n\t\t\t\t\ttheta += thetaDelta;\n\t\t\t\t\tphi += phiDelta;\n\t\n\t\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\t\ttheta = Math.max( this.minAzimuthAngle, Math.min( this.maxAzimuthAngle, theta ) );\n\t\n\t\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\t\tphi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) );\n\t\n\t\t\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\t\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\t\n\t\t\t\t\tvar radius = offset.length() * scale;\n\t\n\t\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\t\tradius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) );\n\t\n\t\t\t\t\t// move target to panned location\n\t\t\t\t\tthis.target.add( panOffset );\n\t\n\t\t\t\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\t\t\t\toffset.y = radius * Math.cos( phi );\n\t\t\t\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\t\n\t\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\t\toffset.applyQuaternion( quatInverse );\n\t\n\t\t\t\t\tposition.copy( this.target ).add( offset );\n\t\n\t\t\t\t\tthis.object.lookAt( this.target );\n\t\n\t\t\t\t\tif ( this.enableDamping === true ) {\n\t\n\t\t\t\t\t\tthetaDelta *= ( 1 - this.dampingFactor );\n\t\t\t\t\t\tphiDelta *= ( 1 - this.dampingFactor );\n\t\n\t\t\t\t\t} else {\n\t\n\t\t\t\t\t\tthetaDelta = 0;\n\t\t\t\t\t\tphiDelta = 0;\n\t\n\t\t\t\t\t}\n\t\n\t\t\t\t\tscale = 1;\n\t\t\t\t\tpanOffset.set( 0, 0, 0 );\n\t\n\t\t\t\t\t// update condition is:\n\t\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\n\t\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\t\t lastPosition.distanceToSquared( this.object.position ) > EPS ||\n\t\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( this.object.quaternion ) ) > EPS ) {\n\t\n\t\t\t\t\t\tlastPosition.copy( this.object.position );\n\t\t\t\t\t\tlastQuaternion.copy( this.object.quaternion );\n\t\t\t\t\t\tzoomChanged = false;\n\t\n\t\t\t\t\t\treturn true;\n\t\n\t\t\t\t\t}\n\t\n\t\t\t\t\treturn false;\n\t\n\t\t\t\t};\n\t\n\t\t\t}();\n\t\n\t\t};\n\t\n\t\n\t\t// This set of controls performs orbiting, dollying (zooming), and panning. It maintains\n\t\t// the \"up\" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is\n\t\t// supported.\n\t\t//\n\t\t// Orbit - left mouse / touch: one finger move\n\t\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t\t// Pan - right mouse, or arrow keys / touch: three finter swipe\n\t\n\t\tfunction OrbitControls ( object, domElement ) {\n\t\n\t\t\tvar constraint = new OrbitConstraint( object );\n\t\n\t\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\t\n\t\t\t// API\n\t\n\t\t\tObject.defineProperty( this, 'constraint', {\n\t\n\t\t\t\tget: function() {\n\t\n\t\t\t\t\treturn constraint;\n\t\n\t\t\t\t}\n\t\n\t\t\t} );\n\t\n\t\t\tthis.getPolarAngle = function () {\n\t\n\t\t\t\treturn constraint.getPolarAngle();\n\t\n\t\t\t};\n\t\n\t\t\tthis.getAzimuthalAngle = function () {\n\t\n\t\t\t\treturn constraint.getAzimuthalAngle();\n\t\n\t\t\t};\n\t\n\t\t\t// Set to false to disable this control\n\t\t\tthis.enabled = true;\n\t\n\t\t\t// center is old, deprecated; use \"target\" instead\n\t\t\tthis.center = this.target;\n\t\n\t\t\t// This option actually enables dollying in and out; left as \"zoom\" for\n\t\t\t// backwards compatibility.\n\t\t\t// Set to false to disable zooming\n\t\t\tthis.enableZoom = true;\n\t\t\tthis.zoomSpeed = 1.0;\n\t\n\t\t\t// Set to false to disable rotating\n\t\t\tthis.enableRotate = true;\n\t\t\tthis.rotateSpeed = 1.0;\n\t\n\t\t\t// Set to false to disable panning\n\t\t\tthis.enablePan = true;\n\t\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\t\n\t\t\t// Set to true to automatically rotate around the target\n\t\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\t\tthis.autoRotate = false;\n\t\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\t\n\t\t\t// Set to false to disable use of the keys\n\t\t\tthis.enableKeys = true;\n\t\n\t\t\t// The four arrow keys\n\t\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\t\n\t\t\t// Mouse buttons\n\t\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\t\n\t\t\t////////////\n\t\t\t// internals\n\t\n\t\t\tvar scope = this;\n\t\n\t\t\tvar rotateStart = new THREE.Vector2();\n\t\t\tvar rotateEnd = new THREE.Vector2();\n\t\t\tvar rotateDelta = new THREE.Vector2();\n\t\n\t\t\tvar panStart = new THREE.Vector2();\n\t\t\tvar panEnd = new THREE.Vector2();\n\t\t\tvar panDelta = new THREE.Vector2();\n\t\n\t\t\tvar dollyStart = new THREE.Vector2();\n\t\t\tvar dollyEnd = new THREE.Vector2();\n\t\t\tvar dollyDelta = new THREE.Vector2();\n\t\n\t\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\t\n\t\t\tvar state = STATE.NONE;\n\t\n\t\t\t// for reset\n\t\n\t\t\tthis.target0 = this.target.clone();\n\t\t\tthis.position0 = this.object.position.clone();\n\t\t\tthis.zoom0 = this.object.zoom;\n\t\n\t\t\t// events\n\t\n\t\t\tvar changeEvent = { type: 'change' };\n\t\t\tvar startEvent = { type: 'start' };\n\t\t\tvar endEvent = { type: 'end' };\n\t\n\t\t\t// pass in x,y of change desired in pixel space,\n\t\t\t// right and down are positive\n\t\t\tfunction pan( deltaX, deltaY ) {\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tconstraint.pan( deltaX, deltaY, element.clientWidth, element.clientHeight );\n\t\n\t\t\t}\n\t\n\t\t\tthis.update = function () {\n\t\n\t\t\t\tif ( this.autoRotate && state === STATE.NONE ) {\n\t\n\t\t\t\t\tconstraint.rotateLeft( getAutoRotationAngle() );\n\t\n\t\t\t\t}\n\t\n\t\t\t\tif ( constraint.update() === true ) {\n\t\n\t\t\t\t\tthis.dispatchEvent( changeEvent );\n\t\n\t\t\t\t}\n\t\n\t\t\t};\n\t\n\t\t\tthis.reset = function () {\n\t\n\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t\tthis.target.copy( this.target0 );\n\t\t\t\tthis.object.position.copy( this.position0 );\n\t\t\t\tthis.object.zoom = this.zoom0;\n\t\n\t\t\t\tthis.object.updateProjectionMatrix();\n\t\t\t\tthis.dispatchEvent( changeEvent );\n\t\n\t\t\t\tthis.update();\n\t\n\t\t\t};\n\t\n\t\t\tfunction getAutoRotationAngle() {\n\t\n\t\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\n\t\t\t}\n\t\n\t\t\tfunction getZoomScale() {\n\t\n\t\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\t\n\t\t\t}\n\t\n\t\t\tfunction onMouseDown( event ) {\n\t\n\t\t\t\tif ( scope.enabled === false ) return;\n\t\n\t\t\t\tevent.preventDefault();\n\t\n\t\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\t\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\n\t\t\t\t\trotateStart.set( event.clientX, event.clientY );\n\t\n\t\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\t\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\n\t\t\t\t\tdollyStart.set( event.clientX, event.clientY );\n\t\n\t\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\t\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\n\t\t\t\t\tstate = STATE.PAN;\n\t\n\t\t\t\t\tpanStart.set( event.clientX, event.clientY );\n\t\n\t\t\t\t}\n\t\n\t\t\t\tif ( state !== STATE.NONE ) {\n\t\n\t\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\t\t\tscope.dispatchEvent( startEvent );\n\t\n\t\t\t\t}\n\t\n\t\t\t}\n\t\n\t\t\tfunction onMouseMove( event ) {\n\t\n\t\t\t\tif ( scope.enabled === false ) return;\n\t\n\t\t\t\tevent.preventDefault();\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tif ( state === STATE.ROTATE ) {\n\t\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\n\t\t\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\t\n\t\t\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\t\t\tconstraint.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\t\n\t\t\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\t\t\tconstraint.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\t\n\t\t\t\t\trotateStart.copy( rotateEnd );\n\t\n\t\t\t\t} else if ( state === STATE.DOLLY ) {\n\t\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\n\t\t\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\t\t\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\t\n\t\t\t\t\tif ( dollyDelta.y > 0 ) {\n\t\n\t\t\t\t\t\tconstraint.dollyIn( getZoomScale() );\n\t\n\t\t\t\t\t} else if ( dollyDelta.y < 0 ) {\n\t\n\t\t\t\t\t\tconstraint.dollyOut( getZoomScale() );\n\t\n\t\t\t\t\t}\n\t\n\t\t\t\t\tdollyStart.copy( dollyEnd );\n\t\n\t\t\t\t} else if ( state === STATE.PAN ) {\n\t\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\n\t\t\t\t\tpanEnd.set( event.clientX, event.clientY );\n\t\t\t\t\tpanDelta.subVectors( panEnd, panStart );\n\t\n\t\t\t\t\tpan( panDelta.x, panDelta.y );\n\t\n\t\t\t\t\tpanStart.copy( panEnd );\n\t\n\t\t\t\t}\n\t\n\t\t\t\tif ( state !== STATE.NONE ) scope.update();\n\t\n\t\t\t}\n\t\n\t\t\tfunction onMouseUp( /* event */ ) {\n\t\n\t\t\t\tif ( scope.enabled === false ) return;\n\t\n\t\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\t\t\tscope.dispatchEvent( endEvent );\n\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\n\t\t\tfunction onMouseWheel( event ) {\n\t\n\t\t\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\t\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\n\t\t\t\tvar delta = 0;\n\t\n\t\t\t\tif ( event.wheelDelta !== undefined ) {\n\t\n\t\t\t\t\t// WebKit / Opera / Explorer 9\n\t\n\t\t\t\t\tdelta = event.wheelDelta;\n\t\n\t\t\t\t} else if ( event.detail !== undefined ) {\n\t\n\t\t\t\t\t// Firefox\n\t\n\t\t\t\t\tdelta = - event.detail;\n\t\n\t\t\t\t}\n\t\n\t\t\t\tif ( delta > 0 ) {\n\t\n\t\t\t\t\tconstraint.dollyOut( getZoomScale() );\n\t\n\t\t\t\t} else if ( delta < 0 ) {\n\t\n\t\t\t\t\tconstraint.dollyIn( getZoomScale() );\n\t\n\t\t\t\t}\n\t\n\t\t\t\tscope.update();\n\t\t\t\tscope.dispatchEvent( startEvent );\n\t\t\t\tscope.dispatchEvent( endEvent );\n\t\n\t\t\t}\n\t\n\t\t\tfunction onKeyDown( event ) {\n\t\n\t\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\t\n\t\t\t\tswitch ( event.keyCode ) {\n\t\n\t\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t}\n\t\n\t\t\t}\n\t\n\t\t\tfunction touchstart( event ) {\n\t\n\t\t\t\tif ( scope.enabled === false ) return;\n\t\n\t\t\t\tswitch ( event.touches.length ) {\n\t\n\t\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\t\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\n\t\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\n\t\t\t\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\t\n\t\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\n\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\n\t\t\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\t\t\t\t\t\tdollyStart.set( 0, distance );\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase 3: // three-fingered touch: pan\n\t\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\n\t\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\n\t\t\t\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tdefault:\n\t\n\t\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t\t}\n\t\n\t\t\t\tif ( state !== STATE.NONE ) scope.dispatchEvent( startEvent );\n\t\n\t\t\t}\n\t\n\t\t\tfunction touchmove( event ) {\n\t\n\t\t\t\tif ( scope.enabled === false ) return;\n\t\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tswitch ( event.touches.length ) {\n\t\n\t\t\t\t\tcase 1: // one-fingered touch: rotate\n\t\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return;\n\t\n\t\t\t\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\t\n\t\t\t\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\t\t\t\tconstraint.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\t\t\t\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\t\t\t\tconstraint.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\t\n\t\t\t\t\t\trotateStart.copy( rotateEnd );\n\t\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase 2: // two-fingered touch: dolly\n\t\n\t\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return;\n\t\n\t\t\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\t\n\t\t\t\t\t\tdollyEnd.set( 0, distance );\n\t\t\t\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\t\n\t\t\t\t\t\tif ( dollyDelta.y > 0 ) {\n\t\n\t\t\t\t\t\t\tconstraint.dollyOut( getZoomScale() );\n\t\n\t\t\t\t\t\t} else if ( dollyDelta.y < 0 ) {\n\t\n\t\t\t\t\t\t\tconstraint.dollyIn( getZoomScale() );\n\t\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tdollyStart.copy( dollyEnd );\n\t\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tcase 3: // three-fingered touch: pan\n\t\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return;\n\t\n\t\t\t\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\t\tpanDelta.subVectors( panEnd, panStart );\n\t\n\t\t\t\t\t\tpan( panDelta.x, panDelta.y );\n\t\n\t\t\t\t\t\tpanStart.copy( panEnd );\n\t\n\t\t\t\t\t\tscope.update();\n\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\tdefault:\n\t\n\t\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t\t}\n\t\n\t\t\t}\n\t\n\t\t\tfunction touchend( /* event */ ) {\n\t\n\t\t\t\tif ( scope.enabled === false ) return;\n\t\n\t\t\t\tscope.dispatchEvent( endEvent );\n\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\n\t\t\tfunction contextmenu( event ) {\n\t\n\t\t\t\tevent.preventDefault();\n\t\n\t\t\t}\n\t\n\t\t\tthis.dispose = function() {\n\t\n\t\t\t\tthis.domElement.removeEventListener( 'contextmenu', contextmenu, false );\n\t\t\t\tthis.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\t\tthis.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\t\t\tthis.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\t\n\t\t\t\tthis.domElement.removeEventListener( 'touchstart', touchstart, false );\n\t\t\t\tthis.domElement.removeEventListener( 'touchend', touchend, false );\n\t\t\t\tthis.domElement.removeEventListener( 'touchmove', touchmove, false );\n\t\n\t\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\n\t\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\t\n\t\t\t}\n\t\n\t\t\tthis.domElement.addEventListener( 'contextmenu', contextmenu, false );\n\t\n\t\t\tthis.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\t\tthis.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\t\t\tthis.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\t\n\t\t\tthis.domElement.addEventListener( 'touchstart', touchstart, false );\n\t\t\tthis.domElement.addEventListener( 'touchend', touchend, false );\n\t\t\tthis.domElement.addEventListener( 'touchmove', touchmove, false );\n\t\n\t\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\t\n\t\t\t// force an update at start\n\t\t\tthis.update();\n\t\n\t\t};\n\t\n\t\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\t\tOrbitControls.prototype.constructor = OrbitControls;\n\t\n\t\tObject.defineProperties( OrbitControls.prototype, {\n\t\n\t\t\tobject: {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.object;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\ttarget: {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.target;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: target is now immutable. Use target.set() instead.' );\n\t\t\t\t\tthis.constraint.target.copy( value );\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tminDistance : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.minDistance;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.minDistance = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tmaxDistance : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.maxDistance;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.maxDistance = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tminZoom : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.minZoom;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.minZoom = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tmaxZoom : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.maxZoom;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.maxZoom = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tminPolarAngle : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.minPolarAngle;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.minPolarAngle = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tmaxPolarAngle : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.maxPolarAngle;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.maxPolarAngle = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tminAzimuthAngle : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.minAzimuthAngle;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.minAzimuthAngle = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tmaxAzimuthAngle : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.maxAzimuthAngle;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.maxAzimuthAngle = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tenableDamping : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.enableDamping;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.enableDamping = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tdampingFactor : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\treturn this.constraint.dampingFactor;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tthis.constraint.dampingFactor = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\t// backward compatibility\n\t\n\t\t\tnoZoom: {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\t\treturn ! this.enableZoom;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\t\tthis.enableZoom = ! value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tnoRotate: {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\t\treturn ! this.enableRotate;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\t\tthis.enableRotate = ! value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tnoPan: {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\t\treturn ! this.enablePan;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\t\tthis.enablePan = ! value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tnoKeys: {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\t\treturn ! this.enableKeys;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\t\tthis.enableKeys = ! value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tstaticMoving : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\t\treturn ! this.constraint.enableDamping;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\t\tthis.constraint.enableDamping = ! value;\n\t\n\t\t\t\t}\n\t\n\t\t\t},\n\t\n\t\t\tdynamicDampingFactor : {\n\t\n\t\t\t\tget: function () {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\t\treturn this.constraint.dampingFactor;\n\t\n\t\t\t\t},\n\t\n\t\t\t\tset: function ( value ) {\n\t\n\t\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\t\tthis.constraint.dampingFactor = value;\n\t\n\t\t\t\t}\n\t\n\t\t\t}\n\t\n\t\t} );\n\t\n\t\treturn OrbitControls;\n\t}\n\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar EnvironmentLayer = (function (_Layer) {\n\t _inherits(EnvironmentLayer, _Layer);\n\t\n\t function EnvironmentLayer() {\n\t _classCallCheck(this, EnvironmentLayer);\n\t\n\t _get(Object.getPrototypeOf(EnvironmentLayer.prototype), 'constructor', this).call(this);\n\t\n\t this._initLights();\n\t // this._initGrid();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(EnvironmentLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd() {}\n\t\n\t // Not fleshed out or thought through yet\n\t //\n\t // Lights could potentially be put it their own 'layer' to keep this class\n\t // much simpler and less messy\n\t }, {\n\t key: '_initLights',\n\t value: function _initLights() {\n\t // Position doesn't really matter (the angle is important), however it's\n\t // used here so the helpers look more natural.\n\t\n\t var directionalLight = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight.intesity = 0.1;\n\t directionalLight.position.x = 100;\n\t directionalLight.position.y = 100;\n\t directionalLight.position.z = 100;\n\t\n\t var directionalLight2 = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight2.intesity = 0.1;\n\t directionalLight2.position.x = -100;\n\t directionalLight2.position.y = 100;\n\t directionalLight2.position.z = -100;\n\t\n\t var helper = new _three2['default'].DirectionalLightHelper(directionalLight, 10);\n\t var helper2 = new _three2['default'].DirectionalLightHelper(directionalLight2, 10);\n\t\n\t this._layer.add(directionalLight);\n\t this._layer.add(directionalLight2);\n\t\n\t this._layer.add(helper);\n\t this._layer.add(helper2);\n\t }\n\t\n\t // Add grid helper for context during initial development\n\t }, {\n\t key: '_initGrid',\n\t value: function _initGrid() {\n\t var size = 4000;\n\t var step = 100;\n\t\n\t var gridHelper = new _three2['default'].GridHelper(size, step);\n\t this._layer.add(gridHelper);\n\t }\n\t }]);\n\t\n\t return EnvironmentLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = function () {\n\t return new EnvironmentLayer();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _engineScene = __webpack_require__(25);\n\t\n\tvar _engineScene2 = _interopRequireDefault(_engineScene);\n\t\n\tvar Layer = (function (_EventEmitter) {\n\t _inherits(Layer, _EventEmitter);\n\t\n\t function Layer() {\n\t _classCallCheck(this, Layer);\n\t\n\t _get(Object.getPrototypeOf(Layer.prototype), 'constructor', this).call(this);\n\t\n\t this._layer = new _three2['default'].Object3D();\n\t }\n\t\n\t // Add layer to world instance and store world reference\n\t\n\t _createClass(Layer, [{\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addLayer(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addLayer to actually add the layer\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t this._onAdd(world);\n\t this.emit('added');\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world = null;\n\t this._layer = null;\n\t }\n\t }]);\n\t\n\t return Layer;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = Layer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _TileLayer2 = __webpack_require__(34);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _ImageTile = __webpack_require__(44);\n\t\n\tvar _ImageTile2 = _interopRequireDefault(_ImageTile);\n\t\n\tvar _ImageTileLayerBaseMaterial = __webpack_require__(47);\n\t\n\tvar _ImageTileLayerBaseMaterial2 = _interopRequireDefault(_ImageTileLayerBaseMaterial);\n\t\n\tvar _lodashThrottle = __webpack_require__(48);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n\t// being removed and the new tiles being ready for display\n\t//\n\t// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n\t// of the basemap ground so it blends in a little more, or have a huge ground\n\t// plane underneath all the tiles that shows through between tile updates.\n\t//\n\t// Could keep the old tiles around until the new ones are ready, though they'd\n\t// probably need to be layered in a way so the old tiles don't overlap new ones,\n\t// which is similar to how Leaflet approaches this (it has 2 layers)\n\t//\n\t// Could keep the tile from the previous quadtree level visible until all 4\n\t// tiles at the new / current level have finished loading and are displayed.\n\t// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n\t// child quadcodes showing whether they are loaded and in view. If all true then\n\t// remove the parent tile, otherwise keep it on a lower layer.\n\t\n\t// TODO: Load and display a base layer separate to the LOD grid that is at a low\n\t// resolution – used as a backup / background to fill in empty areas / distance\n\t\n\t// DONE: Fix the issue where some tiles just don't load, or at least the texture\n\t// never shows up – tends to happen if you quickly zoom in / out past it while\n\t// it's still loading, leaving a blank space\n\t\n\t// TODO: Optimise the request of many image tiles – look at how Leaflet and\n\t// OpenWebGlobe approach this (eg. batching, queues, etc)\n\t\n\t// TODO: Cancel pending tile requests if they get removed from view before they\n\t// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n\t// images are re-requested when the tile is next in scene (even if from cache)\n\t\n\tvar ImageTileLayer = (function (_TileLayer) {\n\t _inherits(ImageTileLayer, _TileLayer);\n\t\n\t function ImageTileLayer(path, options) {\n\t _classCallCheck(this, ImageTileLayer);\n\t\n\t // Cache 1000 tiles\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'constructor', this).call(this, 1000);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(ImageTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t this._initEvents();\n\t\n\t // Add base layer\n\t var geom = new _three2['default'].PlaneBufferGeometry(40000, 40000, 1);\n\t var mesh = new _three2['default'].Mesh(geom, (0, _ImageTileLayerBaseMaterial2['default'])('#f5f5f3'));\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t this._baseLayer = mesh;\n\t this._layer.add(mesh);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_moveBaseLayer',\n\t value: function _moveBaseLayer(point) {\n\t this._baseLayer.position.x = point.x;\n\t this._baseLayer.position.z = point.y;\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t return (0, _ImageTile2['default'])(quadcode, this._path, layer);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Dispose of mesh and materials\n\t this._baseLayer.geometry.dispose();\n\t this._baseLayer.geometry = null;\n\t\n\t if (this._baseLayer.material.map) {\n\t this._baseLayer.material.map.dispose();\n\t this._baseLayer.material.map = null;\n\t }\n\t\n\t this._baseLayer.material.dispose();\n\t this._baseLayer.material = null;\n\t\n\t this._baseLayer = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return ImageTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new ImageTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _TileCache = __webpack_require__(35);\n\t\n\tvar _TileCache2 = _interopRequireDefault(_TileCache);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// DONE: Prevent tiles from being loaded if they are further than a certain\n\t// distance from the camera and are unlikely to be seen anyway\n\t\n\t// TODO: Avoid performing LOD calculation when it isn't required. For example,\n\t// when nothing has changed since the last frame and there are no tiles to be\n\t// loaded or in need of rendering\n\t\n\t// TODO: Only remove tiles from the layer that aren't to be rendered in the\n\t// current frame – it seems excessive to remove all tiles and re-add them on\n\t// every single frame, even if it's just array manipulation\n\t\n\t// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n\t// problems (eg. making min above 5 causes all sorts of issues)\n\t\n\t// TODO: Reuse THREE objects where possible instead of creating new instances\n\t// on every LOD calculation\n\t\n\t// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n\t// to avoid creating unnecessary memory for garbage collection\n\t\n\t// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n\t// closest to the camera) so visual inconsistancies during loading are minimised\n\t\n\tvar TileLayer = (function (_Layer) {\n\t _inherits(TileLayer, _Layer);\n\t\n\t function TileLayer(maxCache) {\n\t var _this = this;\n\t\n\t _classCallCheck(this, TileLayer);\n\t\n\t _get(Object.getPrototypeOf(TileLayer.prototype), 'constructor', this).call(this);\n\t\n\t this._tileCache = (0, _TileCache2['default'])(maxCache, function (tile) {\n\t _this._destroyTile(tile);\n\t });\n\t\n\t // TODO: Work out why changing the minLOD causes loads of issues\n\t this._minLOD = 3;\n\t this._maxLOD = 18;\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t this._tiles = new _three2['default'].Object3D();\n\t }\n\t\n\t _createClass(TileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t this._layer.add(this._tiles);\n\t }\n\t }, {\n\t key: '_updateFrustum',\n\t value: function _updateFrustum() {\n\t var camera = this._world.getCamera();\n\t var projScreenMatrix = new _three2['default'].Matrix4();\n\t projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\n\t this._frustum.setFromMatrix(camera.projectionMatrix);\n\t this._frustum.setFromMatrix(new _three2['default'].Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n\t }\n\t }, {\n\t key: '_tileInFrustum',\n\t value: function _tileInFrustum(tile) {\n\t var bounds = tile.getBounds();\n\t return this._frustum.intersectsBox(new _three2['default'].Box3(new _three2['default'].Vector3(bounds[0], 0, bounds[3]), new _three2['default'].Vector3(bounds[2], 0, bounds[1])));\n\t }\n\t }, {\n\t key: '_calculateLOD',\n\t value: function _calculateLOD() {\n\t var _this2 = this;\n\t\n\t if (this._stop || !this._world) {\n\t return;\n\t }\n\t\n\t // var start = performance.now();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // 1. Update and retrieve camera frustum\n\t this._updateFrustum(this._frustum, camera);\n\t\n\t // 2. Add the four root items of the quadtree to a check list\n\t var checkList = this._checklist;\n\t checkList = [];\n\t checkList.push(this._requestTile('0', this));\n\t checkList.push(this._requestTile('1', this));\n\t checkList.push(this._requestTile('2', this));\n\t checkList.push(this._requestTile('3', this));\n\t\n\t // 3. Call Divide, passing in the check list\n\t this._divide(checkList);\n\t\n\t // 4. Remove all tiles from layer\n\t this._removeTiles();\n\t\n\t // 5. Render the tiles remaining in the check list\n\t checkList.forEach(function (tile, index) {\n\t // Skip tile if it's not in the current view frustum\n\t if (!_this2._tileInFrustum(tile)) {\n\t return;\n\t }\n\t\n\t // // TODO: Can probably speed this up\n\t // var center = tile.getCenter();\n\t // var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\t\n\t // Manual distance limit to cut down on tiles so far away\n\t // if (dist > 8000) {\n\t // return;\n\t // }\n\t\n\t // Does the tile have a mesh?\n\t //\n\t // If yes, continue\n\t // If no, generate tile mesh, request texture and skip\n\t if (!tile.getMesh()) {\n\t tile.requestTileAsync();\n\t return;\n\t }\n\t\n\t // Are the mesh and texture ready?\n\t //\n\t // If yes, continue\n\t // If no, skip\n\t if (!tile.isReady()) {\n\t return;\n\t }\n\t\n\t // Add tile to layer (and to scene)\n\t _this2._tiles.add(tile.getMesh());\n\t });\n\t\n\t // console.log(performance.now() - start);\n\t }\n\t }, {\n\t key: '_divide',\n\t value: function _divide(checkList) {\n\t var count = 0;\n\t var currentItem;\n\t var quadcode;\n\t\n\t // 1. Loop until count equals check list length\n\t while (count != checkList.length) {\n\t currentItem = checkList[count];\n\t quadcode = currentItem.getQuadcode();\n\t\n\t // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n\t if (currentItem.length === this._maxLOD) {\n\t count++;\n\t continue;\n\t }\n\t\n\t // 3. Else, calculate screen-space error metric for quadcode\n\t if (this._screenSpaceError(currentItem)) {\n\t // 4. If error is sufficient...\n\t\n\t // 4a. Remove parent item from the check list\n\t checkList.splice(count, 1);\n\t\n\t // 4b. Add 4 child items to the check list\n\t checkList.push(this._requestTile(quadcode + '0', this));\n\t checkList.push(this._requestTile(quadcode + '1', this));\n\t checkList.push(this._requestTile(quadcode + '2', this));\n\t checkList.push(this._requestTile(quadcode + '3', this));\n\t\n\t // 4d. Continue the loop without increasing count\n\t continue;\n\t } else {\n\t // 5. Else, increase count and continue loop\n\t count++;\n\t }\n\t }\n\t }\n\t }, {\n\t key: '_screenSpaceError',\n\t value: function _screenSpaceError(tile) {\n\t var minDepth = this._minLOD;\n\t var maxDepth = this._maxLOD;\n\t\n\t var quadcode = tile.getQuadcode();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // Tweak this value to refine specific point that each quad is subdivided\n\t //\n\t // It's used to multiple the dimensions of the tile sides before\n\t // comparing against the tile distance from camera\n\t var quality = 3.0;\n\t\n\t // 1. Return false if quadcode length is greater than maxDepth\n\t if (quadcode.length > maxDepth) {\n\t return false;\n\t }\n\t\n\t // 2. Return true if quadcode length is less than minDepth\n\t if (quadcode.length < minDepth) {\n\t return true;\n\t }\n\t\n\t // 3. Return false if quadcode bounds are not in view frustum\n\t if (!this._tileInFrustum(tile)) {\n\t return false;\n\t }\n\t\n\t var center = tile.getCenter();\n\t\n\t // 4. Calculate screen-space error metric\n\t // TODO: Use closest distance to one of the 4 tile corners\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t var error = quality * tile.getSide() / dist;\n\t\n\t // 5. Return true if error is greater than 1.0, else return false\n\t return error > 1.0;\n\t }\n\t }, {\n\t key: '_removeTiles',\n\t value: function _removeTiles() {\n\t for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t }\n\t\n\t // Return a new tile instance\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {}\n\t\n\t // Get a cached tile or request a new one if not in cache\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile(quadcode, layer) {\n\t var tile = this._tileCache.getTile(quadcode);\n\t\n\t if (!tile) {\n\t // Set up a brand new tile\n\t tile = this._createTile(quadcode, layer);\n\t\n\t // Add tile to cache, though it won't be ready yet as the data is being\n\t // requested from various places asynchronously\n\t this._tileCache.setTile(quadcode, tile);\n\t }\n\t\n\t return tile;\n\t }\n\t }, {\n\t key: '_destroyTile',\n\t value: function _destroyTile(tile) {\n\t // Remove tile from scene\n\t this._layer.remove(tile);\n\t\n\t // Delete any references to the tile within this component\n\t\n\t // Call destory on tile instance\n\t tile.destroy();\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t var i;\n\t\n\t // Remove all tiles\n\t for (i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t\n\t // Remove everything else in the layer\n\t for (i = this._layer.children.length - 1; i >= 0; i--) {\n\t this._layer.remove(this._layer.children[i]);\n\t }\n\t\n\t this._tileCache.destroy();\n\t this._tileCache = null;\n\t\n\t this._world = null;\n\t this._tiles = null;\n\t this._layer = null;\n\t this._frustum = null;\n\t }\n\t }]);\n\t\n\t return TileLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = TileLayer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _lruCache = __webpack_require__(36);\n\t\n\tvar _lruCache2 = _interopRequireDefault(_lruCache);\n\t\n\t// This process is based on a similar approach taken by OpenWebGlobe\n\t// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\t\n\tvar TileCache = (function () {\n\t function TileCache(cacheLimit, onDestroyTile) {\n\t _classCallCheck(this, TileCache);\n\t\n\t this._cache = (0, _lruCache2['default'])({\n\t max: cacheLimit,\n\t dispose: function dispose(key, tile) {\n\t onDestroyTile(tile);\n\t }\n\t });\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Returns true if all specified tile providers are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(TileCache, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return false;\n\t }\n\t\n\t // Get a cached tile without requesting a new one\n\t }, {\n\t key: 'getTile',\n\t value: function getTile(quadcode) {\n\t return this._cache.get(quadcode);\n\t }\n\t\n\t // Add tile to cache\n\t }, {\n\t key: 'setTile',\n\t value: function setTile(quadcode, tile) {\n\t this._cache.set(quadcode, tile);\n\t }\n\t\n\t // Destroy the cache and remove it from memory\n\t //\n\t // TODO: Call destroy method on items in cache\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cache.reset();\n\t this._cache = null;\n\t }\n\t }]);\n\t\n\t return TileCache;\n\t})();\n\t\n\texports['default'] = function (cacheLimit, onDestroyTile) {\n\t return new TileCache(cacheLimit, onDestroyTile);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = LRUCache\n\t\n\t// This will be a proper iterable 'Map' in engines that support it,\n\t// or a fakey-fake PseudoMap in older versions.\n\tvar Map = __webpack_require__(37)\n\tvar util = __webpack_require__(40)\n\t\n\t// A linked list to keep track of recently-used-ness\n\tvar Yallist = __webpack_require__(43)\n\t\n\t// use symbols if possible, otherwise just _props\n\tvar symbols = {}\n\tvar hasSymbol = typeof Symbol === 'function'\n\tvar makeSymbol\n\tif (hasSymbol) {\n\t makeSymbol = function (key) {\n\t return Symbol.for(key)\n\t }\n\t} else {\n\t makeSymbol = function (key) {\n\t return '_' + key\n\t }\n\t}\n\t\n\tfunction priv (obj, key, val) {\n\t var sym\n\t if (symbols[key]) {\n\t sym = symbols[key]\n\t } else {\n\t sym = makeSymbol(key)\n\t symbols[key] = sym\n\t }\n\t if (arguments.length === 2) {\n\t return obj[sym]\n\t } else {\n\t obj[sym] = val\n\t return val\n\t }\n\t}\n\t\n\tfunction naiveLength () { return 1 }\n\t\n\t// lruList is a yallist where the head is the youngest\n\t// item, and the tail is the oldest. the list contains the Hit\n\t// objects as the entries.\n\t// Each Hit object has a reference to its Yallist.Node. This\n\t// never changes.\n\t//\n\t// cache is a Map (or PseudoMap) that matches the keys to\n\t// the Yallist.Node object.\n\tfunction LRUCache (options) {\n\t if (!(this instanceof LRUCache)) {\n\t return new LRUCache(options)\n\t }\n\t\n\t if (typeof options === 'number') {\n\t options = { max: options }\n\t }\n\t\n\t if (!options) {\n\t options = {}\n\t }\n\t\n\t var max = priv(this, 'max', options.max)\n\t // Kind of weird to have a default max of Infinity, but oh well.\n\t if (!max ||\n\t !(typeof max === 'number') ||\n\t max <= 0) {\n\t priv(this, 'max', Infinity)\n\t }\n\t\n\t var lc = options.length || naiveLength\n\t if (typeof lc !== 'function') {\n\t lc = naiveLength\n\t }\n\t priv(this, 'lengthCalculator', lc)\n\t\n\t priv(this, 'allowStale', options.stale || false)\n\t priv(this, 'maxAge', options.maxAge || 0)\n\t priv(this, 'dispose', options.dispose)\n\t this.reset()\n\t}\n\t\n\t// resize the cache when the max changes.\n\tObject.defineProperty(LRUCache.prototype, 'max', {\n\t set: function (mL) {\n\t if (!mL || !(typeof mL === 'number') || mL <= 0) {\n\t mL = Infinity\n\t }\n\t priv(this, 'max', mL)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'max')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'allowStale', {\n\t set: function (allowStale) {\n\t priv(this, 'allowStale', !!allowStale)\n\t },\n\t get: function () {\n\t return priv(this, 'allowStale')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'maxAge', {\n\t set: function (mA) {\n\t if (!mA || !(typeof mA === 'number') || mA < 0) {\n\t mA = 0\n\t }\n\t priv(this, 'maxAge', mA)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'maxAge')\n\t },\n\t enumerable: true\n\t})\n\t\n\t// resize the cache when the lengthCalculator changes.\n\tObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n\t set: function (lC) {\n\t if (typeof lC !== 'function') {\n\t lC = naiveLength\n\t }\n\t if (lC !== priv(this, 'lengthCalculator')) {\n\t priv(this, 'lengthCalculator', lC)\n\t priv(this, 'length', 0)\n\t priv(this, 'lruList').forEach(function (hit) {\n\t hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t }, this)\n\t }\n\t trim(this)\n\t },\n\t get: function () { return priv(this, 'lengthCalculator') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'length', {\n\t get: function () { return priv(this, 'length') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'itemCount', {\n\t get: function () { return priv(this, 'lruList').length },\n\t enumerable: true\n\t})\n\t\n\tLRUCache.prototype.rforEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n\t var prev = walker.prev\n\t forEachStep(this, fn, walker, thisp)\n\t walker = prev\n\t }\n\t}\n\t\n\tfunction forEachStep (self, fn, node, thisp) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) {\n\t hit = undefined\n\t }\n\t }\n\t if (hit) {\n\t fn.call(thisp, hit.value, hit.key, self)\n\t }\n\t}\n\t\n\tLRUCache.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').head; walker !== null;) {\n\t var next = walker.next\n\t forEachStep(this, fn, walker, thisp)\n\t walker = next\n\t }\n\t}\n\t\n\tLRUCache.prototype.keys = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.key\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.values = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.value\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.reset = function () {\n\t if (priv(this, 'dispose') &&\n\t priv(this, 'lruList') &&\n\t priv(this, 'lruList').length) {\n\t priv(this, 'lruList').forEach(function (hit) {\n\t priv(this, 'dispose').call(this, hit.key, hit.value)\n\t }, this)\n\t }\n\t\n\t priv(this, 'cache', new Map()) // hash of items by key\n\t priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n\t priv(this, 'length', 0) // length of items in the list\n\t}\n\t\n\tLRUCache.prototype.dump = function () {\n\t return priv(this, 'lruList').map(function (hit) {\n\t if (!isStale(this, hit)) {\n\t return {\n\t k: hit.key,\n\t v: hit.value,\n\t e: hit.now + (hit.maxAge || 0)\n\t }\n\t }\n\t }, this).toArray().filter(function (h) {\n\t return h\n\t })\n\t}\n\t\n\tLRUCache.prototype.dumpLru = function () {\n\t return priv(this, 'lruList')\n\t}\n\t\n\tLRUCache.prototype.inspect = function (n, opts) {\n\t var str = 'LRUCache {'\n\t var extras = false\n\t\n\t var as = priv(this, 'allowStale')\n\t if (as) {\n\t str += '\\n allowStale: true'\n\t extras = true\n\t }\n\t\n\t var max = priv(this, 'max')\n\t if (max && max !== Infinity) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n max: ' + util.inspect(max, opts)\n\t extras = true\n\t }\n\t\n\t var maxAge = priv(this, 'maxAge')\n\t if (maxAge) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n\t extras = true\n\t }\n\t\n\t var lc = priv(this, 'lengthCalculator')\n\t if (lc && lc !== naiveLength) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n\t extras = true\n\t }\n\t\n\t var didFirst = false\n\t priv(this, 'lruList').forEach(function (item) {\n\t if (didFirst) {\n\t str += ',\\n '\n\t } else {\n\t if (extras) {\n\t str += ',\\n'\n\t }\n\t didFirst = true\n\t str += '\\n '\n\t }\n\t var key = util.inspect(item.key).split('\\n').join('\\n ')\n\t var val = { value: item.value }\n\t if (item.maxAge !== maxAge) {\n\t val.maxAge = item.maxAge\n\t }\n\t if (lc !== naiveLength) {\n\t val.length = item.length\n\t }\n\t if (isStale(this, item)) {\n\t val.stale = true\n\t }\n\t\n\t val = util.inspect(val, opts).split('\\n').join('\\n ')\n\t str += key + ' => ' + val\n\t })\n\t\n\t if (didFirst || extras) {\n\t str += '\\n'\n\t }\n\t str += '}'\n\t\n\t return str\n\t}\n\t\n\tLRUCache.prototype.set = function (key, value, maxAge) {\n\t maxAge = maxAge || priv(this, 'maxAge')\n\t\n\t var now = maxAge ? Date.now() : 0\n\t var len = priv(this, 'lengthCalculator').call(this, value, key)\n\t\n\t if (priv(this, 'cache').has(key)) {\n\t if (len > priv(this, 'max')) {\n\t del(this, priv(this, 'cache').get(key))\n\t return false\n\t }\n\t\n\t var node = priv(this, 'cache').get(key)\n\t var item = node.value\n\t\n\t // dispose of the old one before overwriting\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, item.value)\n\t }\n\t\n\t item.now = now\n\t item.maxAge = maxAge\n\t item.value = value\n\t priv(this, 'length', priv(this, 'length') + (len - item.length))\n\t item.length = len\n\t this.get(key)\n\t trim(this)\n\t return true\n\t }\n\t\n\t var hit = new Entry(key, value, len, now, maxAge)\n\t\n\t // oversized objects fall out of cache automatically.\n\t if (hit.length > priv(this, 'max')) {\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, value)\n\t }\n\t return false\n\t }\n\t\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t priv(this, 'lruList').unshift(hit)\n\t priv(this, 'cache').set(key, priv(this, 'lruList').head)\n\t trim(this)\n\t return true\n\t}\n\t\n\tLRUCache.prototype.has = function (key) {\n\t if (!priv(this, 'cache').has(key)) return false\n\t var hit = priv(this, 'cache').get(key).value\n\t if (isStale(this, hit)) {\n\t return false\n\t }\n\t return true\n\t}\n\t\n\tLRUCache.prototype.get = function (key) {\n\t return get(this, key, true)\n\t}\n\t\n\tLRUCache.prototype.peek = function (key) {\n\t return get(this, key, false)\n\t}\n\t\n\tLRUCache.prototype.pop = function () {\n\t var node = priv(this, 'lruList').tail\n\t if (!node) return null\n\t del(this, node)\n\t return node.value\n\t}\n\t\n\tLRUCache.prototype.del = function (key) {\n\t del(this, priv(this, 'cache').get(key))\n\t}\n\t\n\tLRUCache.prototype.load = function (arr) {\n\t // reset the cache\n\t this.reset()\n\t\n\t var now = Date.now()\n\t // A previous serialized cache has the most recent items first\n\t for (var l = arr.length - 1; l >= 0; l--) {\n\t var hit = arr[l]\n\t var expiresAt = hit.e || 0\n\t if (expiresAt === 0) {\n\t // the item was created without expiration in a non aged cache\n\t this.set(hit.k, hit.v)\n\t } else {\n\t var maxAge = expiresAt - now\n\t // dont add already expired items\n\t if (maxAge > 0) {\n\t this.set(hit.k, hit.v, maxAge)\n\t }\n\t }\n\t }\n\t}\n\t\n\tLRUCache.prototype.prune = function () {\n\t var self = this\n\t priv(this, 'cache').forEach(function (value, key) {\n\t get(self, key, false)\n\t })\n\t}\n\t\n\tfunction get (self, key, doUse) {\n\t var node = priv(self, 'cache').get(key)\n\t if (node) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) hit = undefined\n\t } else {\n\t if (doUse) {\n\t priv(self, 'lruList').unshiftNode(node)\n\t }\n\t }\n\t if (hit) hit = hit.value\n\t }\n\t return hit\n\t}\n\t\n\tfunction isStale (self, hit) {\n\t if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n\t return false\n\t }\n\t var stale = false\n\t var diff = Date.now() - hit.now\n\t if (hit.maxAge) {\n\t stale = diff > hit.maxAge\n\t } else {\n\t stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n\t }\n\t return stale\n\t}\n\t\n\tfunction trim (self) {\n\t if (priv(self, 'length') > priv(self, 'max')) {\n\t for (var walker = priv(self, 'lruList').tail;\n\t priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n\t // We know that we're about to delete this one, and also\n\t // what the next least recently used key will be, so just\n\t // go ahead and set it now.\n\t var prev = walker.prev\n\t del(self, walker)\n\t walker = prev\n\t }\n\t }\n\t}\n\t\n\tfunction del (self, node) {\n\t if (node) {\n\t var hit = node.value\n\t if (priv(self, 'dispose')) {\n\t priv(self, 'dispose').call(this, hit.key, hit.value)\n\t }\n\t priv(self, 'length', priv(self, 'length') - hit.length)\n\t priv(self, 'cache').delete(hit.key)\n\t priv(self, 'lruList').removeNode(node)\n\t }\n\t}\n\t\n\t// classy, since V8 prefers predictable objects.\n\tfunction Entry (key, value, length, now, maxAge) {\n\t this.key = key\n\t this.value = value\n\t this.length = length\n\t this.now = now\n\t this.maxAge = maxAge || 0\n\t}\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {if (process.env.npm_package_name === 'pseudomap' &&\n\t process.env.npm_lifecycle_script === 'test')\n\t process.env.TEST_PSEUDOMAP = 'true'\n\t\n\tif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n\t module.exports = Map\n\t} else {\n\t module.exports = __webpack_require__(39)\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(38)))\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\t\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = setTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t clearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t setTimeout(drainQueue, 0);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty\n\t\n\tmodule.exports = PseudoMap\n\t\n\tfunction PseudoMap (set) {\n\t if (!(this instanceof PseudoMap)) // whyyyyyyy\n\t throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\t\n\t this.clear()\n\t\n\t if (set) {\n\t if ((set instanceof PseudoMap) ||\n\t (typeof Map === 'function' && set instanceof Map))\n\t set.forEach(function (value, key) {\n\t this.set(key, value)\n\t }, this)\n\t else if (Array.isArray(set))\n\t set.forEach(function (kv) {\n\t this.set(kv[0], kv[1])\n\t }, this)\n\t else\n\t throw new TypeError('invalid argument')\n\t }\n\t}\n\t\n\tPseudoMap.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t Object.keys(this._data).forEach(function (k) {\n\t if (k !== 'size')\n\t fn.call(thisp, this._data[k].value, this._data[k].key)\n\t }, this)\n\t}\n\t\n\tPseudoMap.prototype.has = function (k) {\n\t return !!find(this._data, k)\n\t}\n\t\n\tPseudoMap.prototype.get = function (k) {\n\t var res = find(this._data, k)\n\t return res && res.value\n\t}\n\t\n\tPseudoMap.prototype.set = function (k, v) {\n\t set(this._data, k, v)\n\t}\n\t\n\tPseudoMap.prototype.delete = function (k) {\n\t var res = find(this._data, k)\n\t if (res) {\n\t delete this._data[res._index]\n\t this._data.size--\n\t }\n\t}\n\t\n\tPseudoMap.prototype.clear = function () {\n\t var data = Object.create(null)\n\t data.size = 0\n\t\n\t Object.defineProperty(this, '_data', {\n\t value: data,\n\t enumerable: false,\n\t configurable: true,\n\t writable: false\n\t })\n\t}\n\t\n\tObject.defineProperty(PseudoMap.prototype, 'size', {\n\t get: function () {\n\t return this._data.size\n\t },\n\t set: function (n) {},\n\t enumerable: true,\n\t configurable: true\n\t})\n\t\n\tPseudoMap.prototype.values =\n\tPseudoMap.prototype.keys =\n\tPseudoMap.prototype.entries = function () {\n\t throw new Error('iterators are not implemented in this version')\n\t}\n\t\n\t// Either identical, or both NaN\n\tfunction same (a, b) {\n\t return a === b || a !== a && b !== b\n\t}\n\t\n\tfunction Entry (k, v, i) {\n\t this.key = k\n\t this.value = v\n\t this._index = i\n\t}\n\t\n\tfunction find (data, k) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k))\n\t return data[key]\n\t }\n\t}\n\t\n\tfunction set (data, k, v) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k)) {\n\t data[key].value = v\n\t return\n\t }\n\t }\n\t data.size++\n\t data[key] = new Entry(k, v, key)\n\t}\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tvar formatRegExp = /%[sdj%]/g;\n\texports.format = function(f) {\n\t if (!isString(f)) {\n\t var objects = [];\n\t for (var i = 0; i < arguments.length; i++) {\n\t objects.push(inspect(arguments[i]));\n\t }\n\t return objects.join(' ');\n\t }\n\t\n\t var i = 1;\n\t var args = arguments;\n\t var len = args.length;\n\t var str = String(f).replace(formatRegExp, function(x) {\n\t if (x === '%%') return '%';\n\t if (i >= len) return x;\n\t switch (x) {\n\t case '%s': return String(args[i++]);\n\t case '%d': return Number(args[i++]);\n\t case '%j':\n\t try {\n\t return JSON.stringify(args[i++]);\n\t } catch (_) {\n\t return '[Circular]';\n\t }\n\t default:\n\t return x;\n\t }\n\t });\n\t for (var x = args[i]; i < len; x = args[++i]) {\n\t if (isNull(x) || !isObject(x)) {\n\t str += ' ' + x;\n\t } else {\n\t str += ' ' + inspect(x);\n\t }\n\t }\n\t return str;\n\t};\n\t\n\t\n\t// Mark that a method should not be used.\n\t// Returns a modified function which warns once by default.\n\t// If --no-deprecation is set, then it is a no-op.\n\texports.deprecate = function(fn, msg) {\n\t // Allow for deprecating things in the process of starting up.\n\t if (isUndefined(global.process)) {\n\t return function() {\n\t return exports.deprecate(fn, msg).apply(this, arguments);\n\t };\n\t }\n\t\n\t if (process.noDeprecation === true) {\n\t return fn;\n\t }\n\t\n\t var warned = false;\n\t function deprecated() {\n\t if (!warned) {\n\t if (process.throwDeprecation) {\n\t throw new Error(msg);\n\t } else if (process.traceDeprecation) {\n\t console.trace(msg);\n\t } else {\n\t console.error(msg);\n\t }\n\t warned = true;\n\t }\n\t return fn.apply(this, arguments);\n\t }\n\t\n\t return deprecated;\n\t};\n\t\n\t\n\tvar debugs = {};\n\tvar debugEnviron;\n\texports.debuglog = function(set) {\n\t if (isUndefined(debugEnviron))\n\t debugEnviron = process.env.NODE_DEBUG || '';\n\t set = set.toUpperCase();\n\t if (!debugs[set]) {\n\t if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n\t var pid = process.pid;\n\t debugs[set] = function() {\n\t var msg = exports.format.apply(exports, arguments);\n\t console.error('%s %d: %s', set, pid, msg);\n\t };\n\t } else {\n\t debugs[set] = function() {};\n\t }\n\t }\n\t return debugs[set];\n\t};\n\t\n\t\n\t/**\n\t * Echos the value of a value. Trys to print the value out\n\t * in the best way possible given the different types.\n\t *\n\t * @param {Object} obj The object to print out.\n\t * @param {Object} opts Optional options object that alters the output.\n\t */\n\t/* legacy: obj, showHidden, depth, colors*/\n\tfunction inspect(obj, opts) {\n\t // default options\n\t var ctx = {\n\t seen: [],\n\t stylize: stylizeNoColor\n\t };\n\t // legacy...\n\t if (arguments.length >= 3) ctx.depth = arguments[2];\n\t if (arguments.length >= 4) ctx.colors = arguments[3];\n\t if (isBoolean(opts)) {\n\t // legacy...\n\t ctx.showHidden = opts;\n\t } else if (opts) {\n\t // got an \"options\" object\n\t exports._extend(ctx, opts);\n\t }\n\t // set default options\n\t if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n\t if (isUndefined(ctx.depth)) ctx.depth = 2;\n\t if (isUndefined(ctx.colors)) ctx.colors = false;\n\t if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n\t if (ctx.colors) ctx.stylize = stylizeWithColor;\n\t return formatValue(ctx, obj, ctx.depth);\n\t}\n\texports.inspect = inspect;\n\t\n\t\n\t// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n\tinspect.colors = {\n\t 'bold' : [1, 22],\n\t 'italic' : [3, 23],\n\t 'underline' : [4, 24],\n\t 'inverse' : [7, 27],\n\t 'white' : [37, 39],\n\t 'grey' : [90, 39],\n\t 'black' : [30, 39],\n\t 'blue' : [34, 39],\n\t 'cyan' : [36, 39],\n\t 'green' : [32, 39],\n\t 'magenta' : [35, 39],\n\t 'red' : [31, 39],\n\t 'yellow' : [33, 39]\n\t};\n\t\n\t// Don't use 'blue' not visible on cmd.exe\n\tinspect.styles = {\n\t 'special': 'cyan',\n\t 'number': 'yellow',\n\t 'boolean': 'yellow',\n\t 'undefined': 'grey',\n\t 'null': 'bold',\n\t 'string': 'green',\n\t 'date': 'magenta',\n\t // \"name\": intentionally not styling\n\t 'regexp': 'red'\n\t};\n\t\n\t\n\tfunction stylizeWithColor(str, styleType) {\n\t var style = inspect.styles[styleType];\n\t\n\t if (style) {\n\t return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n\t '\\u001b[' + inspect.colors[style][1] + 'm';\n\t } else {\n\t return str;\n\t }\n\t}\n\t\n\t\n\tfunction stylizeNoColor(str, styleType) {\n\t return str;\n\t}\n\t\n\t\n\tfunction arrayToHash(array) {\n\t var hash = {};\n\t\n\t array.forEach(function(val, idx) {\n\t hash[val] = true;\n\t });\n\t\n\t return hash;\n\t}\n\t\n\t\n\tfunction formatValue(ctx, value, recurseTimes) {\n\t // Provide a hook for user-specified inspect functions.\n\t // Check that value is an object with an inspect function on it\n\t if (ctx.customInspect &&\n\t value &&\n\t isFunction(value.inspect) &&\n\t // Filter out the util module, it's inspect function is special\n\t value.inspect !== exports.inspect &&\n\t // Also filter out any prototype objects using the circular check.\n\t !(value.constructor && value.constructor.prototype === value)) {\n\t var ret = value.inspect(recurseTimes, ctx);\n\t if (!isString(ret)) {\n\t ret = formatValue(ctx, ret, recurseTimes);\n\t }\n\t return ret;\n\t }\n\t\n\t // Primitive types cannot have properties\n\t var primitive = formatPrimitive(ctx, value);\n\t if (primitive) {\n\t return primitive;\n\t }\n\t\n\t // Look up the keys of the object.\n\t var keys = Object.keys(value);\n\t var visibleKeys = arrayToHash(keys);\n\t\n\t if (ctx.showHidden) {\n\t keys = Object.getOwnPropertyNames(value);\n\t }\n\t\n\t // IE doesn't make error fields non-enumerable\n\t // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n\t if (isError(value)\n\t && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n\t return formatError(value);\n\t }\n\t\n\t // Some type of object without properties can be shortcutted.\n\t if (keys.length === 0) {\n\t if (isFunction(value)) {\n\t var name = value.name ? ': ' + value.name : '';\n\t return ctx.stylize('[Function' + name + ']', 'special');\n\t }\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t }\n\t if (isDate(value)) {\n\t return ctx.stylize(Date.prototype.toString.call(value), 'date');\n\t }\n\t if (isError(value)) {\n\t return formatError(value);\n\t }\n\t }\n\t\n\t var base = '', array = false, braces = ['{', '}'];\n\t\n\t // Make Array say that they are Array\n\t if (isArray(value)) {\n\t array = true;\n\t braces = ['[', ']'];\n\t }\n\t\n\t // Make functions say that they are functions\n\t if (isFunction(value)) {\n\t var n = value.name ? ': ' + value.name : '';\n\t base = ' [Function' + n + ']';\n\t }\n\t\n\t // Make RegExps say that they are RegExps\n\t if (isRegExp(value)) {\n\t base = ' ' + RegExp.prototype.toString.call(value);\n\t }\n\t\n\t // Make dates with properties first say the date\n\t if (isDate(value)) {\n\t base = ' ' + Date.prototype.toUTCString.call(value);\n\t }\n\t\n\t // Make error with message first say the error\n\t if (isError(value)) {\n\t base = ' ' + formatError(value);\n\t }\n\t\n\t if (keys.length === 0 && (!array || value.length == 0)) {\n\t return braces[0] + base + braces[1];\n\t }\n\t\n\t if (recurseTimes < 0) {\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t } else {\n\t return ctx.stylize('[Object]', 'special');\n\t }\n\t }\n\t\n\t ctx.seen.push(value);\n\t\n\t var output;\n\t if (array) {\n\t output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n\t } else {\n\t output = keys.map(function(key) {\n\t return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n\t });\n\t }\n\t\n\t ctx.seen.pop();\n\t\n\t return reduceToSingleString(output, base, braces);\n\t}\n\t\n\t\n\tfunction formatPrimitive(ctx, value) {\n\t if (isUndefined(value))\n\t return ctx.stylize('undefined', 'undefined');\n\t if (isString(value)) {\n\t var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n\t .replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"') + '\\'';\n\t return ctx.stylize(simple, 'string');\n\t }\n\t if (isNumber(value))\n\t return ctx.stylize('' + value, 'number');\n\t if (isBoolean(value))\n\t return ctx.stylize('' + value, 'boolean');\n\t // For some reason typeof null is \"object\", so special case here.\n\t if (isNull(value))\n\t return ctx.stylize('null', 'null');\n\t}\n\t\n\t\n\tfunction formatError(value) {\n\t return '[' + Error.prototype.toString.call(value) + ']';\n\t}\n\t\n\t\n\tfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n\t var output = [];\n\t for (var i = 0, l = value.length; i < l; ++i) {\n\t if (hasOwnProperty(value, String(i))) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t String(i), true));\n\t } else {\n\t output.push('');\n\t }\n\t }\n\t keys.forEach(function(key) {\n\t if (!key.match(/^\\d+$/)) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t key, true));\n\t }\n\t });\n\t return output;\n\t}\n\t\n\t\n\tfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n\t var name, str, desc;\n\t desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n\t if (desc.get) {\n\t if (desc.set) {\n\t str = ctx.stylize('[Getter/Setter]', 'special');\n\t } else {\n\t str = ctx.stylize('[Getter]', 'special');\n\t }\n\t } else {\n\t if (desc.set) {\n\t str = ctx.stylize('[Setter]', 'special');\n\t }\n\t }\n\t if (!hasOwnProperty(visibleKeys, key)) {\n\t name = '[' + key + ']';\n\t }\n\t if (!str) {\n\t if (ctx.seen.indexOf(desc.value) < 0) {\n\t if (isNull(recurseTimes)) {\n\t str = formatValue(ctx, desc.value, null);\n\t } else {\n\t str = formatValue(ctx, desc.value, recurseTimes - 1);\n\t }\n\t if (str.indexOf('\\n') > -1) {\n\t if (array) {\n\t str = str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n').substr(2);\n\t } else {\n\t str = '\\n' + str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n');\n\t }\n\t }\n\t } else {\n\t str = ctx.stylize('[Circular]', 'special');\n\t }\n\t }\n\t if (isUndefined(name)) {\n\t if (array && key.match(/^\\d+$/)) {\n\t return str;\n\t }\n\t name = JSON.stringify('' + key);\n\t if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n\t name = name.substr(1, name.length - 2);\n\t name = ctx.stylize(name, 'name');\n\t } else {\n\t name = name.replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"')\n\t .replace(/(^\"|\"$)/g, \"'\");\n\t name = ctx.stylize(name, 'string');\n\t }\n\t }\n\t\n\t return name + ': ' + str;\n\t}\n\t\n\t\n\tfunction reduceToSingleString(output, base, braces) {\n\t var numLinesEst = 0;\n\t var length = output.reduce(function(prev, cur) {\n\t numLinesEst++;\n\t if (cur.indexOf('\\n') >= 0) numLinesEst++;\n\t return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n\t }, 0);\n\t\n\t if (length > 60) {\n\t return braces[0] +\n\t (base === '' ? '' : base + '\\n ') +\n\t ' ' +\n\t output.join(',\\n ') +\n\t ' ' +\n\t braces[1];\n\t }\n\t\n\t return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n\t}\n\t\n\t\n\t// NOTE: These type checking functions intentionally don't use `instanceof`\n\t// because it is fragile and can be easily faked with `Object.create()`.\n\tfunction isArray(ar) {\n\t return Array.isArray(ar);\n\t}\n\texports.isArray = isArray;\n\t\n\tfunction isBoolean(arg) {\n\t return typeof arg === 'boolean';\n\t}\n\texports.isBoolean = isBoolean;\n\t\n\tfunction isNull(arg) {\n\t return arg === null;\n\t}\n\texports.isNull = isNull;\n\t\n\tfunction isNullOrUndefined(arg) {\n\t return arg == null;\n\t}\n\texports.isNullOrUndefined = isNullOrUndefined;\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\texports.isNumber = isNumber;\n\t\n\tfunction isString(arg) {\n\t return typeof arg === 'string';\n\t}\n\texports.isString = isString;\n\t\n\tfunction isSymbol(arg) {\n\t return typeof arg === 'symbol';\n\t}\n\texports.isSymbol = isSymbol;\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\texports.isUndefined = isUndefined;\n\t\n\tfunction isRegExp(re) {\n\t return isObject(re) && objectToString(re) === '[object RegExp]';\n\t}\n\texports.isRegExp = isRegExp;\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\texports.isObject = isObject;\n\t\n\tfunction isDate(d) {\n\t return isObject(d) && objectToString(d) === '[object Date]';\n\t}\n\texports.isDate = isDate;\n\t\n\tfunction isError(e) {\n\t return isObject(e) &&\n\t (objectToString(e) === '[object Error]' || e instanceof Error);\n\t}\n\texports.isError = isError;\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\texports.isFunction = isFunction;\n\t\n\tfunction isPrimitive(arg) {\n\t return arg === null ||\n\t typeof arg === 'boolean' ||\n\t typeof arg === 'number' ||\n\t typeof arg === 'string' ||\n\t typeof arg === 'symbol' || // ES6 symbol\n\t typeof arg === 'undefined';\n\t}\n\texports.isPrimitive = isPrimitive;\n\t\n\texports.isBuffer = __webpack_require__(41);\n\t\n\tfunction objectToString(o) {\n\t return Object.prototype.toString.call(o);\n\t}\n\t\n\t\n\tfunction pad(n) {\n\t return n < 10 ? '0' + n.toString(10) : n.toString(10);\n\t}\n\t\n\t\n\tvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n\t 'Oct', 'Nov', 'Dec'];\n\t\n\t// 26 Feb 16:19:34\n\tfunction timestamp() {\n\t var d = new Date();\n\t var time = [pad(d.getHours()),\n\t pad(d.getMinutes()),\n\t pad(d.getSeconds())].join(':');\n\t return [d.getDate(), months[d.getMonth()], time].join(' ');\n\t}\n\t\n\t\n\t// log is just a thin wrapper to console.log that prepends a timestamp\n\texports.log = function() {\n\t console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n\t};\n\t\n\t\n\t/**\n\t * Inherit the prototype methods from one constructor into another.\n\t *\n\t * The Function.prototype.inherits from lang.js rewritten as a standalone\n\t * function (not on Function.prototype). NOTE: If this file is to be loaded\n\t * during bootstrapping this function needs to be rewritten using some native\n\t * functions as prototype setup using normal JavaScript does not work as\n\t * expected during bootstrapping (see mirror.js in r114903).\n\t *\n\t * @param {function} ctor Constructor function which needs to inherit the\n\t * prototype.\n\t * @param {function} superCtor Constructor function to inherit prototype from.\n\t */\n\texports.inherits = __webpack_require__(42);\n\t\n\texports._extend = function(origin, add) {\n\t // Don't do anything if add isn't an object\n\t if (!add || !isObject(add)) return origin;\n\t\n\t var keys = Object.keys(add);\n\t var i = keys.length;\n\t while (i--) {\n\t origin[keys[i]] = add[keys[i]];\n\t }\n\t return origin;\n\t};\n\t\n\tfunction hasOwnProperty(obj, prop) {\n\t return Object.prototype.hasOwnProperty.call(obj, prop);\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(38)))\n\n/***/ },\n/* 41 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function isBuffer(arg) {\n\t return arg && typeof arg === 'object'\n\t && typeof arg.copy === 'function'\n\t && typeof arg.fill === 'function'\n\t && typeof arg.readUInt8 === 'function';\n\t}\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t // implementation from standard node.js 'util' module\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t ctor.prototype = Object.create(superCtor.prototype, {\n\t constructor: {\n\t value: ctor,\n\t enumerable: false,\n\t writable: true,\n\t configurable: true\n\t }\n\t });\n\t };\n\t} else {\n\t // old school shim for old browsers\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t var TempCtor = function () {}\n\t TempCtor.prototype = superCtor.prototype\n\t ctor.prototype = new TempCtor()\n\t ctor.prototype.constructor = ctor\n\t }\n\t}\n\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\tmodule.exports = Yallist\n\t\n\tYallist.Node = Node\n\tYallist.create = Yallist\n\t\n\tfunction Yallist (list) {\n\t var self = this\n\t if (!(self instanceof Yallist)) {\n\t self = new Yallist()\n\t }\n\t\n\t self.tail = null\n\t self.head = null\n\t self.length = 0\n\t\n\t if (list && typeof list.forEach === 'function') {\n\t list.forEach(function (item) {\n\t self.push(item)\n\t })\n\t } else if (arguments.length > 0) {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t self.push(arguments[i])\n\t }\n\t }\n\t\n\t return self\n\t}\n\t\n\tYallist.prototype.removeNode = function (node) {\n\t if (node.list !== this) {\n\t throw new Error('removing node which does not belong to this list')\n\t }\n\t\n\t var next = node.next\n\t var prev = node.prev\n\t\n\t if (next) {\n\t next.prev = prev\n\t }\n\t\n\t if (prev) {\n\t prev.next = next\n\t }\n\t\n\t if (node === this.head) {\n\t this.head = next\n\t }\n\t if (node === this.tail) {\n\t this.tail = prev\n\t }\n\t\n\t node.list.length --\n\t node.next = null\n\t node.prev = null\n\t node.list = null\n\t}\n\t\n\tYallist.prototype.unshiftNode = function (node) {\n\t if (node === this.head) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var head = this.head\n\t node.list = this\n\t node.next = head\n\t if (head) {\n\t head.prev = node\n\t }\n\t\n\t this.head = node\n\t if (!this.tail) {\n\t this.tail = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.pushNode = function (node) {\n\t if (node === this.tail) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var tail = this.tail\n\t node.list = this\n\t node.prev = tail\n\t if (tail) {\n\t tail.next = node\n\t }\n\t\n\t this.tail = node\n\t if (!this.head) {\n\t this.head = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.push = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t push(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.unshift = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t unshift(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.pop = function () {\n\t if (!this.tail)\n\t return undefined\n\t\n\t var res = this.tail.value\n\t this.tail = this.tail.prev\n\t this.tail.next = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.shift = function () {\n\t if (!this.head)\n\t return undefined\n\t\n\t var res = this.head.value\n\t this.head = this.head.next\n\t this.head.prev = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.head, i = 0; walker !== null; i++) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.next\n\t }\n\t}\n\t\n\tYallist.prototype.forEachReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.prev\n\t }\n\t}\n\t\n\tYallist.prototype.get = function (n) {\n\t for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.next\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.getReverse = function (n) {\n\t for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.prev\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.map = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.head; walker !== null; ) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.next\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.mapReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.tail; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.prev\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.reduce = function (fn, initial) {\n\t var acc\n\t var walker = this.head\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.head) {\n\t walker = this.head.next\n\t acc = this.head.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = 0; walker !== null; i++) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.next\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.reduceReverse = function (fn, initial) {\n\t var acc\n\t var walker = this.tail\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.tail) {\n\t walker = this.tail.prev\n\t acc = this.tail.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = this.length - 1; walker !== null; i--) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.prev\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.toArray = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.head; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.next\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.toArrayReverse = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.tail; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.prev\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.slice = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n\t walker = walker.next\n\t }\n\t for (; walker !== null && i < to; i++, walker = walker.next) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.sliceReverse = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n\t walker = walker.prev\n\t }\n\t for (; walker !== null && i > from; i--, walker = walker.prev) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.reverse = function () {\n\t var head = this.head\n\t var tail = this.tail\n\t for (var walker = head; walker !== null; walker = walker.prev) {\n\t var p = walker.prev\n\t walker.prev = walker.next\n\t walker.next = p\n\t }\n\t this.head = tail\n\t this.tail = head\n\t return this\n\t}\n\t\n\tfunction push (self, item) {\n\t self.tail = new Node(item, self.tail, null, self)\n\t if (!self.head) {\n\t self.head = self.tail\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction unshift (self, item) {\n\t self.head = new Node(item, null, self.head, self)\n\t if (!self.tail) {\n\t self.tail = self.head\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction Node (value, prev, next, list) {\n\t if (!(this instanceof Node)) {\n\t return new Node(value, prev, next, list)\n\t }\n\t\n\t this.list = list\n\t this.value = value\n\t\n\t if (prev) {\n\t prev.next = this\n\t this.prev = prev\n\t } else {\n\t this.prev = null\n\t }\n\t\n\t if (next) {\n\t next.prev = this\n\t this.next = next\n\t } else {\n\t this.next = null\n\t }\n\t}\n\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Tile2 = __webpack_require__(45);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(46);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar ImageTile = (function (_Tile) {\n\t _inherits(ImageTile, _Tile);\n\t\n\t function ImageTile(quadcode, path, layer) {\n\t _classCallCheck(this, ImageTile);\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the various tile provider\n\t\n\t _createClass(ImageTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTexture();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear image reference\n\t this._image = null;\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t depthWrite: false\n\t });\n\t\n\t var localMesh = new _three2['default'].Mesh(geom, material);\n\t localMesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t mesh.add(localMesh);\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t var box = new _vendorBoxHelper2['default'](localMesh);\n\t mesh.add(box);\n\t\n\t mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTexture',\n\t value: function _requestTexture() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t var image = document.createElement('img');\n\t\n\t image.addEventListener('load', function (event) {\n\t var texture = new _three2['default'].Texture();\n\t\n\t texture.image = image;\n\t texture.needsUpdate = true;\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t // Something went wrong and the tile or its material is missing\n\t //\n\t // Possibly removed by the cache before the image loaded\n\t if (!_this2._mesh || !_this2._mesh.children[0] || !_this2._mesh.children[0].material) {\n\t return;\n\t }\n\t\n\t _this2._mesh.children[0].material.map = texture;\n\t _this2._mesh.children[0].material.needsUpdate = true;\n\t\n\t _this2._texture = texture;\n\t _this2._ready = true;\n\t }, false);\n\t\n\t // image.addEventListener('progress', event => {}, false);\n\t // image.addEventListener('error', event => {}, false);\n\t\n\t image.crossOrigin = '';\n\t\n\t // Load image\n\t image.src = url;\n\t\n\t this._image = image;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._image) {\n\t return;\n\t }\n\t\n\t this._image.src = '';\n\t }\n\t }]);\n\t\n\t return ImageTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer) {\n\t return new ImageTile(quadcode, path, layer);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// Manages a single tile and its layers\n\t\n\tvar r2d = 180 / Math.PI;\n\t\n\tvar tileURLRegex = /\\{([szxy])\\}/g;\n\t\n\tvar Tile = (function () {\n\t function Tile(quadcode, path, layer) {\n\t _classCallCheck(this, Tile);\n\t\n\t this._layer = layer;\n\t this._quadcode = quadcode;\n\t this._path = path;\n\t\n\t this._ready = false;\n\t\n\t this._tile = this._quadcodeToTile(quadcode);\n\t\n\t // Bottom-left and top-right bounds in WGS84 coordinates\n\t this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\t\n\t // Bottom-left and top-right bounds in world coordinates\n\t this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\t\n\t // Tile center in world coordinates\n\t this._center = this._boundsToCenter(this._boundsWorld);\n\t\n\t // Length of a tile side in world coorindates\n\t this._side = this._getSide(this._boundsWorld);\n\t }\n\t\n\t // Returns true if the tile mesh and texture are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(Tile, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return this._ready;\n\t }\n\t\n\t // Request data for the tile\n\t }, {\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {}\n\t }, {\n\t key: 'getQuadcode',\n\t value: function getQuadcode() {\n\t return this._quadcode;\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {\n\t return this._boundsWorld;\n\t }\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t }, {\n\t key: 'getSide',\n\t value: function getSide() {\n\t return this._side;\n\t }\n\t }, {\n\t key: 'getMesh',\n\t value: function getMesh() {\n\t return this._mesh;\n\t }\n\t\n\t // Destroys the tile and removes it from the layer and memory\n\t //\n\t // Ensure that this leaves no trace of the tile – no textures, no meshes,\n\t // nothing in memory or the GPU\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Delete reference to layer\n\t this._layer = null;\n\t\n\t // Delete location references\n\t this._boundsLatLon = null;\n\t this._boundsWorld = null;\n\t this._center = null;\n\t\n\t // Done if no mesh\n\t if (!this._mesh) {\n\t return;\n\t }\n\t\n\t if (this._mesh.children) {\n\t // Dispose of mesh and materials\n\t this._mesh.children.forEach(function (child) {\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t });\n\t } else {\n\t this._mesh.geometry.dispose();\n\t this._mesh.geometry = null;\n\t\n\t if (this._mesh.material.map) {\n\t this._mesh.material.map.dispose();\n\t this._mesh.material.map = null;\n\t }\n\t\n\t this._mesh.material.dispose();\n\t this._mesh.material = null;\n\t }\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {}\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {}\n\t }, {\n\t key: '_getTileURL',\n\t value: function _getTileURL(urlParams) {\n\t if (!urlParams.s) {\n\t // Default to a random choice of a, b or c\n\t s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n\t }\n\t\n\t tileURLRegex.lastIndex = 0;\n\t return this._path.replace(tileURLRegex, function (value, key) {\n\t // Replace with paramter, otherwise keep existing value\n\t return urlParams[key];\n\t });\n\t }\n\t\n\t // Convert from quadcode to TMS tile coordinates\n\t }, {\n\t key: '_quadcodeToTile',\n\t value: function _quadcodeToTile(quadcode) {\n\t var x = 0;\n\t var y = 0;\n\t var z = quadcode.length;\n\t\n\t for (var i = z; i > 0; i--) {\n\t var mask = 1 << i - 1;\n\t var q = +quadcode[z - i];\n\t if (q === 1) {\n\t x |= mask;\n\t }\n\t if (q === 2) {\n\t y |= mask;\n\t }\n\t if (q === 3) {\n\t x |= mask;\n\t y |= mask;\n\t }\n\t }\n\t\n\t return [x, y, z];\n\t }\n\t\n\t // Convert WGS84 tile bounds to world coordinates\n\t }, {\n\t key: '_tileBoundsFromWGS84',\n\t value: function _tileBoundsFromWGS84(boundsWGS84) {\n\t var sw = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[1], boundsWGS84[0]));\n\t var ne = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[3], boundsWGS84[2]));\n\t\n\t return [sw.x, sw.y, ne.x, ne.y];\n\t }\n\t\n\t // Get tile bounds in WGS84 coordinates\n\t }, {\n\t key: '_tileBoundsWGS84',\n\t value: function _tileBoundsWGS84(tile) {\n\t var e = this._tile2lon(tile[0] + 1, tile[2]);\n\t var w = this._tile2lon(tile[0], tile[2]);\n\t var s = this._tile2lat(tile[1] + 1, tile[2]);\n\t var n = this._tile2lat(tile[1], tile[2]);\n\t return [w, s, e, n];\n\t }\n\t }, {\n\t key: '_tile2lon',\n\t value: function _tile2lon(x, z) {\n\t return x / Math.pow(2, z) * 360 - 180;\n\t }\n\t }, {\n\t key: '_tile2lat',\n\t value: function _tile2lat(y, z) {\n\t var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n\t return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n\t }\n\t }, {\n\t key: '_boundsToCenter',\n\t value: function _boundsToCenter(bounds) {\n\t var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n\t var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\t\n\t return [x, y];\n\t }\n\t }, {\n\t key: '_getSide',\n\t value: function _getSide(bounds) {\n\t return new _three2['default'].Vector3(bounds[0], 0, bounds[3]).sub(new _three2['default'].Vector3(bounds[0], 0, bounds[1])).length();\n\t }\n\t }]);\n\t\n\t return Tile;\n\t})();\n\t\n\texports['default'] = Tile;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tBoxHelper = function (object) {\n\t\n\t\tvar indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);\n\t\tvar positions = new Float32Array(8 * 3);\n\t\n\t\tvar geometry = new _three2['default'].BufferGeometry();\n\t\tgeometry.setIndex(new _three2['default'].BufferAttribute(indices, 1));\n\t\tgeometry.addAttribute('position', new _three2['default'].BufferAttribute(positions, 3));\n\t\n\t\t_three2['default'].LineSegments.call(this, geometry, new _three2['default'].LineBasicMaterial({ linewidth: 2, color: 0xff0000 }));\n\t\n\t\tif (object !== undefined) {\n\t\n\t\t\tthis.update(object);\n\t\t}\n\t};\n\t\n\tBoxHelper.prototype = Object.create(_three2['default'].LineSegments.prototype);\n\tBoxHelper.prototype.constructor = BoxHelper;\n\t\n\tBoxHelper.prototype.update = (function () {\n\t\n\t\tvar box = new _three2['default'].Box3();\n\t\n\t\treturn function (object) {\n\t\n\t\t\tbox.setFromObject(object);\n\t\n\t\t\tif (box.isEmpty()) return;\n\t\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\t\n\t\t\t/*\n\t 5____4\n\t 1/___0/|\n\t | 6__|_7\n\t 2/___3/\n\t \t0: max.x, max.y, max.z\n\t 1: min.x, max.y, max.z\n\t 2: min.x, min.y, max.z\n\t 3: max.x, min.y, max.z\n\t 4: max.x, max.y, min.z\n\t 5: min.x, max.y, min.z\n\t 6: min.x, min.y, min.z\n\t 7: max.x, min.y, min.z\n\t */\n\t\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\t\n\t\t\tarray[0] = max.x;array[1] = max.y;array[2] = max.z;\n\t\t\tarray[3] = min.x;array[4] = max.y;array[5] = max.z;\n\t\t\tarray[6] = min.x;array[7] = min.y;array[8] = max.z;\n\t\t\tarray[9] = max.x;array[10] = min.y;array[11] = max.z;\n\t\t\tarray[12] = max.x;array[13] = max.y;array[14] = min.z;\n\t\t\tarray[15] = min.x;array[16] = max.y;array[17] = min.z;\n\t\t\tarray[18] = min.x;array[19] = min.y;array[20] = min.z;\n\t\t\tarray[21] = max.x;array[22] = min.y;array[23] = min.z;\n\t\n\t\t\tposition.needsUpdate = true;\n\t\n\t\t\tthis.geometry.computeBoundingSphere();\n\t\t};\n\t})();\n\t\n\texports['default'] = BoxHelper;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\texports['default'] = function (colour) {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 1;\n\t canvas.height = 1;\n\t\n\t var context = canvas.getContext('2d');\n\t context.fillStyle = colour;\n\t context.fillRect(0, 0, canvas.width, canvas.height);\n\t // context.strokeStyle = '#D0D0CF';\n\t // context.strokeRect(0, 0, canvas.width, canvas.height);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // // Silky smooth images when tilted\n\t // texture.magFilter = THREE.LinearFilter;\n\t // texture.minFilter = THREE.LinearMipMapLinearFilter;\n\t // //\n\t // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t // texture.anisotropy = 4;\n\t\n\t // texture.wrapS = THREE.RepeatWrapping;\n\t // texture.wrapT = THREE.RepeatWrapping;\n\t // texture.repeat.set(segments, segments);\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t depthWrite: false\n\t });\n\t\n\t return material;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.0 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar debounce = __webpack_require__(49);\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/**\n\t * Creates a throttled function that only invokes `func` at most once per\n\t * every `wait` milliseconds. The throttled function comes with a `cancel`\n\t * method to cancel delayed `func` invocations and a `flush` method to\n\t * immediately invoke them. Provide an options object to indicate whether\n\t * `func` should be invoked on the leading and/or trailing edge of the `wait`\n\t * timeout. The `func` is invoked with the last arguments provided to the\n\t * throttled function. Subsequent calls to the throttled function return the\n\t * result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the throttled function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.throttle` and `_.debounce`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to throttle.\n\t * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=true] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new throttled function.\n\t * @example\n\t *\n\t * // avoid excessively updating the position while scrolling\n\t * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n\t *\n\t * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n\t * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n\t * jQuery(element).on('click', throttled);\n\t *\n\t * // cancel a trailing throttled invocation\n\t * jQuery(window).on('popstate', throttled.cancel);\n\t */\n\tfunction throttle(func, wait, options) {\n\t var leading = true,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t if (isObject(options)) {\n\t leading = 'leading' in options ? !!options.leading : leading;\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t // Avoid a V8 JIT bug in Chrome 19-20.\n\t // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\tmodule.exports = throttle;\n\n\n/***/ },\n/* 49 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Gets the timestamp of the number of milliseconds that have elapsed since\n\t * the Unix epoch (1 January 1970 00:00:00 UTC).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Date\n\t * @returns {number} Returns the timestamp.\n\t * @example\n\t *\n\t * _.defer(function(stamp) {\n\t * console.log(_.now() - stamp);\n\t * }, _.now());\n\t * // => logs the number of milliseconds it took for the deferred function to be invoked\n\t */\n\tvar now = Date.now;\n\t\n\t/**\n\t * Creates a debounced function that delays invoking `func` until after `wait`\n\t * milliseconds have elapsed since the last time the debounced function was\n\t * invoked. The debounced function comes with a `cancel` method to cancel\n\t * delayed `func` invocations and a `flush` method to immediately invoke them.\n\t * Provide an options object to indicate whether `func` should be invoked on\n\t * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n\t * with the last arguments provided to the debounced function. Subsequent calls\n\t * to the debounced function return the result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the debounced function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.debounce` and `_.throttle`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to debounce.\n\t * @param {number} [wait=0] The number of milliseconds to delay.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=false] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n\t * delayed before it's invoked.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new debounced function.\n\t * @example\n\t *\n\t * // Avoid costly calculations while the window size is in flux.\n\t * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n\t *\n\t * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n\t * jQuery(element).on('click', _.debounce(sendMail, 300, {\n\t * 'leading': true,\n\t * 'trailing': false\n\t * }));\n\t *\n\t * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n\t * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n\t * var source = new EventSource('/stream');\n\t * jQuery(source).on('message', debounced);\n\t *\n\t * // Cancel the trailing debounced invocation.\n\t * jQuery(window).on('popstate', debounced.cancel);\n\t */\n\tfunction debounce(func, wait, options) {\n\t var args,\n\t maxTimeoutId,\n\t result,\n\t stamp,\n\t thisArg,\n\t timeoutId,\n\t trailingCall,\n\t lastCalled = 0,\n\t leading = false,\n\t maxWait = false,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t wait = toNumber(wait) || 0;\n\t if (isObject(options)) {\n\t leading = !!options.leading;\n\t maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t\n\t function cancel() {\n\t if (timeoutId) {\n\t clearTimeout(timeoutId);\n\t }\n\t if (maxTimeoutId) {\n\t clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = 0;\n\t args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n\t }\n\t\n\t function complete(isCalled, id) {\n\t if (id) {\n\t clearTimeout(id);\n\t }\n\t maxTimeoutId = timeoutId = trailingCall = undefined;\n\t if (isCalled) {\n\t lastCalled = now();\n\t result = func.apply(thisArg, args);\n\t if (!timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t }\n\t }\n\t\n\t function delayed() {\n\t var remaining = wait - (now() - stamp);\n\t if (remaining <= 0 || remaining > wait) {\n\t complete(trailingCall, maxTimeoutId);\n\t } else {\n\t timeoutId = setTimeout(delayed, remaining);\n\t }\n\t }\n\t\n\t function flush() {\n\t if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n\t result = func.apply(thisArg, args);\n\t }\n\t cancel();\n\t return result;\n\t }\n\t\n\t function maxDelayed() {\n\t complete(trailing, timeoutId);\n\t }\n\t\n\t function debounced() {\n\t args = arguments;\n\t stamp = now();\n\t thisArg = this;\n\t trailingCall = trailing && (timeoutId || !leading);\n\t\n\t if (maxWait === false) {\n\t var leadingCall = leading && !timeoutId;\n\t } else {\n\t if (!maxTimeoutId && !leading) {\n\t lastCalled = stamp;\n\t }\n\t var remaining = maxWait - (stamp - lastCalled),\n\t isCalled = remaining <= 0 || remaining > maxWait;\n\t\n\t if (isCalled) {\n\t if (maxTimeoutId) {\n\t maxTimeoutId = clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = stamp;\n\t result = func.apply(thisArg, args);\n\t }\n\t else if (!maxTimeoutId) {\n\t maxTimeoutId = setTimeout(maxDelayed, remaining);\n\t }\n\t }\n\t if (isCalled && timeoutId) {\n\t timeoutId = clearTimeout(timeoutId);\n\t }\n\t else if (!timeoutId && wait !== maxWait) {\n\t timeoutId = setTimeout(delayed, wait);\n\t }\n\t if (leadingCall) {\n\t isCalled = true;\n\t result = func.apply(thisArg, args);\n\t }\n\t if (isCalled && !timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t return result;\n\t }\n\t debounced.cancel = cancel;\n\t debounced.flush = flush;\n\t return debounced;\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = debounce;\n\n\n/***/ }\n/******/ ])\n});\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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap ca2ab29585dec9c8f1eb\n **/","import World from './World';\nimport Controls from './controls/index';\nimport EnvironmentLayer from './layer/environment/EnvironmentLayer';\nimport ImageTileLayer from './layer/tile/ImageTileLayer';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\n\nconst VIZI = {\n version: '0.3',\n\n // Public API\n World: World,\n Controls: Controls,\n EnvironmentLayer: EnvironmentLayer,\n ImageTileLayer: ImageTileLayer,\n Point: Point,\n LatLon: LatLon\n};\n\nexport default VIZI;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vizicities.js\n **/","import EventEmitter from 'eventemitter3';\nimport extend from 'lodash.assign';\nimport CRS from './geo/CRS/index';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\nimport Engine from './engine/Engine';\n\n// Pretty much any event someone using ViziCities would need will be emitted or\n// proxied by World (eg. render events, etc)\n\nclass World extends EventEmitter {\n constructor(domId, options) {\n super();\n\n var defaults = {\n crs: CRS.EPSG3857\n };\n\n this.options = extend(defaults, options);\n\n this._layers = [];\n this._controls = [];\n\n this._initContainer(domId);\n this._initEngine();\n this._initEvents();\n\n // Kick off the update and render loop\n this._update();\n }\n\n _initContainer(domId) {\n this._container = document.getElementById(domId);\n }\n\n _initEngine() {\n this._engine = Engine(this._container);\n\n // Engine events\n //\n // Consider proxying these through events on World for public access\n // this._engine.on('preRender', () => {});\n // this._engine.on('postRender', () => {});\n }\n\n _initEvents() {\n this.on('controlsMoveEnd', this._onControlsMoveEnd);\n }\n\n _onControlsMoveEnd(point) {\n var _point = Point(point.x, point.z);\n this._resetView(this.pointToLatLon(_point), _point);\n }\n\n // Reset world view\n _resetView(latlon, point) {\n this.emit('preResetView');\n\n this._moveStart();\n this._move(latlon, point);\n this._moveEnd();\n\n this.emit('postResetView');\n }\n\n _moveStart() {\n this.emit('moveStart');\n }\n\n _move(latlon, point) {\n this._lastPosition = latlon;\n this.emit('move', latlon, point);\n }\n _moveEnd() {\n this.emit('moveEnd');\n }\n\n _update() {\n var delta = this._engine.clock.getDelta();\n\n // Once _update is called it will run forever, for now\n window.requestAnimationFrame(this._update.bind(this));\n\n // Update controls\n this._controls.forEach(controls => {\n controls.update();\n });\n\n this.emit('preUpdate');\n this._engine.update(delta);\n this.emit('postUpdate');\n }\n\n // Set world view\n setView(latlon) {\n // Store initial geographic coordinate for the [0,0,0] world position\n //\n // The origin point doesn't move in three.js / 3D space so only set it once\n // here instead of every time _resetView is called\n //\n // If it was updated every time then coorindates would shift over time and\n // would be out of place / context with previously-placed points (0,0 would\n // refer to a different point each time)\n this._originLatlon = latlon;\n this._originPoint = this.project(latlon);\n\n this._resetView(latlon);\n return this;\n }\n\n // Return world geographic position\n getPosition() {\n return this._lastPosition;\n }\n\n // Transform geographic coordinate to world point\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the origin point of the projection (not the world)\n project(latlon) {\n return this.options.crs.latLonToPoint(LatLon(latlon));\n }\n\n // Transform world point to geographic coordinate\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a point relative to the origin point of the\n // projection (not the world) and returns a geographic coordinate\n unproject(point) {\n return this.options.crs.pointToLatLon(Point(point));\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the three.js / 3D origin (0,0)\n latLonToPoint(latlon) {\n var projectedPoint = this.project(LatLon(latlon));\n return projectedPoint._subtract(this._originPoint);\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a point relative to the three.js / 3D origin (0,0)\n // and returns the exact geographic coordinate at that point\n pointToLatLon(point) {\n var projectedPoint = Point(point).add(this._originPoint);\n return this.unproject(projectedPoint);\n }\n\n // Unsure if it's a good idea to expose this here for components like\n // GridLayer to use (eg. to keep track of a frustum)\n getCamera() {\n return this._engine._camera;\n }\n\n addLayer(layer) {\n layer._addToWorld(this);\n\n this._layers.push(layer);\n\n // Could move this into Layer but it'll do here for now\n this._engine._scene.add(layer._layer);\n\n this.emit('layerAdded', layer);\n return this;\n }\n\n // Remove layer and perform clean up operations\n removeLayer(layer) {\n var layerIndex = this._layers.indexOf(layer);\n\n if (layerIndex > -1) {\n // Remove from this._layers\n this._layers.splice(layerIndex, 1);\n };\n\n this._engine._scene.remove(layer._layer);\n\n layer.destroy();\n\n this.emit('layerRemoved');\n return this;\n }\n\n addControls(controls) {\n controls._addToWorld(this);\n\n this._controls.push(controls);\n\n this.emit('controlsAdded', controls);\n return this;\n }\n\n removeControls(controls) {}\n}\n\n// Initialise without requiring new keyword\nexport default function(domId, options) {\n return new World(domId, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/World.js\n **/","'use strict';\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} once Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Holds the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events && this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if ('function' === typeof listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Functon} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return this;\n\n var listeners = this._events[evt]\n , events = [];\n\n if (fn) {\n if (listeners.fn) {\n if (\n listeners.fn !== fn\n || (once && !listeners.once)\n || (context && listeners.context !== context)\n ) {\n events.push(listeners);\n }\n } else {\n for (var i = 0, length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) {\n this._events[evt] = events.length === 1 ? events[0] : events;\n } else {\n delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n if (!this._events) return this;\n\n if (event) delete this._events[prefix ? prefix + event : event];\n else this._events = prefix ? {} : Object.create(null);\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/eventemitter3/index.js\n ** module id = 2\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar keys = require('lodash.keys'),\n rest = require('lodash.rest');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if ((!eq(objValue, value) ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object) {\n return copyObjectWith(source, props, object);\n}\n\n/**\n * This function is like `copyObject` except that it accepts a function to\n * customize copied values.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObjectWith(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\n assignValue(object, key, newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return rest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Assigns own enumerable properties of source objects to the destination\n * object. Source objects are applied from left to right. Subsequent sources\n * overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.c = 3;\n * }\n *\n * function Bar() {\n * this.e = 5;\n * }\n *\n * Foo.prototype.d = 4;\n * Bar.prototype.f = 6;\n *\n * _.assign({ 'a': 1 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3, 'e': 5 }\n */\nvar assign = createAssigner(function(object, source) {\n copyObject(source, keys(source), object);\n});\n\nmodule.exports = assign;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.assign/index.js\n ** module id = 3\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n stringTag = '[object String]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototypeOf = Object.getPrototypeOf,\n propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = Object.keys;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n // that are composed entirely of index properties, return `false` for\n // `hasOwnProperty` checks of them.\n return hasOwnProperty.call(object, key) ||\n (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @type Function\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n var length = object ? object.length : undefined;\n if (isLength(length) &&\n (isArray(object) || isString(object) || isArguments(object))) {\n return baseTimes(length, String);\n }\n return null;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n var isProto = isPrototype(object);\n if (!(isProto || isArrayLike(object))) {\n return baseKeys(object);\n }\n var indexes = indexKeys(object),\n skipIndexes = !!indexes,\n result = indexes || [],\n length = result.length;\n\n for (var key in object) {\n if (baseHas(object, key) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n !(isProto && key == 'constructor')) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.keys/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n var length = args.length;\n switch (length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3');\n * // => 3\n */\nfunction toInteger(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n var remainder = value % 1;\n return value === value ? (remainder ? value - remainder : value) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = rest;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.rest/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import EPSG3857 from './CRS.EPSG3857';\nimport {EPSG900913} from './CRS.EPSG3857';\nimport EPSG3395 from './CRS.EPSG3395';\nimport EPSG4326 from './CRS.EPSG4326';\nimport Simple from './CRS.Simple';\nimport Proj4 from './CRS.Proj4';\n\nconst CRS = {};\n\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\nCRS.Proj4 = Proj4;\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/index.js\n **/","/*\n * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport SphericalMercator from '../projection/Projection.SphericalMercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3857 = {\n code: 'EPSG:3857',\n projection: SphericalMercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * SphericalMercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * SphericalMercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3857 = extend({}, Earth, _EPSG3857);\n\nconst EPSG900913 = extend({}, EPSG3857, {\n code: 'EPSG:900913'\n});\n\nexport {EPSG900913};\n\nexport default EPSG3857;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3857.js\n **/","/*\n * CRS.Earth is the base class for all CRS representing Earth.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLon from '../LatLon';\n\nconst Earth = {\n wrapLon: [-180, 180],\n\n R: 6378137,\n\n // Distance between two geographical points using spherical law of cosines\n // approximation or Haversine\n //\n // See: http://www.movable-type.co.uk/scripts/latlong.html\n distance: function(latlon1, latlon2, accurate) {\n var rad = Math.PI / 180;\n\n var lat1;\n var lat2;\n\n var a;\n\n if (!accurate) {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\n return this.R * Math.acos(Math.min(a, 1));\n } else {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n var lon1 = latlon1.lon * rad;\n var lon2 = latlon2.lon * rad;\n\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n\n var halfDeltaLat = deltaLat / 2;\n var halfDeltaLon = deltaLon / 2;\n\n a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return this.R * c;\n }\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Defaults to a scale factor of 1 if no calculation method exists\n //\n // Probably need to run this through the CRS transformation or similar so the\n // resulting scale is relative to the dimensions of the world space\n // Eg. 1 metre in projected space is likly scaled up or down to some other\n // number\n pointScale: function(latlon, accurate) {\n return (this.projection.pointScale) ? this.projection.pointScale(latlon, accurate) : [1, 1];\n },\n\n // Convert real metres to projected units\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n metresToProjected: function(metres, pointScale) {\n return metres * pointScale[1];\n },\n\n // Convert projected units to real metres\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n projectedToMetres: function(projectedUnits, pointScale) {\n return projectedUnits / pointScale[1];\n },\n\n // Convert real metres to a value in world (WebGL) units\n metresToWorld: function(metres, pointScale, zoom) {\n // Transform metres to projected metres using the latitude point scale\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n var projectedMetres = this.metresToProjected(metres, pointScale);\n\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n // Scale projected metres\n var scaledMetres = (scale * (this.transformScale * projectedMetres)) / pointScale[1];\n\n return scaledMetres;\n },\n\n // Convert world (WebGL) units to a value in real metres\n worldToMetres: function(worldUnits, pointScale, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var projectedUnits = ((worldUnits / scale) / this.transformScale) * pointScale[1];\n var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\n return realMetres;\n }\n};\n\nexport default extend({}, CRS, Earth);\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Earth.js\n **/","/*\n * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\nimport wrapNum from '../../util/wrapNum';\n\nconst CRS = {\n // Scale factor determines final dimensions of world space\n //\n // Projection transformation in range -1 to 1 is multiplied by scale factor to\n // find final world coordinates\n //\n // Scale factor can be considered as half the amount of the desired dimension\n // for the largest side when transformation is equal to 1 or -1, or as the\n // distance between 0 and 1 on the largest side\n //\n // For example, if you want the world dimensions to be between -1000 and 1000\n // then the scale factor will be 1000\n scaleFactor: 1000000,\n\n // Converts geo coords to pixel / WebGL ones\n latLonToPoint: function(latlon, zoom) {\n var projectedPoint = this.projection.project(latlon);\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n return this.transformation._transform(projectedPoint, scale);\n },\n\n // Converts pixel / WebGL coords to geo coords\n pointToLatLon: function(point, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var untransformedPoint = this.transformation.untransform(point, scale);\n\n return this.projection.unproject(untransformedPoint);\n },\n\n // Converts geo coords to projection-specific coords (e.g. in meters)\n project: function(latlon) {\n return this.projection.project(latlon);\n },\n\n // Converts projected coords to geo coords\n unproject: function(point) {\n return this.projection.unproject(point);\n },\n\n // If zoom is provided, returns the map width in pixels for a given zoom\n // Else, provides fixed scale value\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom >= 0) {\n return 256 * Math.pow(2, zoom);\n // Else, return fixed scale value to expand projected coordinates from\n // their 0 to 1 range into something more practical\n } else {\n return this.scaleFactor;\n }\n },\n\n // Returns zoom level for a given scale value\n // This only works with a scale value that is based on map pixel width\n zoom: function(scale) {\n return Math.log(scale / 256) / Math.LN2;\n },\n\n // Returns the bounds of the world in projected coords if applicable\n getProjectedBounds: function(zoom) {\n if (this.infinite) { return null; }\n\n var b = this.projection.bounds;\n var s = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n s /= 2;\n }\n\n // Bottom left\n var min = this.transformation.transform(Point(b[0]), s);\n\n // Top right\n var max = this.transformation.transform(Point(b[1]), s);\n\n return [min, max];\n },\n\n // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n // wrapLon: [min, max],\n // wrapLat: [min, max],\n\n // If true, the coordinate space will be unbounded (infinite in all directions)\n // infinite: false,\n\n // Wraps geo coords in certain ranges if applicable\n wrapLatLon: function(latlon) {\n var lat = this.wrapLat ? wrapNum(latlon.lat, this.wrapLat, true) : latlon.lat;\n var lon = this.wrapLon ? wrapNum(latlon.lon, this.wrapLon, true) : latlon.lon;\n var alt = latlon.alt;\n\n return LatLon(lat, lon, alt);\n }\n};\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.js\n **/","/*\n * LatLon is a helper class for ensuring consistent geographic coordinates.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n */\n\nclass LatLon {\n constructor(lat, lon, alt) {\n if (isNaN(lat) || isNaN(lon)) {\n throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n }\n\n this.lat = +lat;\n this.lon = +lon;\n\n if (alt !== undefined) {\n this.alt = +alt;\n }\n }\n\n clone() {\n return new LatLon(this.lat, this.lon, this.alt);\n }\n}\n\n// Initialise without requiring new keyword\n//\n// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n// Also converts between lng and lon\nexport default function(a, b, c) {\n if (a instanceof LatLon) {\n return a;\n }\n if (Array.isArray(a) && typeof a[0] !== 'object') {\n if (a.length === 3) {\n return new LatLon(a[0], a[1], a[2]);\n }\n if (a.length === 2) {\n return new LatLon(a[0], a[1]);\n }\n return null;\n }\n if (a === undefined || a === null) {\n return a;\n }\n if (typeof a === 'object' && 'lat' in a) {\n return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n }\n if (b === undefined) {\n return null;\n }\n return new LatLon(a, b, c);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/LatLon.js\n **/","/*\n * Point is a helper class for ensuring consistent world positions.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n */\n\nclass Point {\n constructor(x, y, round) {\n this.x = (round ? Math.round(x) : x);\n this.y = (round ? Math.round(y) : y);\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n // Non-destructive\n add(point) {\n return this.clone()._add(_point(point));\n }\n\n // Destructive\n _add(point) {\n this.x += point.x;\n this.y += point.y;\n return this;\n }\n\n // Non-destructive\n subtract(point) {\n return this.clone()._subtract(_point(point));\n }\n\n // Destructive\n _subtract(point) {\n this.x -= point.x;\n this.y -= point.y;\n return this;\n }\n}\n\n// Accepts (point), ([x, y]) and (x, y, round)\nvar _point = function(x, y, round) {\n if (x instanceof Point) {\n return x;\n }\n if (Array.isArray(x)) {\n return new Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n return new Point(x, y, round);\n};\n\n// Initialise without requiring new keyword\nexport default _point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Point.js\n **/","/*\n * Wrap the given number to lie within a certain range (eg. longitude)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n */\n\nconst wrapNum = function(x, range, includeMax) {\n var max = range[1];\n var min = range[0];\n var d = max - min;\n return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n};\n\nexport default wrapNum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/wrapNum.js\n **/","/*\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n * used by default.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst SphericalMercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n MAX_LATITUDE: 85.0511287798,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var max = this.MAX_LATITUDE;\n var lat = Math.max(Math.min(max, latlon.lat), -max);\n var sin = Math.sin(lat * d);\n\n return Point(\n this.R * latlon.lon * d,\n this.R * Math.log((1 + sin) / (1 - sin)) / 2\n );\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n\n return LatLon(\n (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\n point.x * d / this.R\n );\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Accurate scale factor uses proper Web Mercator scaling\n // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n // See: http://jsfiddle.net/robhawkes/yws924cf/\n pointScale: function(latlon, accurate) {\n var rad = Math.PI / 180;\n\n var k;\n\n if (!accurate) {\n k = 1 / Math.cos(latlon.lat * rad);\n\n // [scaleX, scaleY]\n return [k, k];\n } else {\n var lat = latlon.lat * rad;\n var lon = latlon.lon * rad;\n\n var a = this.R;\n\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n\n var cosLat = Math.cos(lat);\n\n // Radius meridian\n var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\n // Radius prime meridian\n var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\n // Scale N/S\n var h = (a / p) / cosLat;\n\n // Scale E/W\n k = (a / v) / cosLat;\n\n // [scaleX, scaleY]\n return [k, h];\n }\n },\n\n // Not using this.R due to scoping\n bounds: (function() {\n var d = 6378137 * Math.PI;\n return [[-d, -d], [d, d]];\n })()\n};\n\nexport default SphericalMercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.SphericalMercator.js\n **/","/*\n * Transformation is an utility class to perform simple point transformations\n * through a 2d-matrix.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n */\n\nimport Point from '../geo/Point';\n\nclass Transformation {\n constructor(a, b, c, d) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n }\n\n transform(point, scale) {\n // Copy input point as to not destroy the original data\n return this._transform(point.clone(), scale);\n }\n\n // Destructive transform (faster)\n _transform(point, scale) {\n scale = scale || 1;\n\n point.x = scale * (this._a * point.x + this._b);\n point.y = scale * (this._c * point.y + this._d);\n return point;\n }\n\n untransform(point, scale) {\n scale = scale || 1;\n return Point(\n (point.x / scale - this._b) / this._a,\n (point.y / scale - this._d) / this._c\n );\n }\n}\n\nexport default Transformation;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Transformation.js\n **/","/*\n * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Mercator from '../projection/Projection.Mercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3395 = {\n code: 'EPSG:3395',\n projection: Mercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * Mercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * Mercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3395 = extend({}, Earth, _EPSG3395);\n\nexport default EPSG3395;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3395.js\n **/","/*\n * Mercator projection that takes into account that the Earth is not a perfect\n * sphere. Less popular than spherical mercator; used by projections like\n * EPSG:3395.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Mercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n R_MINOR: 6356752.314245179,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var r = this.R;\n var y = latlon.lat * d;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var con = e * Math.sin(y);\n\n var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n y = -r * Math.log(Math.max(ts, 1E-10));\n\n return Point(latlon.lon * d * r, y);\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n var r = this.R;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var ts = Math.exp(-point.y / r);\n var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\n for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n con = e * Math.sin(phi);\n con = Math.pow((1 - con) / (1 + con), e / 2);\n dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n phi += dphi;\n }\n\n return LatLon(phi * d, point.x * d / r);\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n pointScale: function(latlon) {\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n var cosLat = Math.cos(lat);\n\n var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\n // [scaleX, scaleY]\n return [k, k];\n },\n\n bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n};\n\nexport default Mercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Mercator.js\n **/","/*\n * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG4326 = {\n code: 'EPSG:4326',\n projection: LatLonProjection,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / 180,\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n //\n // TODO: Cannot use this.transformScale due to scope\n transformation: new Transformation(1 / 180, 0, -1 / 180, 0)\n};\n\nconst EPSG4326 = extend({}, Earth, _EPSG4326);\n\nexport default EPSG4326;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG4326.js\n **/","/*\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n * and Simple.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst ProjectionLatLon = {\n project: function(latlon) {\n return Point(latlon.lon, latlon.lat);\n },\n\n unproject: function(point) {\n return LatLon(point.y, point.x);\n },\n\n // Scale factor for converting between real metres and degrees\n //\n // degrees = realMetres * pointScale\n // realMetres = degrees / pointScale\n //\n // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n pointScale: function(latlon) {\n var m1 = 111132.92;\n var m2 = -559.82;\n var m3 = 1.175;\n var m4 = -0.0023;\n var p1 = 111412.84;\n var p2 = -93.5;\n var p3 = 0.118;\n\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n\n var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\n return [1 / latlen, 1 / lonlen];\n },\n\n bounds: [[-180, -90], [180, 90]]\n};\n\nexport default ProjectionLatLon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.LatLon.js\n **/","/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n * maps.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _Simple = {\n projection: LatLonProjection,\n\n // Straight 1:1 mapping (-1, -1 would be top-left)\n transformation: new Transformation(1, 0, 1, 0),\n\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom) {\n return Math.pow(2, zoom);\n // Else, make no change to scale – may need to increase this or make it a\n // user-definable variable\n } else {\n return 1;\n }\n },\n\n zoom: function(scale) {\n return Math.log(scale) / Math.LN2;\n },\n\n distance: function(latlon1, latlon2) {\n var dx = latlon2.lon - latlon1.lon;\n var dy = latlon2.lat - latlon1.lat;\n\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n infinite: true\n};\n\nconst Simple = extend({}, CRS, _Simple);\n\nexport default Simple;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Simple.js\n **/","/*\n * CRS.Proj4 for any Proj4-supported CRS.\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Proj4Projection from '../projection/Projection.Proj4';\nimport Transformation from '../../util/Transformation';\n\nvar _Proj4 = function(code, def, bounds) {\n var projection = Proj4Projection(def, bounds);\n\n // Transformation calcuations\n var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\n var halfX = diffX / 2;\n var halfY = diffY / 2;\n\n // This is the raw scale factor\n var scaleX = 1 / halfX;\n var scaleY = 1 / halfY;\n\n // Find the minimum scale factor\n //\n // The minimum scale factor comes from the largest side and is the one\n // you want to use for both axis so they stay relative in dimension\n var scale = Math.min(scaleX, scaleY);\n\n // Find amount to offset each axis by to make the central point lie on\n // the [0,0] origin\n var offsetX = scale * (projection.bounds[0][0] + halfX);\n var offsetY = scale * (projection.bounds[0][1] + halfY);\n\n return {\n code: code,\n projection: projection,\n\n transformScale: scale,\n\n // Map the input to a [-1,1] range with [0,0] in the centre\n transformation: new Transformation(scale, -offsetX, -scale, offsetY)\n };\n};\n\nconst Proj4 = function(code, def, bounds) {\n return extend({}, Earth, _Proj4(code, def, bounds));\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Proj4.js\n **/","/*\n * Proj4 support for any projection.\n */\n\nimport proj4 from 'proj4';\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Proj4 = function(def, bounds) {\n var proj = proj4(def);\n\n var project = function(latlon) {\n return Point(proj.forward([latlon.lon, latlon.lat]));\n };\n\n var unproject = function(point) {\n var inverse = proj.inverse([point.x, point.y]);\n return LatLon(inverse[1], inverse[0]);\n };\n\n return {\n project: project,\n unproject: unproject,\n\n // Scale factor for converting between real metres and projected metres\\\n //\n // Need to work out the best way to provide the pointScale calculations\n // for custom, unknown projections (if wanting to override default)\n //\n // For now, user can manually override crs.pointScale or\n // crs.projection.pointScale\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n pointScale: function(latlon, accurate) {\n return [1, 1];\n },\n\n // Try and calculate bounds if none are provided\n //\n // This will provide incorrect bounds for some projections, so perhaps make\n // bounds a required input instead\n bounds: (function() {\n if (bounds) {\n return bounds;\n } else {\n var bottomLeft = project([-90, -180]);\n var topRight = project([90, 180]);\n\n return [bottomLeft, topRight];\n }\n })()\n };\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Proj4.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"proj4\"\n ** module id = 22\n ** module chunks = 0\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from './Scene';\nimport Renderer from './Renderer';\nimport Camera from './Camera';\n\nclass Engine extends EventEmitter {\n constructor(container) {\n console.log('Init Engine');\n\n super();\n\n this._scene = Scene;\n this._renderer = Renderer(container);\n this._camera = Camera(container);\n this.clock = new THREE.Clock();\n\n this._frustum = new THREE.Frustum();\n }\n\n update(delta) {\n this.emit('preRender');\n this._renderer.render(this._scene, this._camera);\n this.emit('postRender');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(container) {\n return new Engine(container);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Engine.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"THREE\"\n ** module id = 24\n ** module chunks = 0\n **/","import THREE from 'three';\n\n// This can be imported from anywhere and will still reference the same scene,\n// though there is a helper reference in Engine.scene\n\nexport default (function() {\n var scene = new THREE.Scene();\n scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n return scene;\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Scene.js\n **/","import THREE from 'three';\nimport Scene from './Scene';\n\n// This can only be accessed from Engine.renderer if you want to reference the\n// same scene in multiple places\n\nexport default function(container) {\n var renderer = new THREE.WebGLRenderer({\n antialias: true\n });\n\n renderer.setClearColor(Scene.fog.color, 1);\n\n // Gamma settings make things look nicer\n renderer.gammaInput = true;\n renderer.gammaOutput = true;\n\n container.appendChild(renderer.domElement);\n\n var updateSize = function() {\n renderer.setSize(container.clientWidth, container.clientHeight);\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return renderer;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Renderer.js\n **/","import THREE from 'three';\n\n// This can only be accessed from Engine.camera if you want to reference the\n// same scene in multiple places\n\n// TODO: Ensure that FOV looks natural on all aspect ratios\n// http://stackoverflow.com/q/26655930/997339\n\nexport default function(container) {\n var camera = new THREE.PerspectiveCamera(45, 1, 1, 40000);\n camera.position.y = 400;\n camera.position.z = 400;\n\n var updateSize = function() {\n camera.aspect = container.clientWidth / container.clientHeight;\n camera.updateProjectionMatrix();\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return camera;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Camera.js\n **/","import Orbit from './Controls.Orbit';\n\nconst Controls = {\n Orbit: Orbit\n};\n\nexport default Controls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/index.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport OrbitControls from 'three-orbit-controls';\n\nvar _OrbitControls = OrbitControls(THREE);\n\nclass Orbit extends EventEmitter {\n constructor() {\n super();\n }\n\n // Proxy control events\n //\n // There's currently no distinction between pan, orbit and zoom events\n _initEvents() {\n this._controls.addEventListener('start', (event) => {\n this._world.emit('controlsMoveStart', event.target.center);\n });\n\n this._controls.addEventListener('change', (event) => {\n this._world.emit('controlsMove', event.target.center);\n });\n\n this._controls.addEventListener('end', (event) => {\n this._world.emit('controlsMoveEnd', event.target.center);\n });\n }\n\n // Moving the camera along the [x,y,z] axis based on a target position\n _panTo(point, animate) {}\n _panBy(pointDelta, animate) {}\n\n // Zooming the camera in and out\n _zoomTo(metres, animate) {}\n _zoomBy(metresDelta, animate) {}\n\n // Force camera to look at something other than the target\n _lookAt(point, animate) {}\n\n // Make camera look at the target\n _lookAtTarget() {}\n\n // Tilt (up and down)\n _tiltTo(angle, animate) {}\n _tiltBy(angleDelta, animate) {}\n\n // Rotate (left and right)\n _rotateTo(angle, animate) {}\n _rotateBy(angleDelta, animate) {}\n\n // Fly to the given point, animating pan and tilt/rotation to final position\n // with nice zoom out and in\n //\n // Calling flyTo a second time before the previous animation has completed\n // will immediately start the new animation from wherever the previous one\n // has got to\n _flyTo(point, noZoom) {}\n\n // Proxy to OrbitControls.update()\n update() {\n this._controls.update();\n }\n\n // Add controls to world instance and store world reference\n addTo(world) {\n world.addControls(this);\n return this;\n }\n\n // Internal method called by World.addControls to actually add the controls\n _addToWorld(world) {\n this._world = world;\n\n // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n // See: http://stackoverflow.com/a/26188674/997339\n this._controls = new _OrbitControls(world._engine._camera, world._container);\n\n // Disable keys for now as no events are fired for them anyway\n this._controls.keys = false;\n\n // 89 degrees\n this._controls.maxPolarAngle = 1.5533;\n\n // this._controls.enableDamping = true;\n // this._controls.dampingFactor = 0.25;\n\n this._initEvents();\n\n this.emit('added');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new Orbit();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/Controls.Orbit.js\n **/","module.exports = function(THREE) {\n\tvar MOUSE = THREE.MOUSE\n\tif (!MOUSE)\n\t\tMOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\t/*global THREE, console */\n\n\tfunction OrbitConstraint ( object ) {\n\n\t\tthis.object = object;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\t// and where it pans with respect to.\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// Limits to how far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// Limits to how far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t////////////\n\t\t// internals\n\n\t\tvar scope = this;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// Current position in spherical coordinate system.\n\t\tvar theta;\n\t\tvar phi;\n\n\t\t// Pending changes\n\t\tvar phiDelta = 0;\n\t\tvar thetaDelta = 0;\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\t// API\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn theta;\n\n\t\t};\n\n\t\tthis.rotateLeft = function ( angle ) {\n\n\t\t\tthetaDelta -= angle;\n\n\t\t};\n\n\t\tthis.rotateUp = function ( angle ) {\n\n\t\t\tphiDelta -= angle;\n\n\t\t};\n\n\t\t// pass in distance in world space to move left\n\t\tthis.panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t return function panLeft(distance) {\n\t\t var te = this.object.matrix.elements;\n\t\t var adjDist = distance / Math.cos(phi);\n\n\t\t v.set(te[ 0 ], 0, te[ 2 ]).normalize();\n\t\t v.multiplyScalar(-adjDist);\n\n\t\t panOffset.add(v);\n\t\t };\n\n\t\t}();\n\n\t\t// pass in distance in world space to move up\n\t\tthis.panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t return function panUp(distance) {\n\t\t var te = this.object.matrix.elements;\n\t\t var adjDist = distance / Math.cos(phi);\n\n\t\t v.set(te[ 8 ], 0, te[ 10 ]).normalize();\n\t\t v.multiplyScalar(-adjDist);\n\n\t\t panOffset.add(v);\n\t\t };\n\n\t\t}();\n\n\t\t// pass in x,y of change desired in pixel space,\n\t\t// right and down are positive\n\t\tthis.pan = function ( deltaX, deltaY, screenWidth, screenHeight ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\tvar offset = position.clone().sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\tscope.panLeft( 2 * deltaX * targetDistance / screenHeight );\n\t\t\t\tscope.panUp( 2 * deltaY * targetDistance / screenHeight );\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tscope.panLeft( deltaX * ( scope.object.right - scope.object.left ) / screenWidth );\n\t\t\t\tscope.panUp( deltaY * ( scope.object.top - scope.object.bottom ) / screenHeight );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic or perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.dollyIn = function ( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.dollyOut = function ( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function () {\n\n\t\t\t\tvar position = this.object.position;\n\n\t\t\t\toffset.copy( position ).sub( this.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\n\t\t\t\ttheta = Math.atan2( offset.x, offset.z );\n\n\t\t\t\t// angle from y-axis\n\n\t\t\t\tphi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\n\t\t\t\ttheta += thetaDelta;\n\t\t\t\tphi += phiDelta;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\ttheta = Math.max( this.minAzimuthAngle, Math.min( this.maxAzimuthAngle, theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tphi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, phi ) );\n\n\t\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\t\t\tvar radius = offset.length() * scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tradius = Math.max( this.minDistance, Math.min( this.maxDistance, radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tthis.target.add( panOffset );\n\n\t\t\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\t\t\toffset.y = radius * Math.cos( phi );\n\t\t\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( this.target ).add( offset );\n\n\t\t\t\tthis.object.lookAt( this.target );\n\n\t\t\t\tif ( this.enableDamping === true ) {\n\n\t\t\t\t\tthetaDelta *= ( 1 - this.dampingFactor );\n\t\t\t\t\tphiDelta *= ( 1 - this.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthetaDelta = 0;\n\t\t\t\t\tphiDelta = 0;\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\t lastPosition.distanceToSquared( this.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( this.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tlastPosition.copy( this.object.position );\n\t\t\t\t\tlastQuaternion.copy( this.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t};\n\n\n\t// This set of controls performs orbiting, dollying (zooming), and panning. It maintains\n\t// the \"up\" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is\n\t// supported.\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls ( object, domElement ) {\n\n\t\tvar constraint = new OrbitConstraint( object );\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// API\n\n\t\tObject.defineProperty( this, 'constraint', {\n\n\t\t\tget: function() {\n\n\t\t\t\treturn constraint;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn constraint.getPolarAngle();\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn constraint.getAzimuthalAngle();\n\n\t\t};\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// center is old, deprecated; use \"target\" instead\n\t\tthis.center = this.target;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for\n\t\t// backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t////////////\n\t\t// internals\n\n\t\tvar scope = this;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\t// for reset\n\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// events\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\t// pass in x,y of change desired in pixel space,\n\t\t// right and down are positive\n\t\tfunction pan( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tconstraint.pan( deltaX, deltaY, element.clientWidth, element.clientHeight );\n\n\t\t}\n\n\t\tthis.update = function () {\n\n\t\t\tif ( this.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\tconstraint.rotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\tif ( constraint.update() === true ) {\n\n\t\t\t\tthis.dispatchEvent( changeEvent );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tstate = STATE.NONE;\n\n\t\t\tthis.target.copy( this.target0 );\n\t\t\tthis.object.position.copy( this.position0 );\n\t\t\tthis.object.zoom = this.zoom0;\n\n\t\t\tthis.object.updateProjectionMatrix();\n\t\t\tthis.dispatchEvent( changeEvent );\n\n\t\t\tthis.update();\n\n\t\t};\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\t\tconstraint.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\t\tconstraint.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\t\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\t\tconstraint.dollyIn( getZoomScale() );\n\n\t\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\t\tconstraint.dollyOut( getZoomScale() );\n\n\t\t\t\t}\n\n\t\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\tpanEnd.set( event.clientX, event.clientY );\n\t\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\t\tpanStart.copy( panEnd );\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) scope.update();\n\n\t\t}\n\n\t\tfunction onMouseUp( /* event */ ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\t\tscope.dispatchEvent( endEvent );\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar delta = 0;\n\n\t\t\tif ( event.wheelDelta !== undefined ) {\n\n\t\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\t\tdelta = event.wheelDelta;\n\n\t\t\t} else if ( event.detail !== undefined ) {\n\n\t\t\t\t// Firefox\n\n\t\t\t\tdelta = - event.detail;\n\n\t\t\t}\n\n\t\t\tif ( delta > 0 ) {\n\n\t\t\t\tconstraint.dollyOut( getZoomScale() );\n\n\t\t\t} else if ( delta < 0 ) {\n\n\t\t\t\tconstraint.dollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\t\t\tscope.dispatchEvent( startEvent );\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction touchstart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\t\t\t\t\tdollyStart.set( 0, distance );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) scope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t\tfunction touchmove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return;\n\n\t\t\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\t\t\tconstraint.rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\t\t\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\t\t\tconstraint.rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return;\n\n\t\t\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\t\t\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\t\t\tdollyEnd.set( 0, distance );\n\t\t\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\t\t\tconstraint.dollyOut( getZoomScale() );\n\n\t\t\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\t\t\tconstraint.dollyIn( getZoomScale() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return;\n\n\t\t\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\t\t\tpanStart.copy( panEnd );\n\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction touchend( /* event */ ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tscope.dispatchEvent( endEvent );\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction contextmenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\tthis.dispose = function() {\n\n\t\t\tthis.domElement.removeEventListener( 'contextmenu', contextmenu, false );\n\t\t\tthis.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tthis.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\t\tthis.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\t\tthis.domElement.removeEventListener( 'touchstart', touchstart, false );\n\t\t\tthis.domElement.removeEventListener( 'touchend', touchend, false );\n\t\t\tthis.domElement.removeEventListener( 'touchmove', touchmove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t}\n\n\t\tthis.domElement.addEventListener( 'contextmenu', contextmenu, false );\n\n\t\tthis.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tthis.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\t\tthis.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tthis.domElement.addEventListener( 'touchstart', touchstart, false );\n\t\tthis.domElement.addEventListener( 'touchend', touchend, false );\n\t\tthis.domElement.addEventListener( 'touchmove', touchmove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tobject: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.object;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttarget: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.target;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: target is now immutable. Use target.set() instead.' );\n\t\t\t\tthis.constraint.target.copy( value );\n\n\t\t\t}\n\n\t\t},\n\n\t\tminDistance : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.minDistance;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.minDistance = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmaxDistance : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.maxDistance;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.maxDistance = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tminZoom : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.minZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.minZoom = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmaxZoom : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.maxZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.maxZoom = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tminPolarAngle : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.minPolarAngle;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.minPolarAngle = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmaxPolarAngle : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.maxPolarAngle;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.maxPolarAngle = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tminAzimuthAngle : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.minAzimuthAngle;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.minAzimuthAngle = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmaxAzimuthAngle : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.maxAzimuthAngle;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.maxAzimuthAngle = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tenableDamping : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.enableDamping = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.constraint.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.constraint.dampingFactor = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.constraint.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.constraint.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.constraint.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.constraint.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/three-orbit-controls/index.js\n ** module id = 30\n ** module chunks = 0\n **/","import Layer from '../Layer';\nimport THREE from 'three';\n\nclass EnvironmentLayer extends Layer {\n constructor() {\n super();\n\n this._initLights();\n // this._initGrid();\n }\n\n _onAdd() {}\n\n // Not fleshed out or thought through yet\n //\n // Lights could potentially be put it their own 'layer' to keep this class\n // much simpler and less messy\n _initLights() {\n // Position doesn't really matter (the angle is important), however it's\n // used here so the helpers look more natural.\n\n var directionalLight = new THREE.DirectionalLight(0x999999);\n directionalLight.intesity = 0.1;\n directionalLight.position.x = 100;\n directionalLight.position.y = 100;\n directionalLight.position.z = 100;\n\n var directionalLight2 = new THREE.DirectionalLight(0x999999);\n directionalLight2.intesity = 0.1;\n directionalLight2.position.x = -100;\n directionalLight2.position.y = 100;\n directionalLight2.position.z = -100;\n\n var helper = new THREE.DirectionalLightHelper(directionalLight, 10);\n var helper2 = new THREE.DirectionalLightHelper(directionalLight2, 10);\n\n this._layer.add(directionalLight);\n this._layer.add(directionalLight2);\n\n this._layer.add(helper);\n this._layer.add(helper2);\n }\n\n // Add grid helper for context during initial development\n _initGrid() {\n var size = 4000;\n var step = 100;\n\n var gridHelper = new THREE.GridHelper(size, step);\n this._layer.add(gridHelper);\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new EnvironmentLayer();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/EnvironmentLayer.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from '../engine/Scene';\n\nclass Layer extends EventEmitter {\n constructor() {\n super();\n\n this._layer = new THREE.Object3D();\n }\n\n // Add layer to world instance and store world reference\n addTo(world) {\n world.addLayer(this);\n return this;\n }\n\n // Internal method called by World.addLayer to actually add the layer\n _addToWorld(world) {\n this._world = world;\n this._onAdd(world);\n this.emit('added');\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world = null;\n this._layer = null;\n }\n}\n\nexport default Layer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/Layer.js\n **/","import TileLayer from './TileLayer';\nimport ImageTile from './ImageTile';\nimport ImageTileLayerBaseMaterial from './ImageTileLayerBaseMaterial';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\n// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n// being removed and the new tiles being ready for display\n//\n// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n// of the basemap ground so it blends in a little more, or have a huge ground\n// plane underneath all the tiles that shows through between tile updates.\n//\n// Could keep the old tiles around until the new ones are ready, though they'd\n// probably need to be layered in a way so the old tiles don't overlap new ones,\n// which is similar to how Leaflet approaches this (it has 2 layers)\n//\n// Could keep the tile from the previous quadtree level visible until all 4\n// tiles at the new / current level have finished loading and are displayed.\n// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n// child quadcodes showing whether they are loaded and in view. If all true then\n// remove the parent tile, otherwise keep it on a lower layer.\n\n// TODO: Load and display a base layer separate to the LOD grid that is at a low\n// resolution – used as a backup / background to fill in empty areas / distance\n\n// DONE: Fix the issue where some tiles just don't load, or at least the texture\n// never shows up – tends to happen if you quickly zoom in / out past it while\n// it's still loading, leaving a blank space\n\n// TODO: Optimise the request of many image tiles – look at how Leaflet and\n// OpenWebGlobe approach this (eg. batching, queues, etc)\n\n// TODO: Cancel pending tile requests if they get removed from view before they\n// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n// images are re-requested when the tile is next in scene (even if from cache)\n\nclass ImageTileLayer extends TileLayer {\n constructor(path, options) {\n // Cache 1000 tiles\n super(1000);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n this._initEvents();\n\n // Add base layer\n var geom = new THREE.PlaneBufferGeometry(40000, 40000, 1);\n var mesh = new THREE.Mesh(geom, ImageTileLayerBaseMaterial('#f5f5f3'));\n mesh.rotation.x = -90 * Math.PI / 180;\n\n this._baseLayer = mesh;\n this._layer.add(mesh);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n }\n\n _onWorldMove(latlon, point) {\n this._moveBaseLayer(point);\n }\n\n _moveBaseLayer(point) {\n this._baseLayer.position.x = point.x;\n this._baseLayer.position.z = point.y;\n }\n\n _createTile(quadcode, layer) {\n return ImageTile(quadcode, this._path, layer);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Dispose of mesh and materials\n this._baseLayer.geometry.dispose();\n this._baseLayer.geometry = null;\n\n if (this._baseLayer.material.map) {\n this._baseLayer.material.map.dispose();\n this._baseLayer.material.map = null;\n }\n\n this._baseLayer.material.dispose();\n this._baseLayer.material = null;\n\n this._baseLayer = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new ImageTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayer.js\n **/","import Layer from '../Layer';\nimport TileCache from './TileCache';\nimport THREE from 'three';\n\n// DONE: Prevent tiles from being loaded if they are further than a certain\n// distance from the camera and are unlikely to be seen anyway\n\n// TODO: Avoid performing LOD calculation when it isn't required. For example,\n// when nothing has changed since the last frame and there are no tiles to be\n// loaded or in need of rendering\n\n// TODO: Only remove tiles from the layer that aren't to be rendered in the\n// current frame – it seems excessive to remove all tiles and re-add them on\n// every single frame, even if it's just array manipulation\n\n// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n// problems (eg. making min above 5 causes all sorts of issues)\n\n// TODO: Reuse THREE objects where possible instead of creating new instances\n// on every LOD calculation\n\n// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n// to avoid creating unnecessary memory for garbage collection\n\n// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n// closest to the camera) so visual inconsistancies during loading are minimised\n\nclass TileLayer extends Layer {\n constructor(maxCache) {\n super();\n\n this._tileCache = TileCache(maxCache, tile => {\n this._destroyTile(tile);\n });\n\n // TODO: Work out why changing the minLOD causes loads of issues\n this._minLOD = 3;\n this._maxLOD = 18;\n\n this._frustum = new THREE.Frustum();\n this._tiles = new THREE.Object3D();\n }\n\n _onAdd(world) {\n this._layer.add(this._tiles);\n }\n\n _updateFrustum() {\n var camera = this._world.getCamera();\n var projScreenMatrix = new THREE.Matrix4();\n projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\n this._frustum.setFromMatrix(camera.projectionMatrix);\n this._frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n }\n\n _tileInFrustum(tile) {\n var bounds = tile.getBounds();\n return this._frustum.intersectsBox(new THREE.Box3(new THREE.Vector3(bounds[0], 0, bounds[3]), new THREE.Vector3(bounds[2], 0, bounds[1])));\n }\n\n _calculateLOD() {\n if (this._stop || !this._world) {\n return;\n }\n\n // var start = performance.now();\n\n var camera = this._world.getCamera();\n\n // 1. Update and retrieve camera frustum\n this._updateFrustum(this._frustum, camera);\n\n // 2. Add the four root items of the quadtree to a check list\n var checkList = this._checklist;\n checkList = [];\n checkList.push(this._requestTile('0', this));\n checkList.push(this._requestTile('1', this));\n checkList.push(this._requestTile('2', this));\n checkList.push(this._requestTile('3', this));\n\n // 3. Call Divide, passing in the check list\n this._divide(checkList);\n\n // 4. Remove all tiles from layer\n this._removeTiles();\n\n // 5. Render the tiles remaining in the check list\n checkList.forEach((tile, index) => {\n // Skip tile if it's not in the current view frustum\n if (!this._tileInFrustum(tile)) {\n return;\n }\n\n // // TODO: Can probably speed this up\n // var center = tile.getCenter();\n // var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n // Manual distance limit to cut down on tiles so far away\n // if (dist > 8000) {\n // return;\n // }\n\n // Does the tile have a mesh?\n //\n // If yes, continue\n // If no, generate tile mesh, request texture and skip\n if (!tile.getMesh()) {\n tile.requestTileAsync();\n return;\n }\n\n // Are the mesh and texture ready?\n //\n // If yes, continue\n // If no, skip\n if (!tile.isReady()) {\n return;\n }\n\n // Add tile to layer (and to scene)\n this._tiles.add(tile.getMesh());\n });\n\n // console.log(performance.now() - start);\n }\n\n _divide(checkList) {\n var count = 0;\n var currentItem;\n var quadcode;\n\n // 1. Loop until count equals check list length\n while (count != checkList.length) {\n currentItem = checkList[count];\n quadcode = currentItem.getQuadcode();\n\n // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n if (currentItem.length === this._maxLOD) {\n count++;\n continue;\n }\n\n // 3. Else, calculate screen-space error metric for quadcode\n if (this._screenSpaceError(currentItem)) {\n // 4. If error is sufficient...\n\n // 4a. Remove parent item from the check list\n checkList.splice(count, 1);\n\n // 4b. Add 4 child items to the check list\n checkList.push(this._requestTile(quadcode + '0', this));\n checkList.push(this._requestTile(quadcode + '1', this));\n checkList.push(this._requestTile(quadcode + '2', this));\n checkList.push(this._requestTile(quadcode + '3', this));\n\n // 4d. Continue the loop without increasing count\n continue;\n } else {\n // 5. Else, increase count and continue loop\n count++;\n }\n }\n }\n\n _screenSpaceError(tile) {\n var minDepth = this._minLOD;\n var maxDepth = this._maxLOD;\n\n var quadcode = tile.getQuadcode();\n\n var camera = this._world.getCamera();\n\n // Tweak this value to refine specific point that each quad is subdivided\n //\n // It's used to multiple the dimensions of the tile sides before\n // comparing against the tile distance from camera\n var quality = 3.0;\n\n // 1. Return false if quadcode length is greater than maxDepth\n if (quadcode.length > maxDepth) {\n return false;\n }\n\n // 2. Return true if quadcode length is less than minDepth\n if (quadcode.length < minDepth) {\n return true;\n }\n\n // 3. Return false if quadcode bounds are not in view frustum\n if (!this._tileInFrustum(tile)) {\n return false;\n }\n\n var center = tile.getCenter();\n\n // 4. Calculate screen-space error metric\n // TODO: Use closest distance to one of the 4 tile corners\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n var error = quality * tile.getSide() / dist;\n\n // 5. Return true if error is greater than 1.0, else return false\n return (error > 1.0);\n }\n\n _removeTiles() {\n for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n }\n\n // Return a new tile instance\n _createTile(quadcode, layer) {}\n\n // Get a cached tile or request a new one if not in cache\n _requestTile(quadcode, layer) {\n var tile = this._tileCache.getTile(quadcode);\n\n if (!tile) {\n // Set up a brand new tile\n tile = this._createTile(quadcode, layer);\n\n // Add tile to cache, though it won't be ready yet as the data is being\n // requested from various places asynchronously\n this._tileCache.setTile(quadcode, tile);\n }\n\n return tile;\n }\n\n _destroyTile(tile) {\n // Remove tile from scene\n this._layer.remove(tile);\n\n // Delete any references to the tile within this component\n\n // Call destory on tile instance\n tile.destroy();\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n var i;\n\n // Remove all tiles\n for (i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n\n // Remove everything else in the layer\n for (i = this._layer.children.length - 1; i >= 0; i--) {\n this._layer.remove(this._layer.children[i]);\n }\n\n this._tileCache.destroy();\n this._tileCache = null;\n\n this._world = null;\n this._tiles = null;\n this._layer = null;\n this._frustum = null;\n }\n}\n\nexport default TileLayer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileLayer.js\n **/","import LRUCache from 'lru-cache';\n\n// This process is based on a similar approach taken by OpenWebGlobe\n// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\nclass TileCache {\n constructor(cacheLimit, onDestroyTile) {\n this._cache = LRUCache({\n max: cacheLimit,\n dispose: (key, tile) => {\n onDestroyTile(tile);\n }\n });\n }\n\n // Returns true if all specified tile providers are ready to be used\n // Otherwise, returns false\n isReady() {\n return false;\n }\n\n // Get a cached tile without requesting a new one\n getTile(quadcode) {\n return this._cache.get(quadcode);\n }\n\n // Add tile to cache\n setTile(quadcode, tile) {\n this._cache.set(quadcode, tile);\n }\n\n // Destroy the cache and remove it from memory\n //\n // TODO: Call destroy method on items in cache\n destroy() {\n this._cache.reset();\n this._cache = null;\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(cacheLimit, onDestroyTile) {\n return new TileCache(cacheLimit, onDestroyTile);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileCache.js\n **/","module.exports = LRUCache\n\n// This will be a proper iterable 'Map' in engines that support it,\n// or a fakey-fake PseudoMap in older versions.\nvar Map = require('pseudomap')\nvar util = require('util')\n\n// A linked list to keep track of recently-used-ness\nvar Yallist = require('yallist')\n\n// use symbols if possible, otherwise just _props\nvar symbols = {}\nvar hasSymbol = typeof Symbol === 'function'\nvar makeSymbol\nif (hasSymbol) {\n makeSymbol = function (key) {\n return Symbol.for(key)\n }\n} else {\n makeSymbol = function (key) {\n return '_' + key\n }\n}\n\nfunction priv (obj, key, val) {\n var sym\n if (symbols[key]) {\n sym = symbols[key]\n } else {\n sym = makeSymbol(key)\n symbols[key] = sym\n }\n if (arguments.length === 2) {\n return obj[sym]\n } else {\n obj[sym] = val\n return val\n }\n}\n\nfunction naiveLength () { return 1 }\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nfunction LRUCache (options) {\n if (!(this instanceof LRUCache)) {\n return new LRUCache(options)\n }\n\n if (typeof options === 'number') {\n options = { max: options }\n }\n\n if (!options) {\n options = {}\n }\n\n var max = priv(this, 'max', options.max)\n // Kind of weird to have a default max of Infinity, but oh well.\n if (!max ||\n !(typeof max === 'number') ||\n max <= 0) {\n priv(this, 'max', Infinity)\n }\n\n var lc = options.length || naiveLength\n if (typeof lc !== 'function') {\n lc = naiveLength\n }\n priv(this, 'lengthCalculator', lc)\n\n priv(this, 'allowStale', options.stale || false)\n priv(this, 'maxAge', options.maxAge || 0)\n priv(this, 'dispose', options.dispose)\n this.reset()\n}\n\n// resize the cache when the max changes.\nObject.defineProperty(LRUCache.prototype, 'max', {\n set: function (mL) {\n if (!mL || !(typeof mL === 'number') || mL <= 0) {\n mL = Infinity\n }\n priv(this, 'max', mL)\n trim(this)\n },\n get: function () {\n return priv(this, 'max')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'allowStale', {\n set: function (allowStale) {\n priv(this, 'allowStale', !!allowStale)\n },\n get: function () {\n return priv(this, 'allowStale')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'maxAge', {\n set: function (mA) {\n if (!mA || !(typeof mA === 'number') || mA < 0) {\n mA = 0\n }\n priv(this, 'maxAge', mA)\n trim(this)\n },\n get: function () {\n return priv(this, 'maxAge')\n },\n enumerable: true\n})\n\n// resize the cache when the lengthCalculator changes.\nObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n set: function (lC) {\n if (typeof lC !== 'function') {\n lC = naiveLength\n }\n if (lC !== priv(this, 'lengthCalculator')) {\n priv(this, 'lengthCalculator', lC)\n priv(this, 'length', 0)\n priv(this, 'lruList').forEach(function (hit) {\n hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n priv(this, 'length', priv(this, 'length') + hit.length)\n }, this)\n }\n trim(this)\n },\n get: function () { return priv(this, 'lengthCalculator') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'length', {\n get: function () { return priv(this, 'length') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'itemCount', {\n get: function () { return priv(this, 'lruList').length },\n enumerable: true\n})\n\nLRUCache.prototype.rforEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n var prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n}\n\nfunction forEachStep (self, fn, node, thisp) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) {\n hit = undefined\n }\n }\n if (hit) {\n fn.call(thisp, hit.value, hit.key, self)\n }\n}\n\nLRUCache.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').head; walker !== null;) {\n var next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n}\n\nLRUCache.prototype.keys = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.key\n }, this)\n}\n\nLRUCache.prototype.values = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.value\n }, this)\n}\n\nLRUCache.prototype.reset = function () {\n if (priv(this, 'dispose') &&\n priv(this, 'lruList') &&\n priv(this, 'lruList').length) {\n priv(this, 'lruList').forEach(function (hit) {\n priv(this, 'dispose').call(this, hit.key, hit.value)\n }, this)\n }\n\n priv(this, 'cache', new Map()) // hash of items by key\n priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n priv(this, 'length', 0) // length of items in the list\n}\n\nLRUCache.prototype.dump = function () {\n return priv(this, 'lruList').map(function (hit) {\n if (!isStale(this, hit)) {\n return {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }\n }\n }, this).toArray().filter(function (h) {\n return h\n })\n}\n\nLRUCache.prototype.dumpLru = function () {\n return priv(this, 'lruList')\n}\n\nLRUCache.prototype.inspect = function (n, opts) {\n var str = 'LRUCache {'\n var extras = false\n\n var as = priv(this, 'allowStale')\n if (as) {\n str += '\\n allowStale: true'\n extras = true\n }\n\n var max = priv(this, 'max')\n if (max && max !== Infinity) {\n if (extras) {\n str += ','\n }\n str += '\\n max: ' + util.inspect(max, opts)\n extras = true\n }\n\n var maxAge = priv(this, 'maxAge')\n if (maxAge) {\n if (extras) {\n str += ','\n }\n str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n extras = true\n }\n\n var lc = priv(this, 'lengthCalculator')\n if (lc && lc !== naiveLength) {\n if (extras) {\n str += ','\n }\n str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n extras = true\n }\n\n var didFirst = false\n priv(this, 'lruList').forEach(function (item) {\n if (didFirst) {\n str += ',\\n '\n } else {\n if (extras) {\n str += ',\\n'\n }\n didFirst = true\n str += '\\n '\n }\n var key = util.inspect(item.key).split('\\n').join('\\n ')\n var val = { value: item.value }\n if (item.maxAge !== maxAge) {\n val.maxAge = item.maxAge\n }\n if (lc !== naiveLength) {\n val.length = item.length\n }\n if (isStale(this, item)) {\n val.stale = true\n }\n\n val = util.inspect(val, opts).split('\\n').join('\\n ')\n str += key + ' => ' + val\n })\n\n if (didFirst || extras) {\n str += '\\n'\n }\n str += '}'\n\n return str\n}\n\nLRUCache.prototype.set = function (key, value, maxAge) {\n maxAge = maxAge || priv(this, 'maxAge')\n\n var now = maxAge ? Date.now() : 0\n var len = priv(this, 'lengthCalculator').call(this, value, key)\n\n if (priv(this, 'cache').has(key)) {\n if (len > priv(this, 'max')) {\n del(this, priv(this, 'cache').get(key))\n return false\n }\n\n var node = priv(this, 'cache').get(key)\n var item = node.value\n\n // dispose of the old one before overwriting\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n priv(this, 'length', priv(this, 'length') + (len - item.length))\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n var hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > priv(this, 'max')) {\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, value)\n }\n return false\n }\n\n priv(this, 'length', priv(this, 'length') + hit.length)\n priv(this, 'lruList').unshift(hit)\n priv(this, 'cache').set(key, priv(this, 'lruList').head)\n trim(this)\n return true\n}\n\nLRUCache.prototype.has = function (key) {\n if (!priv(this, 'cache').has(key)) return false\n var hit = priv(this, 'cache').get(key).value\n if (isStale(this, hit)) {\n return false\n }\n return true\n}\n\nLRUCache.prototype.get = function (key) {\n return get(this, key, true)\n}\n\nLRUCache.prototype.peek = function (key) {\n return get(this, key, false)\n}\n\nLRUCache.prototype.pop = function () {\n var node = priv(this, 'lruList').tail\n if (!node) return null\n del(this, node)\n return node.value\n}\n\nLRUCache.prototype.del = function (key) {\n del(this, priv(this, 'cache').get(key))\n}\n\nLRUCache.prototype.load = function (arr) {\n // reset the cache\n this.reset()\n\n var now = Date.now()\n // A previous serialized cache has the most recent items first\n for (var l = arr.length - 1; l >= 0; l--) {\n var hit = arr[l]\n var expiresAt = hit.e || 0\n if (expiresAt === 0) {\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n } else {\n var maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n}\n\nLRUCache.prototype.prune = function () {\n var self = this\n priv(this, 'cache').forEach(function (value, key) {\n get(self, key, false)\n })\n}\n\nfunction get (self, key, doUse) {\n var node = priv(self, 'cache').get(key)\n if (node) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) hit = undefined\n } else {\n if (doUse) {\n priv(self, 'lruList').unshiftNode(node)\n }\n }\n if (hit) hit = hit.value\n }\n return hit\n}\n\nfunction isStale (self, hit) {\n if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n return false\n }\n var stale = false\n var diff = Date.now() - hit.now\n if (hit.maxAge) {\n stale = diff > hit.maxAge\n } else {\n stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n }\n return stale\n}\n\nfunction trim (self) {\n if (priv(self, 'length') > priv(self, 'max')) {\n for (var walker = priv(self, 'lruList').tail;\n priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n var prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nfunction del (self, node) {\n if (node) {\n var hit = node.value\n if (priv(self, 'dispose')) {\n priv(self, 'dispose').call(this, hit.key, hit.value)\n }\n priv(self, 'length', priv(self, 'length') - hit.length)\n priv(self, 'cache').delete(hit.key)\n priv(self, 'lruList').removeNode(node)\n }\n}\n\n// classy, since V8 prefers predictable objects.\nfunction Entry (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lru-cache/lib/lru-cache.js\n ** module id = 36\n ** module chunks = 0\n **/","if (process.env.npm_package_name === 'pseudomap' &&\n process.env.npm_lifecycle_script === 'test')\n process.env.TEST_PSEUDOMAP = 'true'\n\nif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n module.exports = Map\n} else {\n module.exports = require('./pseudomap')\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/map.js\n ** module id = 37\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/process/browser.js\n ** module id = 38\n ** module chunks = 0\n **/","var hasOwnProperty = Object.prototype.hasOwnProperty\n\nmodule.exports = PseudoMap\n\nfunction PseudoMap (set) {\n if (!(this instanceof PseudoMap)) // whyyyyyyy\n throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\n this.clear()\n\n if (set) {\n if ((set instanceof PseudoMap) ||\n (typeof Map === 'function' && set instanceof Map))\n set.forEach(function (value, key) {\n this.set(key, value)\n }, this)\n else if (Array.isArray(set))\n set.forEach(function (kv) {\n this.set(kv[0], kv[1])\n }, this)\n else\n throw new TypeError('invalid argument')\n }\n}\n\nPseudoMap.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n Object.keys(this._data).forEach(function (k) {\n if (k !== 'size')\n fn.call(thisp, this._data[k].value, this._data[k].key)\n }, this)\n}\n\nPseudoMap.prototype.has = function (k) {\n return !!find(this._data, k)\n}\n\nPseudoMap.prototype.get = function (k) {\n var res = find(this._data, k)\n return res && res.value\n}\n\nPseudoMap.prototype.set = function (k, v) {\n set(this._data, k, v)\n}\n\nPseudoMap.prototype.delete = function (k) {\n var res = find(this._data, k)\n if (res) {\n delete this._data[res._index]\n this._data.size--\n }\n}\n\nPseudoMap.prototype.clear = function () {\n var data = Object.create(null)\n data.size = 0\n\n Object.defineProperty(this, '_data', {\n value: data,\n enumerable: false,\n configurable: true,\n writable: false\n })\n}\n\nObject.defineProperty(PseudoMap.prototype, 'size', {\n get: function () {\n return this._data.size\n },\n set: function (n) {},\n enumerable: true,\n configurable: true\n})\n\nPseudoMap.prototype.values =\nPseudoMap.prototype.keys =\nPseudoMap.prototype.entries = function () {\n throw new Error('iterators are not implemented in this version')\n}\n\n// Either identical, or both NaN\nfunction same (a, b) {\n return a === b || a !== a && b !== b\n}\n\nfunction Entry (k, v, i) {\n this.key = k\n this.value = v\n this._index = i\n}\n\nfunction find (data, k) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k))\n return data[key]\n }\n}\n\nfunction set (data, k, v) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k)) {\n data[key].value = v\n return\n }\n }\n data.size++\n data[key] = new Entry(k, v, key)\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/pseudomap.js\n ** module id = 39\n ** module chunks = 0\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/util.js\n ** module id = 40\n ** module chunks = 0\n **/","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/support/isBufferBrowser.js\n ** module id = 41\n ** module chunks = 0\n **/","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/inherits/inherits_browser.js\n ** module id = 42\n ** module chunks = 0\n **/","module.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length --\n node.next = null\n node.prev = null\n node.list = null\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length ++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length ++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail)\n return undefined\n\n var res = this.tail.value\n this.tail = this.tail.prev\n this.tail.next = null\n this.length --\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head)\n return undefined\n\n var res = this.head.value\n this.head = this.head.next\n this.head.prev = null\n this.length --\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length ++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length ++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/yallist/yallist.js\n ** module id = 43\n ** module chunks = 0\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\n\nclass ImageTile extends Tile {\n constructor(quadcode, path, layer) {\n super(quadcode, path, layer);\n }\n\n // Request data for the various tile provider\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTexture();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear image reference\n this._image = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\n var material = new THREE.MeshBasicMaterial({\n depthWrite: false\n });\n\n var localMesh = new THREE.Mesh(geom, material);\n localMesh.rotation.x = -90 * Math.PI / 180;\n\n mesh.add(localMesh);\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n var box = new BoxHelper(localMesh);\n mesh.add(box);\n\n mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTexture() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n var image = document.createElement('img');\n\n image.addEventListener('load', event => {\n var texture = new THREE.Texture();\n\n texture.image = image;\n texture.needsUpdate = true;\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n // Something went wrong and the tile or its material is missing\n //\n // Possibly removed by the cache before the image loaded\n if (!this._mesh || !this._mesh.children[0] || !this._mesh.children[0].material) {\n return;\n }\n\n this._mesh.children[0].material.map = texture;\n this._mesh.children[0].material.needsUpdate = true;\n\n this._texture = texture;\n this._ready = true;\n }, false);\n\n // image.addEventListener('progress', event => {}, false);\n // image.addEventListener('error', event => {}, false);\n\n image.crossOrigin = '';\n\n // Load image\n image.src = url;\n\n this._image = image;\n }\n\n _abortRequest() {\n if (!this._image) {\n return;\n }\n\n this._image.src = '';\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer) {\n return new ImageTile(quadcode, path, layer);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTile.js\n **/","import LatLon from '../../geo/LatLon';\nimport THREE from 'three';\n\n// Manages a single tile and its layers\n\nvar r2d = 180 / Math.PI;\n\nvar tileURLRegex = /\\{([szxy])\\}/g;\n\nclass Tile {\n constructor(quadcode, path, layer) {\n this._layer = layer;\n this._quadcode = quadcode;\n this._path = path;\n\n this._ready = false;\n\n this._tile = this._quadcodeToTile(quadcode);\n\n // Bottom-left and top-right bounds in WGS84 coordinates\n this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\n // Bottom-left and top-right bounds in world coordinates\n this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\n // Tile center in world coordinates\n this._center = this._boundsToCenter(this._boundsWorld);\n\n // Length of a tile side in world coorindates\n this._side = this._getSide(this._boundsWorld);\n }\n\n // Returns true if the tile mesh and texture are ready to be used\n // Otherwise, returns false\n isReady() {\n return this._ready;\n }\n\n // Request data for the tile\n requestTileAsync() {}\n\n getQuadcode() {\n return this._quadcode;\n }\n\n getBounds() {\n return this._boundsWorld;\n }\n\n getCenter() {\n return this._center;\n }\n\n getSide() {\n return this._side;\n }\n\n getMesh() {\n return this._mesh;\n }\n\n // Destroys the tile and removes it from the layer and memory\n //\n // Ensure that this leaves no trace of the tile – no textures, no meshes,\n // nothing in memory or the GPU\n destroy() {\n // Delete reference to layer\n this._layer = null;\n\n // Delete location references\n this._boundsLatLon = null;\n this._boundsWorld = null;\n this._center = null;\n\n // Done if no mesh\n if (!this._mesh) {\n return;\n }\n\n if (this._mesh.children) {\n // Dispose of mesh and materials\n this._mesh.children.forEach(child => {\n child.geometry.dispose();\n child.geometry = null;\n\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n });\n } else {\n this._mesh.geometry.dispose();\n this._mesh.geometry = null;\n\n if (this._mesh.material.map) {\n this._mesh.material.map.dispose();\n this._mesh.material.map = null;\n }\n\n this._mesh.material.dispose();\n this._mesh.material = null;\n }\n }\n\n _createMesh() {}\n _createDebugMesh() {}\n\n _getTileURL(urlParams) {\n if (!urlParams.s) {\n // Default to a random choice of a, b or c\n s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n }\n\n tileURLRegex.lastIndex = 0;\n return this._path.replace(tileURLRegex, function(value, key) {\n // Replace with paramter, otherwise keep existing value\n return urlParams[key];\n });\n }\n\n // Convert from quadcode to TMS tile coordinates\n _quadcodeToTile(quadcode) {\n var x = 0;\n var y = 0;\n var z = quadcode.length;\n\n for (var i = z; i > 0; i--) {\n var mask = 1 << (i - 1);\n var q = +quadcode[z - i];\n if (q === 1) {\n x |= mask;\n }\n if (q === 2) {\n y |= mask;\n }\n if (q === 3) {\n x |= mask;\n y |= mask;\n }\n }\n\n return [x, y, z];\n }\n\n // Convert WGS84 tile bounds to world coordinates\n _tileBoundsFromWGS84(boundsWGS84) {\n var sw = this._layer._world.latLonToPoint(LatLon(boundsWGS84[1], boundsWGS84[0]));\n var ne = this._layer._world.latLonToPoint(LatLon(boundsWGS84[3], boundsWGS84[2]));\n\n return [sw.x, sw.y, ne.x, ne.y];\n }\n\n // Get tile bounds in WGS84 coordinates\n _tileBoundsWGS84(tile) {\n var e = this._tile2lon(tile[0] + 1, tile[2]);\n var w = this._tile2lon(tile[0], tile[2]);\n var s = this._tile2lat(tile[1] + 1, tile[2]);\n var n = this._tile2lat(tile[1], tile[2]);\n return [w, s, e, n];\n }\n\n _tile2lon(x, z) {\n return x / Math.pow(2, z) * 360 - 180;\n }\n\n _tile2lat(y, z) {\n var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n }\n\n _boundsToCenter(bounds) {\n var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\n return [x, y];\n }\n\n _getSide(bounds) {\n return (new THREE.Vector3(bounds[0], 0, bounds[3])).sub(new THREE.Vector3(bounds[0], 0, bounds[1])).length();\n }\n}\n\nexport default Tile;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/Tile.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\nimport THREE from 'three';\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nBoxHelper = function ( object ) {\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new THREE.BufferGeometry();\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { linewidth: 2, color: 0xff0000 } ) );\n\n\tif ( object !== undefined ) {\n\n\t\tthis.update( object );\n\n\t}\n\n};\n\nBoxHelper.prototype = Object.create( THREE.LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new THREE.Box3();\n\n\treturn function ( object ) {\n\n\t\tbox.setFromObject( object );\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nexport default BoxHelper;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/BoxHelper.js\n **/","import THREE from 'three';\n\nexport default function(colour) {\n var canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n\n var context = canvas.getContext('2d');\n context.fillStyle = colour;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.strokeStyle = '#D0D0CF';\n // context.strokeRect(0, 0, canvas.width, canvas.height);\n\n var texture = new THREE.Texture(canvas);\n\n // // Silky smooth images when tilted\n // texture.magFilter = THREE.LinearFilter;\n // texture.minFilter = THREE.LinearMipMapLinearFilter;\n // //\n // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n // texture.anisotropy = 4;\n\n // texture.wrapS = THREE.RepeatWrapping;\n // texture.wrapT = THREE.RepeatWrapping;\n // texture.repeat.set(segments, segments);\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n depthWrite: false\n });\n\n return material;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayerBaseMaterial.js\n **/","/**\n * lodash 4.0.0 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar debounce = require('lodash.debounce');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide an options object to indicate whether\n * `func` should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // cancel a trailing throttled invocation\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = throttle;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/index.js\n ** module id = 48\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = Date.now;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide an options object to indicate whether `func` should be invoked on\n * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent calls\n * to the debounced function return the result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n leading = false,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function flush() {\n if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n result = func.apply(thisArg, args);\n }\n cancel();\n return result;\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/~/lodash.debounce/index.js\n ** module id = 49\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","vizicities.min.js","webpack:/webpack/bootstrap a24aec6171fe092a867e","webpack:///src/vizicities.js","webpack:///src/World.js","webpack:///~/eventemitter3/index.js","webpack:///~/lodash.assign/index.js","webpack:///~/lodash.keys/index.js","webpack:///~/lodash.rest/index.js","webpack:///src/geo/CRS/index.js","webpack:///src/geo/CRS/CRS.EPSG3857.js","webpack:///src/geo/CRS/CRS.Earth.js","webpack:///src/geo/CRS/CRS.js","webpack:///src/geo/LatLon.js","webpack:///src/geo/Point.js","webpack:///src/util/wrapNum.js","webpack:///src/geo/projection/Projection.SphericalMercator.js","webpack:///src/util/Transformation.js","webpack:///src/geo/CRS/CRS.EPSG3395.js","webpack:///src/geo/projection/Projection.Mercator.js","webpack:///src/geo/CRS/CRS.EPSG4326.js","webpack:///src/geo/projection/Projection.LatLon.js","webpack:///src/geo/CRS/CRS.Simple.js","webpack:///src/geo/CRS/CRS.Proj4.js","webpack:///src/geo/projection/Projection.Proj4.js","webpack:/external \"proj4\"","webpack:///src/engine/Engine.js","webpack:/external \"THREE\"","webpack:///src/engine/Scene.js","webpack:///src/engine/Renderer.js","webpack:///src/engine/Camera.js","webpack:///src/controls/index.js","webpack:///src/controls/Controls.Orbit.js","webpack:///src/vendor/OrbitControls.js","webpack:///src/layer/environment/EnvironmentLayer.js","webpack:///src/layer/Layer.js","webpack:///src/layer/tile/ImageTileLayer.js","webpack:///src/layer/tile/TileLayer.js","webpack:///src/layer/tile/TileCache.js","webpack:///~/lru-cache/lib/lru-cache.js","webpack:///~/pseudomap/map.js","webpack:///~/process/browser.js","webpack:///~/pseudomap/pseudomap.js","webpack:///~/util/util.js","webpack:///~/util/support/isBufferBrowser.js","webpack:///~/inherits/inherits_browser.js","webpack:///~/yallist/yallist.js","webpack:///src/layer/tile/ImageTile.js","webpack:///src/layer/tile/Tile.js","webpack:///src/vendor/BoxHelper.js","webpack:///src/layer/tile/ImageTileLayerBaseMaterial.js","webpack:///~/lodash.throttle/index.js","webpack:///~/lodash.throttle/~/lodash.debounce/index.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_22__","__WEBPACK_EXTERNAL_MODULE_24__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_World","_World2","_controlsIndex","_controlsIndex2","_layerEnvironmentEnvironmentLayer","_layerEnvironmentEnvironmentLayer2","_layerTileImageTileLayer","_layerTileImageTileLayer2","_geoPoint","_geoPoint2","_geoLatLon","_geoLatLon2","VIZI","version","World","Controls","EnvironmentLayer","ImageTileLayer","Point","LatLon","_classCallCheck","instance","Constructor","TypeError","_inherits","subClass","superClass","prototype","create","constructor","enumerable","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","i","length","descriptor","key","protoProps","staticProps","_get","_x","_x2","_x3","_again","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","getter","get","parent","getPrototypeOf","_eventemitter3","_eventemitter32","_lodashAssign","_lodashAssign2","_geoCRSIndex","_geoCRSIndex2","_engineEngine","_engineEngine2","_EventEmitter","domId","options","defaults","crs","EPSG3857","_layers","_controls","_initContainer","_initEngine","_initEvents","_update","_container","document","getElementById","_engine","on","_onControlsMoveEnd","point","_point","x","z","_resetView","pointToLatLon","latlon","emit","_moveStart","_move","_moveEnd","_lastPosition","delta","clock","getDelta","window","requestAnimationFrame","bind","forEach","controls","update","_originLatlon","_originPoint","project","latLonToPoint","projectedPoint","_subtract","add","unproject","_camera","layer","_addToWorld","push","_scene","_layer","layerIndex","indexOf","splice","remove","destroy","EE","fn","context","once","EventEmitter","prefix","_events","listeners","event","exists","evt","available","l","ee","Array","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","listener","events","removeAllListeners","off","addListener","setMaxListeners","prefixed","isIndex","reIsUint","test","MAX_SAFE_INTEGER","assignValue","objValue","eq","objectProto","hasOwnProperty","baseProperty","copyObject","source","copyObjectWith","customizer","index","newValue","createAssigner","assigner","rest","sources","guard","isIterateeCall","isObject","type","isArrayLike","other","isFunction","isLength","getLength","tag","objectToString","funcTag","genTag","keys","toString","assign","baseTimes","n","iteratee","result","baseHas","baseKeys","nativeKeys","indexKeys","isArray","isString","isArguments","String","isPrototype","Ctor","proto","isArrayLikeObject","propertyIsEnumerable","argsTag","isObjectLike","stringTag","isProto","indexes","skipIndexes","func","thisArg","start","FUNC_ERROR_TEXT","nativeMax","toInteger","array","otherArgs","toNumber","INFINITY","sign","MAX_INTEGER","remainder","valueOf","replace","reTrim","isBinary","reIsBinary","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","parseInt","Math","max","_CRSEPSG3857","_CRSEPSG38572","_CRSEPSG3395","_CRSEPSG33952","_CRSEPSG4326","_CRSEPSG43262","_CRSSimple","_CRSSimple2","_CRSProj4","_CRSProj42","CRS","EPSG900913","EPSG3395","EPSG4326","Simple","Proj4","_CRSEarth","_CRSEarth2","_projectionProjectionSphericalMercator","_projectionProjectionSphericalMercator2","_utilTransformation","_utilTransformation2","_EPSG3857","code","projection","transformScale","PI","R","transformation","scale","_CRS","_CRS2","_LatLon","Earth","wrapLon","distance","latlon1","latlon2","accurate","lat1","lat2","a","rad","lat","lon1","lon","lon2","deltaLat","deltaLon","halfDeltaLat","halfDeltaLon","sin","cos","atan2","sqrt","acos","min","pointScale","metresToProjected","metres","projectedToMetres","projectedUnits","metresToWorld","zoom","projectedMetres","scaledMetres","worldToMetres","worldUnits","realMetres","_LatLon2","_Point","_Point2","_utilWrapNum","_utilWrapNum2","scaleFactor","_transform","untransformedPoint","untransform","pow","log","LN2","getProjectedBounds","infinite","b","bounds","s","transform","wrapLatLon","wrapLat","alt","isNaN","Error","lng","y","round","clone","_add","wrapNum","range","includeMax","d","SphericalMercator","MAX_LATITUDE","ECC","ECC2","atan","exp","k","sinLat","sinLat2","cosLat","v","h","Transformation","_a","_b","_c","_d","_projectionProjectionMercator","_projectionProjectionMercator2","_EPSG3395","Mercator","R_MINOR","r","tmp","e","con","ts","tan","phi","dphi","abs","_projectionProjectionLatLon","_projectionProjectionLatLon2","_EPSG4326","ProjectionLatLon","m1","m2","m3","m4","p1","p2","p3","latlen","lonlen","_Simple","dx","dy","_projectionProjectionProj4","_projectionProjectionProj42","_Proj4","def","diffX","diffY","halfX","halfY","scaleX","scaleY","offsetX","offsetY","_proj4","_proj42","proj","forward","inverse","bottomLeft","topRight","_three","_three2","_Scene","_Scene2","_Renderer","_Renderer2","_Camera","_Camera2","Engine","container","console","_renderer","Clock","_frustum","Frustum","render","scene","Scene","fog","Fog","renderer","WebGLRenderer","antialias","setClearColor","color","gammaInput","gammaOutput","appendChild","domElement","updateSize","setSize","clientWidth","clientHeight","addEventListener","camera","PerspectiveCamera","position","aspect","updateProjectionMatrix","_ControlsOrbit","_ControlsOrbit2","Orbit","_vendorOrbitControls","_vendorOrbitControls2","_this","_world","animate","pointDelta","metresDelta","angle","angleDelta","noZoom","world","addControls","maxPolarAngle","OrbitControls","getAutoRotationAngle","scope","autoRotateSpeed","getZoomScale","zoomSpeed","rotateLeft","thetaDelta","rotateUp","phiDelta","dollyIn","dollyScale","OrthographicCamera","minZoom","maxZoom","zoomChanged","warn","enableZoom","dollyOut","handleMouseDownRotate","rotateStart","set","clientX","clientY","handleMouseDownDolly","dollyStart","handleMouseDownPan","panStart","handleMouseMoveRotate","rotateEnd","rotateDelta","subVectors","element","body","rotateSpeed","copy","handleMouseMoveDolly","dollyEnd","dollyDelta","handleMouseMovePan","panEnd","panDelta","pan","handleMouseUp","handleMouseWheel","wheelDelta","detail","handleKeyDown","keyCode","UP","keyPanSpeed","BOTTOM","LEFT","RIGHT","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","handleTouchEnd","onMouseDown","enabled","preventDefault","button","mouseButtons","ORBIT","enableRotate","state","STATE","ROTATE","ZOOM","DOLLY","PAN","enablePan","NONE","onMouseMove","onMouseUp","dispatchEvent","startEvent","removeEventListener","endEvent","onMouseWheel","stopPropagation","onKeyDown","enableKeys","onTouchStart","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","onTouchMove","onTouchEnd","onContextMenu","Vector3","minDistance","maxDistance","Infinity","minPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","autoRotate","MOUSE","MIDDLE","target0","position0","zoom0","getPolarAngle","getAzimuthalAngle","theta","reset","changeEvent","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","sub","applyQuaternion","EPS","radius","panOffset","lookAt","distanceToSquared","dot","quaternion","dispose","Vector2","panLeft","objectMatrix","te","elements","multiplyScalar","panUp","adjDist","deltaX","deltaY","targetDistance","fov","matrix","right","left","top","bottom","EventDispatcher","center","noRotate","noPan","noKeys","staticMoving","constraint","dynamicDampingFactor","_Layer2","_Layer3","_Layer","_initLights","directionalLight","DirectionalLight","intesity","directionalLight2","helper","DirectionalLightHelper","helper2","size","step","gridHelper","GridHelper","_engineScene","Layer","Object3D","addLayer","_onAdd","_TileLayer2","_TileLayer3","_ImageTile","_ImageTile2","_ImageTileLayerBaseMaterial","_ImageTileLayerBaseMaterial2","_lodashThrottle","_lodashThrottle2","_TileLayer","path","_path","geom","PlaneBufferGeometry","mesh","Mesh","rotation","_baseLayer","setTimeout","_calculateLOD","_throttledWorldUpdate","_onWorldUpdate","_onWorldMove","_moveBaseLayer","quadcode","geometry","material","map","_TileCache","_TileCache2","TileLayer","maxCache","_tileCache","tile","_destroyTile","_minLOD","_maxLOD","_tiles","getCamera","projScreenMatrix","Matrix4","multiplyMatrices","projectionMatrix","matrixWorldInverse","setFromMatrix","getBounds","intersectsBox","Box3","_this2","_stop","_updateFrustum","checkList","_checklist","_requestTile","_divide","_removeTiles","_tileInFrustum","getMesh","isReady","requestTileAsync","currentItem","count","getQuadcode","_screenSpaceError","minDepth","maxDepth","quality","getCenter","dist","error","getSide","children","getTile","_createTile","setTile","_lruCache","_lruCache2","TileCache","cacheLimit","onDestroyTile","_cache","priv","val","sym","symbols","makeSymbol","naiveLength","LRUCache","lc","stale","maxAge","forEachStep","self","node","thisp","hit","isStale","del","doUse","unshiftNode","diff","Date","now","trim","walker","tail","prev","removeNode","Entry","Map","util","Yallist","hasSymbol","Symbol","mL","allowStale","mA","lC","rforEach","head","next","toArray","values","dump","filter","dumpLru","inspect","opts","str","extras","as","didFirst","item","split","join","has","unshift","peek","pop","load","arr","expiresAt","prune","process","env","npm_package_name","npm_lifecycle_script","TEST_PSEUDOMAP","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","run","clearTimeout","Item","fun","noop","nextTick","title","browser","argv","versions","binding","name","cwd","chdir","dir","umask","PseudoMap","clear","kv","same","_index","find","data","_data","res","entries","global","ctx","seen","stylize","stylizeNoColor","depth","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","style","styles","arrayToHash","hash","idx","recurseTimes","ret","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","RegExp","isDate","base","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","isNumber","isNull","match","line","substr","numLinesEst","reduce","cur","ar","arg","isNullOrUndefined","isSymbol","re","isPrimitive","o","pad","timestamp","time","getHours","getMinutes","getSeconds","getDate","months","getMonth","prop","formatRegExp","format","f","objects","Number","_","deprecate","msg","deprecated","warned","throwDeprecation","traceDeprecation","trace","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","toUpperCase","pid","bold","italic","underline","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","regexp","isBuffer","inherits","origin","fill","readUInt8","ctor","superCtor","super_","TempCtor","list","Node","pushNode","shift","forEachReverse","getReverse","mapReverse","initial","acc","reduceReverse","toArrayReverse","from","to","sliceReverse","reverse","_Tile2","_Tile3","_vendorBoxHelper","_vendorBoxHelper2","ImageTile","_Tile","_mesh","_createMesh","_requestTexture","_abortRequest","_image","_center","_side","MeshBasicMaterial","depthWrite","localMesh","box","_createDebugMesh","canvas","createElement","width","height","getContext","font","fillStyle","fillText","_quadcode","_tile","texture","Texture","magFilter","LinearFilter","minFilter","LinearMipMapLinearFilter","anisotropy","needsUpdate","transparent","urlParams","url","_getTileURL","image","_texture","_ready","crossOrigin","src","r2d","tileURLRegex","Tile","_quadcodeToTile","_boundsLatLon","_tileBoundsWGS84","_boundsWorld","_tileBoundsFromWGS84","_boundsToCenter","_getSide","child","fromCharCode","floor","random","lastIndex","mask","q","boundsWGS84","sw","ne","_tile2lon","w","_tile2lat","BoxHelper","indices","Uint16Array","positions","Float32Array","BufferGeometry","setIndex","BufferAttribute","addAttribute","LineSegments","LineBasicMaterial","linewidth","setFromObject","isEmpty","attributes","computeBoundingSphere","colour","fillRect","throttle","wait","leading","trailing","debounce","maxWait","cancel","timeoutId","maxTimeoutId","lastCalled","trailingCall","complete","isCalled","delayed","remaining","stamp","flush","maxDelayed","debounced","leadingCall"],"mappings":"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","file":"vizicities.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _World = __webpack_require__(1);\n\t\n\tvar _World2 = _interopRequireDefault(_World);\n\t\n\tvar _controlsIndex = __webpack_require__(28);\n\t\n\tvar _controlsIndex2 = _interopRequireDefault(_controlsIndex);\n\t\n\tvar _layerEnvironmentEnvironmentLayer = __webpack_require__(31);\n\t\n\tvar _layerEnvironmentEnvironmentLayer2 = _interopRequireDefault(_layerEnvironmentEnvironmentLayer);\n\t\n\tvar _layerTileImageTileLayer = __webpack_require__(33);\n\t\n\tvar _layerTileImageTileLayer2 = _interopRequireDefault(_layerTileImageTileLayer);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar VIZI = {\n\t version: '0.3',\n\t\n\t // Public API\n\t World: _World2['default'],\n\t Controls: _controlsIndex2['default'],\n\t EnvironmentLayer: _layerEnvironmentEnvironmentLayer2['default'],\n\t ImageTileLayer: _layerTileImageTileLayer2['default'],\n\t Point: _geoPoint2['default'],\n\t LatLon: _geoLatLon2['default']\n\t};\n\t\n\texports['default'] = VIZI;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _geoCRSIndex = __webpack_require__(6);\n\t\n\tvar _geoCRSIndex2 = _interopRequireDefault(_geoCRSIndex);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _engineEngine = __webpack_require__(23);\n\t\n\tvar _engineEngine2 = _interopRequireDefault(_engineEngine);\n\t\n\t// Pretty much any event someone using ViziCities would need will be emitted or\n\t// proxied by World (eg. render events, etc)\n\t\n\tvar World = (function (_EventEmitter) {\n\t _inherits(World, _EventEmitter);\n\t\n\t function World(domId, options) {\n\t _classCallCheck(this, World);\n\t\n\t _get(Object.getPrototypeOf(World.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t crs: _geoCRSIndex2['default'].EPSG3857\n\t };\n\t\n\t this.options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._layers = [];\n\t this._controls = [];\n\t\n\t this._initContainer(domId);\n\t this._initEngine();\n\t this._initEvents();\n\t\n\t // Kick off the update and render loop\n\t this._update();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(World, [{\n\t key: '_initContainer',\n\t value: function _initContainer(domId) {\n\t this._container = document.getElementById(domId);\n\t }\n\t }, {\n\t key: '_initEngine',\n\t value: function _initEngine() {\n\t this._engine = (0, _engineEngine2['default'])(this._container);\n\t\n\t // Engine events\n\t //\n\t // Consider proxying these through events on World for public access\n\t // this._engine.on('preRender', () => {});\n\t // this._engine.on('postRender', () => {});\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t this.on('controlsMoveEnd', this._onControlsMoveEnd);\n\t }\n\t }, {\n\t key: '_onControlsMoveEnd',\n\t value: function _onControlsMoveEnd(point) {\n\t var _point = (0, _geoPoint2['default'])(point.x, point.z);\n\t this._resetView(this.pointToLatLon(_point), _point);\n\t }\n\t\n\t // Reset world view\n\t }, {\n\t key: '_resetView',\n\t value: function _resetView(latlon, point) {\n\t this.emit('preResetView');\n\t\n\t this._moveStart();\n\t this._move(latlon, point);\n\t this._moveEnd();\n\t\n\t this.emit('postResetView');\n\t }\n\t }, {\n\t key: '_moveStart',\n\t value: function _moveStart() {\n\t this.emit('moveStart');\n\t }\n\t }, {\n\t key: '_move',\n\t value: function _move(latlon, point) {\n\t this._lastPosition = latlon;\n\t this.emit('move', latlon, point);\n\t }\n\t }, {\n\t key: '_moveEnd',\n\t value: function _moveEnd() {\n\t this.emit('moveEnd');\n\t }\n\t }, {\n\t key: '_update',\n\t value: function _update() {\n\t var delta = this._engine.clock.getDelta();\n\t\n\t // Once _update is called it will run forever, for now\n\t window.requestAnimationFrame(this._update.bind(this));\n\t\n\t // Update controls\n\t this._controls.forEach(function (controls) {\n\t controls.update();\n\t });\n\t\n\t this.emit('preUpdate');\n\t this._engine.update(delta);\n\t this.emit('postUpdate');\n\t }\n\t\n\t // Set world view\n\t }, {\n\t key: 'setView',\n\t value: function setView(latlon) {\n\t // Store initial geographic coordinate for the [0,0,0] world position\n\t //\n\t // The origin point doesn't move in three.js / 3D space so only set it once\n\t // here instead of every time _resetView is called\n\t //\n\t // If it was updated every time then coorindates would shift over time and\n\t // would be out of place / context with previously-placed points (0,0 would\n\t // refer to a different point each time)\n\t this._originLatlon = latlon;\n\t this._originPoint = this.project(latlon);\n\t\n\t this._resetView(latlon);\n\t return this;\n\t }\n\t\n\t // Return world geographic position\n\t }, {\n\t key: 'getPosition',\n\t value: function getPosition() {\n\t return this._lastPosition;\n\t }\n\t\n\t // Transform geographic coordinate to world point\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the origin point of the projection (not the world)\n\t }, {\n\t key: 'project',\n\t value: function project(latlon) {\n\t return this.options.crs.latLonToPoint((0, _geoLatLon2['default'])(latlon));\n\t }\n\t\n\t // Transform world point to geographic coordinate\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a point relative to the origin point of the\n\t // projection (not the world) and returns a geographic coordinate\n\t }, {\n\t key: 'unproject',\n\t value: function unproject(point) {\n\t return this.options.crs.pointToLatLon((0, _geoPoint2['default'])(point));\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the three.js / 3D origin (0,0)\n\t }, {\n\t key: 'latLonToPoint',\n\t value: function latLonToPoint(latlon) {\n\t var projectedPoint = this.project((0, _geoLatLon2['default'])(latlon));\n\t return projectedPoint._subtract(this._originPoint);\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a point relative to the three.js / 3D origin (0,0)\n\t // and returns the exact geographic coordinate at that point\n\t }, {\n\t key: 'pointToLatLon',\n\t value: function pointToLatLon(point) {\n\t var projectedPoint = (0, _geoPoint2['default'])(point).add(this._originPoint);\n\t return this.unproject(projectedPoint);\n\t }\n\t\n\t // Unsure if it's a good idea to expose this here for components like\n\t // GridLayer to use (eg. to keep track of a frustum)\n\t }, {\n\t key: 'getCamera',\n\t value: function getCamera() {\n\t return this._engine._camera;\n\t }\n\t }, {\n\t key: 'addLayer',\n\t value: function addLayer(layer) {\n\t layer._addToWorld(this);\n\t\n\t this._layers.push(layer);\n\t\n\t // Could move this into Layer but it'll do here for now\n\t this._engine._scene.add(layer._layer);\n\t\n\t this.emit('layerAdded', layer);\n\t return this;\n\t }\n\t\n\t // Remove layer and perform clean up operations\n\t }, {\n\t key: 'removeLayer',\n\t value: function removeLayer(layer) {\n\t var layerIndex = this._layers.indexOf(layer);\n\t\n\t if (layerIndex > -1) {\n\t // Remove from this._layers\n\t this._layers.splice(layerIndex, 1);\n\t };\n\t\n\t this._engine._scene.remove(layer._layer);\n\t\n\t layer.destroy();\n\t\n\t this.emit('layerRemoved');\n\t return this;\n\t }\n\t }, {\n\t key: 'addControls',\n\t value: function addControls(controls) {\n\t controls._addToWorld(this);\n\t\n\t this._controls.push(controls);\n\t\n\t this.emit('controlsAdded', controls);\n\t return this;\n\t }\n\t }, {\n\t key: 'removeControls',\n\t value: function removeControls(controls) {}\n\t }]);\n\t\n\t return World;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (domId, options) {\n\t return new World(domId, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t//\n\t// We store our EE objects in a plain object whose properties are event names.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// `~` to make sure that the built-in object properties are not overridden or\n\t// used as an attack vector.\n\t// We also assume that `Object.create(null)` is available when the event name\n\t// is an ES6 Symbol.\n\t//\n\tvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\t\n\t/**\n\t * Representation of a single EventEmitter function.\n\t *\n\t * @param {Function} fn Event handler to be called.\n\t * @param {Mixed} context Context for function execution.\n\t * @param {Boolean} once Only emit once\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\t\n\t/**\n\t * Minimal EventEmitter interface that is molded against the Node.js\n\t * EventEmitter interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() { /* Nothing to set */ }\n\t\n\t/**\n\t * Holds the assigned EventEmitters by name.\n\t *\n\t * @type {Object}\n\t * @private\n\t */\n\tEventEmitter.prototype._events = undefined;\n\t\n\t/**\n\t * Return a list of assigned event listeners.\n\t *\n\t * @param {String} event The events that should be listed.\n\t * @param {Boolean} exists We only need to know if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events && this._events[evt];\n\t\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\t\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\t\n\t return ee;\n\t};\n\t\n\t/**\n\t * Emit an event to all registered event listeners.\n\t *\n\t * @param {String} event The name of the event.\n\t * @returns {Boolean} Indication if we've emitted an event.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return false;\n\t\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\t\n\t if ('function' === typeof listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\t\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\t\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\t\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\t\n\t return true;\n\t};\n\t\n\t/**\n\t * Register a new EventListener for the given event.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Functon} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Add an EventListener that's only called once.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove event listeners.\n\t *\n\t * @param {String} event The event we want to remove.\n\t * @param {Function} fn The listener that we need to find.\n\t * @param {Mixed} context Only remove listeners matching this context.\n\t * @param {Boolean} once Only remove once listeners.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return this;\n\t\n\t var listeners = this._events[evt]\n\t , events = [];\n\t\n\t if (fn) {\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn !== fn\n\t || (once && !listeners.once)\n\t || (context && listeners.context !== context)\n\t ) {\n\t events.push(listeners);\n\t }\n\t } else {\n\t for (var i = 0, length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) {\n\t this._events[evt] = events.length === 1 ? events[0] : events;\n\t } else {\n\t delete this._events[evt];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove all listeners or only the listeners for the specified event.\n\t *\n\t * @param {String} event The event want to remove all listeners for.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t if (!this._events) return this;\n\t\n\t if (event) delete this._events[prefix ? prefix + event : event];\n\t else this._events = prefix ? {} : Object.create(null);\n\t\n\t return this;\n\t};\n\t\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\t\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\t\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\t\n\t//\n\t// Expose the module.\n\t//\n\tif (true) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar keys = __webpack_require__(4),\n\t rest = __webpack_require__(5);\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if ((!eq(objValue, value) ||\n\t (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object) {\n\t return copyObjectWith(source, props, object);\n\t}\n\t\n\t/**\n\t * This function is like `copyObject` except that it accepts a function to\n\t * customize copied values.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObjectWith(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index],\n\t newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\t\n\t assignValue(object, key, newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return rest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Checks if the provided arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Assigns own enumerable properties of source objects to the destination\n\t * object. Source objects are applied from left to right. Subsequent sources\n\t * overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.e = 5;\n\t * }\n\t *\n\t * Foo.prototype.d = 4;\n\t * Bar.prototype.f = 6;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3, 'e': 5 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t copyObject(source, keys(source), object);\n\t});\n\t\n\tmodule.exports = assign;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t stringTag = '[object String]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar getPrototypeOf = Object.getPrototypeOf,\n\t propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeKeys = Object.keys;\n\t\n\t/**\n\t * The base implementation of `_.has` without support for deep paths.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} key The key to check.\n\t * @returns {boolean} Returns `true` if `key` exists, else `false`.\n\t */\n\tfunction baseHas(object, key) {\n\t // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n\t // that are composed entirely of index properties, return `false` for\n\t // `hasOwnProperty` checks of them.\n\t return hasOwnProperty.call(object, key) ||\n\t (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't skip the constructor\n\t * property of prototypes or treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @type Function\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t return nativeKeys(Object(object));\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Creates an array of index keys for `object` values of arrays,\n\t * `arguments` objects, and strings, otherwise `null` is returned.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array|null} Returns index keys, else `null`.\n\t */\n\tfunction indexKeys(object) {\n\t var length = object ? object.length : undefined;\n\t if (isLength(length) &&\n\t (isArray(object) || isString(object) || isArguments(object))) {\n\t return baseTimes(length, String);\n\t }\n\t return null;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\tfunction isString(value) {\n\t return typeof value == 'string' ||\n\t (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n\t}\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t var isProto = isPrototype(object);\n\t if (!(isProto || isArrayLike(object))) {\n\t return baseKeys(object);\n\t }\n\t var indexes = indexKeys(object),\n\t skipIndexes = !!indexes,\n\t result = indexes || [],\n\t length = result.length;\n\t\n\t for (var key in object) {\n\t if (baseHas(object, key) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n\t !(isProto && key == 'constructor')) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\tmodule.exports = keys;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar INFINITY = 1 / 0,\n\t MAX_INTEGER = 1.7976931348623157e+308,\n\t NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {...*} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t var length = args.length;\n\t switch (length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Creates a function that invokes `func` with the `this` binding of the\n\t * created function and arguments from `start` and beyond provided as an array.\n\t *\n\t * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t * @example\n\t *\n\t * var say = _.rest(function(what, names) {\n\t * return what + ' ' + _.initial(names).join(', ') +\n\t * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n\t * });\n\t *\n\t * say('hello', 'fred', 'barney', 'pebbles');\n\t * // => 'hello fred, barney, & pebbles'\n\t */\n\tfunction rest(func, start) {\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t switch (start) {\n\t case 0: return func.call(this, array);\n\t case 1: return func.call(this, args[0], array);\n\t case 2: return func.call(this, args[0], args[1], array);\n\t }\n\t var otherArgs = Array(start + 1);\n\t index = -1;\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to an integer.\n\t *\n\t * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.toInteger(3);\n\t * // => 3\n\t *\n\t * _.toInteger(Number.MIN_VALUE);\n\t * // => 0\n\t *\n\t * _.toInteger(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toInteger('3');\n\t * // => 3\n\t */\n\tfunction toInteger(value) {\n\t if (!value) {\n\t return value === 0 ? value : 0;\n\t }\n\t value = toNumber(value);\n\t if (value === INFINITY || value === -INFINITY) {\n\t var sign = (value < 0 ? -1 : 1);\n\t return sign * MAX_INTEGER;\n\t }\n\t var remainder = value % 1;\n\t return value === value ? (remainder ? value - remainder : value) : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = rest;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _CRSEPSG3857 = __webpack_require__(7);\n\t\n\tvar _CRSEPSG38572 = _interopRequireDefault(_CRSEPSG3857);\n\t\n\tvar _CRSEPSG3395 = __webpack_require__(15);\n\t\n\tvar _CRSEPSG33952 = _interopRequireDefault(_CRSEPSG3395);\n\t\n\tvar _CRSEPSG4326 = __webpack_require__(17);\n\t\n\tvar _CRSEPSG43262 = _interopRequireDefault(_CRSEPSG4326);\n\t\n\tvar _CRSSimple = __webpack_require__(19);\n\t\n\tvar _CRSSimple2 = _interopRequireDefault(_CRSSimple);\n\t\n\tvar _CRSProj4 = __webpack_require__(20);\n\t\n\tvar _CRSProj42 = _interopRequireDefault(_CRSProj4);\n\t\n\tvar CRS = {};\n\t\n\tCRS.EPSG3857 = _CRSEPSG38572['default'];\n\tCRS.EPSG900913 = _CRSEPSG3857.EPSG900913;\n\tCRS.EPSG3395 = _CRSEPSG33952['default'];\n\tCRS.EPSG4326 = _CRSEPSG43262['default'];\n\tCRS.Simple = _CRSSimple2['default'];\n\tCRS.Proj4 = _CRSProj42['default'];\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionSphericalMercator = __webpack_require__(13);\n\t\n\tvar _projectionProjectionSphericalMercator2 = _interopRequireDefault(_projectionProjectionSphericalMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3857 = {\n\t code: 'EPSG:3857',\n\t projection: _projectionProjectionSphericalMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3857 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3857);\n\t\n\tvar EPSG900913 = (0, _lodashAssign2['default'])({}, EPSG3857, {\n\t code: 'EPSG:900913'\n\t});\n\t\n\texports.EPSG900913 = EPSG900913;\n\texports['default'] = EPSG3857;\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Earth is the base class for all CRS representing Earth.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar Earth = {\n\t wrapLon: [-180, 180],\n\t\n\t R: 6378137,\n\t\n\t // Distance between two geographical points using spherical law of cosines\n\t // approximation or Haversine\n\t //\n\t // See: http://www.movable-type.co.uk/scripts/latlong.html\n\t distance: function distance(latlon1, latlon2, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var lat1;\n\t var lat2;\n\t\n\t var a;\n\t\n\t if (!accurate) {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\t\n\t return this.R * Math.acos(Math.min(a, 1));\n\t } else {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t var lon1 = latlon1.lon * rad;\n\t var lon2 = latlon2.lon * rad;\n\t\n\t var deltaLat = lat2 - lat1;\n\t var deltaLon = lon2 - lon1;\n\t\n\t var halfDeltaLat = deltaLat / 2;\n\t var halfDeltaLon = deltaLon / 2;\n\t\n\t a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\t\n\t var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\n\t return this.R * c;\n\t }\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Defaults to a scale factor of 1 if no calculation method exists\n\t //\n\t // Probably need to run this through the CRS transformation or similar so the\n\t // resulting scale is relative to the dimensions of the world space\n\t // Eg. 1 metre in projected space is likly scaled up or down to some other\n\t // number\n\t pointScale: function pointScale(latlon, accurate) {\n\t return this.projection.pointScale ? this.projection.pointScale(latlon, accurate) : [1, 1];\n\t },\n\t\n\t // Convert real metres to projected units\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t metresToProjected: function metresToProjected(metres, pointScale) {\n\t return metres * pointScale[1];\n\t },\n\t\n\t // Convert projected units to real metres\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t projectedToMetres: function projectedToMetres(projectedUnits, pointScale) {\n\t return projectedUnits / pointScale[1];\n\t },\n\t\n\t // Convert real metres to a value in world (WebGL) units\n\t metresToWorld: function metresToWorld(metres, pointScale, zoom) {\n\t // Transform metres to projected metres using the latitude point scale\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t var projectedMetres = this.metresToProjected(metres, pointScale);\n\t\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t // Scale projected metres\n\t var scaledMetres = scale * (this.transformScale * projectedMetres) / pointScale[1];\n\t\n\t return scaledMetres;\n\t },\n\t\n\t // Convert world (WebGL) units to a value in real metres\n\t worldToMetres: function worldToMetres(worldUnits, pointScale, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var projectedUnits = worldUnits / scale / this.transformScale * pointScale[1];\n\t var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\t\n\t return realMetres;\n\t }\n\t};\n\t\n\texports['default'] = (0, _lodashAssign2['default'])({}, _CRS2['default'], Earth);\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar _utilWrapNum = __webpack_require__(12);\n\t\n\tvar _utilWrapNum2 = _interopRequireDefault(_utilWrapNum);\n\t\n\tvar CRS = {\n\t // Scale factor determines final dimensions of world space\n\t //\n\t // Projection transformation in range -1 to 1 is multiplied by scale factor to\n\t // find final world coordinates\n\t //\n\t // Scale factor can be considered as half the amount of the desired dimension\n\t // for the largest side when transformation is equal to 1 or -1, or as the\n\t // distance between 0 and 1 on the largest side\n\t //\n\t // For example, if you want the world dimensions to be between -1000 and 1000\n\t // then the scale factor will be 1000\n\t scaleFactor: 1000000,\n\t\n\t // Converts geo coords to pixel / WebGL ones\n\t latLonToPoint: function latLonToPoint(latlon, zoom) {\n\t var projectedPoint = this.projection.project(latlon);\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t return this.transformation._transform(projectedPoint, scale);\n\t },\n\t\n\t // Converts pixel / WebGL coords to geo coords\n\t pointToLatLon: function pointToLatLon(point, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var untransformedPoint = this.transformation.untransform(point, scale);\n\t\n\t return this.projection.unproject(untransformedPoint);\n\t },\n\t\n\t // Converts geo coords to projection-specific coords (e.g. in meters)\n\t project: function project(latlon) {\n\t return this.projection.project(latlon);\n\t },\n\t\n\t // Converts projected coords to geo coords\n\t unproject: function unproject(point) {\n\t return this.projection.unproject(point);\n\t },\n\t\n\t // If zoom is provided, returns the map width in pixels for a given zoom\n\t // Else, provides fixed scale value\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom >= 0) {\n\t return 256 * Math.pow(2, zoom);\n\t // Else, return fixed scale value to expand projected coordinates from\n\t // their 0 to 1 range into something more practical\n\t } else {\n\t return this.scaleFactor;\n\t }\n\t },\n\t\n\t // Returns zoom level for a given scale value\n\t // This only works with a scale value that is based on map pixel width\n\t zoom: function zoom(scale) {\n\t return Math.log(scale / 256) / Math.LN2;\n\t },\n\t\n\t // Returns the bounds of the world in projected coords if applicable\n\t getProjectedBounds: function getProjectedBounds(zoom) {\n\t if (this.infinite) {\n\t return null;\n\t }\n\t\n\t var b = this.projection.bounds;\n\t var s = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t s /= 2;\n\t }\n\t\n\t // Bottom left\n\t var min = this.transformation.transform((0, _Point2['default'])(b[0]), s);\n\t\n\t // Top right\n\t var max = this.transformation.transform((0, _Point2['default'])(b[1]), s);\n\t\n\t return [min, max];\n\t },\n\t\n\t // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n\t // wrapLon: [min, max],\n\t // wrapLat: [min, max],\n\t\n\t // If true, the coordinate space will be unbounded (infinite in all directions)\n\t // infinite: false,\n\t\n\t // Wraps geo coords in certain ranges if applicable\n\t wrapLatLon: function wrapLatLon(latlon) {\n\t var lat = this.wrapLat ? (0, _utilWrapNum2['default'])(latlon.lat, this.wrapLat, true) : latlon.lat;\n\t var lon = this.wrapLon ? (0, _utilWrapNum2['default'])(latlon.lon, this.wrapLon, true) : latlon.lon;\n\t var alt = latlon.alt;\n\t\n\t return (0, _LatLon2['default'])(lat, lon, alt);\n\t }\n\t};\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * LatLon is a helper class for ensuring consistent geographic coordinates.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n\t */\n\t\n\tvar LatLon = (function () {\n\t function LatLon(lat, lon, alt) {\n\t _classCallCheck(this, LatLon);\n\t\n\t if (isNaN(lat) || isNaN(lon)) {\n\t throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n\t }\n\t\n\t this.lat = +lat;\n\t this.lon = +lon;\n\t\n\t if (alt !== undefined) {\n\t this.alt = +alt;\n\t }\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t //\n\t // Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n\t // Also converts between lng and lon\n\t\n\t _createClass(LatLon, [{\n\t key: 'clone',\n\t value: function clone() {\n\t return new LatLon(this.lat, this.lon, this.alt);\n\t }\n\t }]);\n\t\n\t return LatLon;\n\t})();\n\t\n\texports['default'] = function (a, b, c) {\n\t if (a instanceof LatLon) {\n\t return a;\n\t }\n\t if (Array.isArray(a) && typeof a[0] !== 'object') {\n\t if (a.length === 3) {\n\t return new LatLon(a[0], a[1], a[2]);\n\t }\n\t if (a.length === 2) {\n\t return new LatLon(a[0], a[1]);\n\t }\n\t return null;\n\t }\n\t if (a === undefined || a === null) {\n\t return a;\n\t }\n\t if (typeof a === 'object' && 'lat' in a) {\n\t return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n\t }\n\t if (b === undefined) {\n\t return null;\n\t }\n\t return new LatLon(a, b, c);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * Point is a helper class for ensuring consistent world positions.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n\t */\n\t\n\tvar Point = (function () {\n\t function Point(x, y, round) {\n\t _classCallCheck(this, Point);\n\t\n\t this.x = round ? Math.round(x) : x;\n\t this.y = round ? Math.round(y) : y;\n\t }\n\t\n\t // Accepts (point), ([x, y]) and (x, y, round)\n\t\n\t _createClass(Point, [{\n\t key: \"clone\",\n\t value: function clone() {\n\t return new Point(this.x, this.y);\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"add\",\n\t value: function add(point) {\n\t return this.clone()._add(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_add\",\n\t value: function _add(point) {\n\t this.x += point.x;\n\t this.y += point.y;\n\t return this;\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"subtract\",\n\t value: function subtract(point) {\n\t return this.clone()._subtract(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_subtract\",\n\t value: function _subtract(point) {\n\t this.x -= point.x;\n\t this.y -= point.y;\n\t return this;\n\t }\n\t }]);\n\t\n\t return Point;\n\t})();\n\t\n\tvar _point = function _point(x, y, round) {\n\t if (x instanceof Point) {\n\t return x;\n\t }\n\t if (Array.isArray(x)) {\n\t return new Point(x[0], x[1]);\n\t }\n\t if (x === undefined || x === null) {\n\t return x;\n\t }\n\t return new Point(x, y, round);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports[\"default\"] = _point;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/*\n\t * Wrap the given number to lie within a certain range (eg. longitude)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n\t */\n\t\n\tvar wrapNum = function wrapNum(x, range, includeMax) {\n\t var max = range[1];\n\t var min = range[0];\n\t var d = max - min;\n\t return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n\t};\n\t\n\texports[\"default\"] = wrapNum;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n\t * used by default.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar SphericalMercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t MAX_LATITUDE: 85.0511287798,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var max = this.MAX_LATITUDE;\n\t var lat = Math.max(Math.min(max, latlon.lat), -max);\n\t var sin = Math.sin(lat * d);\n\t\n\t return (0, _Point2['default'])(this.R * latlon.lon * d, this.R * Math.log((1 + sin) / (1 - sin)) / 2);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t\n\t return (0, _LatLon2['default'])((2 * Math.atan(Math.exp(point.y / this.R)) - Math.PI / 2) * d, point.x * d / this.R);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Accurate scale factor uses proper Web Mercator scaling\n\t // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t // See: http://jsfiddle.net/robhawkes/yws924cf/\n\t pointScale: function pointScale(latlon, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var k;\n\t\n\t if (!accurate) {\n\t k = 1 / Math.cos(latlon.lat * rad);\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t } else {\n\t var lat = latlon.lat * rad;\n\t var lon = latlon.lon * rad;\n\t\n\t var a = this.R;\n\t\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t\n\t var cosLat = Math.cos(lat);\n\t\n\t // Radius meridian\n\t var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\t\n\t // Radius prime meridian\n\t var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\t\n\t // Scale N/S\n\t var h = a / p / cosLat;\n\t\n\t // Scale E/W\n\t k = a / v / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, h];\n\t }\n\t },\n\t\n\t // Not using this.R due to scoping\n\t bounds: (function () {\n\t var d = 6378137 * Math.PI;\n\t return [[-d, -d], [d, d]];\n\t })()\n\t};\n\t\n\texports['default'] = SphericalMercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * Transformation is an utility class to perform simple point transformations\n\t * through a 2d-matrix.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n\t */\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar Transformation = (function () {\n\t function Transformation(a, b, c, d) {\n\t _classCallCheck(this, Transformation);\n\t\n\t this._a = a;\n\t this._b = b;\n\t this._c = c;\n\t this._d = d;\n\t }\n\t\n\t _createClass(Transformation, [{\n\t key: 'transform',\n\t value: function transform(point, scale) {\n\t // Copy input point as to not destroy the original data\n\t return this._transform(point.clone(), scale);\n\t }\n\t\n\t // Destructive transform (faster)\n\t }, {\n\t key: '_transform',\n\t value: function _transform(point, scale) {\n\t scale = scale || 1;\n\t\n\t point.x = scale * (this._a * point.x + this._b);\n\t point.y = scale * (this._c * point.y + this._d);\n\t return point;\n\t }\n\t }, {\n\t key: 'untransform',\n\t value: function untransform(point, scale) {\n\t scale = scale || 1;\n\t return (0, _geoPoint2['default'])((point.x / scale - this._b) / this._a, (point.y / scale - this._d) / this._c);\n\t }\n\t }]);\n\t\n\t return Transformation;\n\t})();\n\t\n\texports['default'] = Transformation;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionMercator = __webpack_require__(16);\n\t\n\tvar _projectionProjectionMercator2 = _interopRequireDefault(_projectionProjectionMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3395 = {\n\t code: 'EPSG:3395',\n\t projection: _projectionProjectionMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3395 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3395);\n\t\n\texports['default'] = EPSG3395;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Mercator projection that takes into account that the Earth is not a perfect\n\t * sphere. Less popular than spherical mercator; used by projections like\n\t * EPSG:3395.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Mercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t R_MINOR: 6356752.314245179,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var r = this.R;\n\t var y = latlon.lat * d;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var con = e * Math.sin(y);\n\t\n\t var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n\t y = -r * Math.log(Math.max(ts, 1E-10));\n\t\n\t return (0, _Point2['default'])(latlon.lon * d * r, y);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t var r = this.R;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var ts = Math.exp(-point.y / r);\n\t var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\t\n\t for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n\t con = e * Math.sin(phi);\n\t con = Math.pow((1 - con) / (1 + con), e / 2);\n\t dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n\t phi += dphi;\n\t }\n\t\n\t return (0, _LatLon2['default'])(phi * d, point.x * d / r);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t pointScale: function pointScale(latlon) {\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t var cosLat = Math.cos(lat);\n\t\n\t var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t },\n\t\n\t bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n\t};\n\t\n\texports['default'] = Mercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG4326 = {\n\t code: 'EPSG:4326',\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / 180,\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t //\n\t // TODO: Cannot use this.transformScale due to scope\n\t transformation: new _utilTransformation2['default'](1 / 180, 0, -1 / 180, 0)\n\t};\n\t\n\tvar EPSG4326 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG4326);\n\t\n\texports['default'] = EPSG4326;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n\t * and Simple.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar ProjectionLatLon = {\n\t project: function project(latlon) {\n\t return (0, _Point2['default'])(latlon.lon, latlon.lat);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t return (0, _LatLon2['default'])(point.y, point.x);\n\t },\n\t\n\t // Scale factor for converting between real metres and degrees\n\t //\n\t // degrees = realMetres * pointScale\n\t // realMetres = degrees / pointScale\n\t //\n\t // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n\t // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n\t pointScale: function pointScale(latlon) {\n\t var m1 = 111132.92;\n\t var m2 = -559.82;\n\t var m3 = 1.175;\n\t var m4 = -0.0023;\n\t var p1 = 111412.84;\n\t var p2 = -93.5;\n\t var p3 = 0.118;\n\t\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t\n\t var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n\t var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\t\n\t return [1 / latlen, 1 / lonlen];\n\t },\n\t\n\t bounds: [[-180, -90], [180, 90]]\n\t};\n\t\n\texports['default'] = ProjectionLatLon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n\t * maps.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Simple = {\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Straight 1:1 mapping (-1, -1 would be top-left)\n\t transformation: new _utilTransformation2['default'](1, 0, 1, 0),\n\t\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom) {\n\t return Math.pow(2, zoom);\n\t // Else, make no change to scale – may need to increase this or make it a\n\t // user-definable variable\n\t } else {\n\t return 1;\n\t }\n\t },\n\t\n\t zoom: function zoom(scale) {\n\t return Math.log(scale) / Math.LN2;\n\t },\n\t\n\t distance: function distance(latlon1, latlon2) {\n\t var dx = latlon2.lon - latlon1.lon;\n\t var dy = latlon2.lat - latlon1.lat;\n\t\n\t return Math.sqrt(dx * dx + dy * dy);\n\t },\n\t\n\t infinite: true\n\t};\n\t\n\tvar Simple = (0, _lodashAssign2['default'])({}, _CRS2['default'], _Simple);\n\t\n\texports['default'] = Simple;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Proj4 for any Proj4-supported CRS.\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionProj4 = __webpack_require__(21);\n\t\n\tvar _projectionProjectionProj42 = _interopRequireDefault(_projectionProjectionProj4);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Proj4 = function _Proj4(code, def, bounds) {\n\t var projection = (0, _projectionProjectionProj42['default'])(def, bounds);\n\t\n\t // Transformation calcuations\n\t var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n\t var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\t\n\t var halfX = diffX / 2;\n\t var halfY = diffY / 2;\n\t\n\t // This is the raw scale factor\n\t var scaleX = 1 / halfX;\n\t var scaleY = 1 / halfY;\n\t\n\t // Find the minimum scale factor\n\t //\n\t // The minimum scale factor comes from the largest side and is the one\n\t // you want to use for both axis so they stay relative in dimension\n\t var scale = Math.min(scaleX, scaleY);\n\t\n\t // Find amount to offset each axis by to make the central point lie on\n\t // the [0,0] origin\n\t var offsetX = scale * (projection.bounds[0][0] + halfX);\n\t var offsetY = scale * (projection.bounds[0][1] + halfY);\n\t\n\t return {\n\t code: code,\n\t projection: projection,\n\t\n\t transformScale: scale,\n\t\n\t // Map the input to a [-1,1] range with [0,0] in the centre\n\t transformation: new _utilTransformation2['default'](scale, -offsetX, -scale, offsetY)\n\t };\n\t};\n\t\n\tvar Proj4 = function Proj4(code, def, bounds) {\n\t return (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _Proj4(code, def, bounds));\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Proj4 support for any projection.\n\t */\n\t\n\tvar _proj4 = __webpack_require__(22);\n\t\n\tvar _proj42 = _interopRequireDefault(_proj4);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Proj4 = function Proj4(def, bounds) {\n\t var proj = (0, _proj42['default'])(def);\n\t\n\t var project = function project(latlon) {\n\t return (0, _Point2['default'])(proj.forward([latlon.lon, latlon.lat]));\n\t };\n\t\n\t var unproject = function unproject(point) {\n\t var inverse = proj.inverse([point.x, point.y]);\n\t return (0, _LatLon2['default'])(inverse[1], inverse[0]);\n\t };\n\t\n\t return {\n\t project: project,\n\t unproject: unproject,\n\t\n\t // Scale factor for converting between real metres and projected metres\\\n\t //\n\t // Need to work out the best way to provide the pointScale calculations\n\t // for custom, unknown projections (if wanting to override default)\n\t //\n\t // For now, user can manually override crs.pointScale or\n\t // crs.projection.pointScale\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t pointScale: function pointScale(latlon, accurate) {\n\t return [1, 1];\n\t },\n\t\n\t // Try and calculate bounds if none are provided\n\t //\n\t // This will provide incorrect bounds for some projections, so perhaps make\n\t // bounds a required input instead\n\t bounds: (function () {\n\t if (bounds) {\n\t return bounds;\n\t } else {\n\t var bottomLeft = project([-90, -180]);\n\t var topRight = project([90, 180]);\n\t\n\t return [bottomLeft, topRight];\n\t }\n\t })()\n\t };\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\tvar _Renderer = __webpack_require__(26);\n\t\n\tvar _Renderer2 = _interopRequireDefault(_Renderer);\n\t\n\tvar _Camera = __webpack_require__(27);\n\t\n\tvar _Camera2 = _interopRequireDefault(_Camera);\n\t\n\tvar Engine = (function (_EventEmitter) {\n\t _inherits(Engine, _EventEmitter);\n\t\n\t function Engine(container) {\n\t _classCallCheck(this, Engine);\n\t\n\t console.log('Init Engine');\n\t\n\t _get(Object.getPrototypeOf(Engine.prototype), 'constructor', this).call(this);\n\t\n\t this._scene = _Scene2['default'];\n\t this._renderer = (0, _Renderer2['default'])(container);\n\t this._camera = (0, _Camera2['default'])(container);\n\t this.clock = new _three2['default'].Clock();\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(Engine, [{\n\t key: 'update',\n\t value: function update(delta) {\n\t this.emit('preRender');\n\t this._renderer.render(this._scene, this._camera);\n\t this.emit('postRender');\n\t }\n\t }]);\n\t\n\t return Engine;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (container) {\n\t return new Engine(container);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can be imported from anywhere and will still reference the same scene,\n\t// though there is a helper reference in Engine.scene\n\t\n\texports['default'] = (function () {\n\t var scene = new _three2['default'].Scene();\n\t scene.fog = new _three2['default'].Fog(0xffffff, 1, 15000);\n\t return scene;\n\t})();\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\t// This can only be accessed from Engine.renderer if you want to reference the\n\t// same scene in multiple places\n\t\n\texports['default'] = function (container) {\n\t var renderer = new _three2['default'].WebGLRenderer({\n\t antialias: true\n\t });\n\t\n\t renderer.setClearColor(_Scene2['default'].fog.color, 1);\n\t\n\t // Gamma settings make things look nicer\n\t renderer.gammaInput = true;\n\t renderer.gammaOutput = true;\n\t\n\t container.appendChild(renderer.domElement);\n\t\n\t var updateSize = function updateSize() {\n\t renderer.setSize(container.clientWidth, container.clientHeight);\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return renderer;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can only be accessed from Engine.camera if you want to reference the\n\t// same scene in multiple places\n\t\n\t// TODO: Ensure that FOV looks natural on all aspect ratios\n\t// http://stackoverflow.com/q/26655930/997339\n\t\n\texports['default'] = function (container) {\n\t var camera = new _three2['default'].PerspectiveCamera(45, 1, 1, 40000);\n\t camera.position.y = 400;\n\t camera.position.z = 400;\n\t\n\t var updateSize = function updateSize() {\n\t camera.aspect = container.clientWidth / container.clientHeight;\n\t camera.updateProjectionMatrix();\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return camera;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _ControlsOrbit = __webpack_require__(29);\n\t\n\tvar _ControlsOrbit2 = _interopRequireDefault(_ControlsOrbit);\n\t\n\tvar Controls = {\n\t Orbit: _ControlsOrbit2['default']\n\t};\n\t\n\texports['default'] = Controls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _vendorOrbitControls = __webpack_require__(30);\n\t\n\tvar _vendorOrbitControls2 = _interopRequireDefault(_vendorOrbitControls);\n\t\n\tvar Orbit = (function (_EventEmitter) {\n\t _inherits(Orbit, _EventEmitter);\n\t\n\t function Orbit() {\n\t _classCallCheck(this, Orbit);\n\t\n\t _get(Object.getPrototypeOf(Orbit.prototype), 'constructor', this).call(this);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Proxy control events\n\t //\n\t // There's currently no distinction between pan, orbit and zoom events\n\t\n\t _createClass(Orbit, [{\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t var _this = this;\n\t\n\t this._controls.addEventListener('start', function (event) {\n\t _this._world.emit('controlsMoveStart', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('change', function (event) {\n\t _this._world.emit('controlsMove', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('end', function (event) {\n\t _this._world.emit('controlsMoveEnd', event.target.target);\n\t });\n\t }\n\t\n\t // Moving the camera along the [x,y,z] axis based on a target position\n\t }, {\n\t key: '_panTo',\n\t value: function _panTo(point, animate) {}\n\t }, {\n\t key: '_panBy',\n\t value: function _panBy(pointDelta, animate) {}\n\t\n\t // Zooming the camera in and out\n\t }, {\n\t key: '_zoomTo',\n\t value: function _zoomTo(metres, animate) {}\n\t }, {\n\t key: '_zoomBy',\n\t value: function _zoomBy(metresDelta, animate) {}\n\t\n\t // Force camera to look at something other than the target\n\t }, {\n\t key: '_lookAt',\n\t value: function _lookAt(point, animate) {}\n\t\n\t // Make camera look at the target\n\t }, {\n\t key: '_lookAtTarget',\n\t value: function _lookAtTarget() {}\n\t\n\t // Tilt (up and down)\n\t }, {\n\t key: '_tiltTo',\n\t value: function _tiltTo(angle, animate) {}\n\t }, {\n\t key: '_tiltBy',\n\t value: function _tiltBy(angleDelta, animate) {}\n\t\n\t // Rotate (left and right)\n\t }, {\n\t key: '_rotateTo',\n\t value: function _rotateTo(angle, animate) {}\n\t }, {\n\t key: '_rotateBy',\n\t value: function _rotateBy(angleDelta, animate) {}\n\t\n\t // Fly to the given point, animating pan and tilt/rotation to final position\n\t // with nice zoom out and in\n\t //\n\t // Calling flyTo a second time before the previous animation has completed\n\t // will immediately start the new animation from wherever the previous one\n\t // has got to\n\t }, {\n\t key: '_flyTo',\n\t value: function _flyTo(point, noZoom) {}\n\t\n\t // Proxy to OrbitControls.update()\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t this._controls.update();\n\t }\n\t\n\t // Add controls to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addControls(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addControls to actually add the controls\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t\n\t // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n\t // See: http://stackoverflow.com/a/26188674/997339\n\t this._controls = new _vendorOrbitControls2['default'](world._engine._camera, world._container);\n\t\n\t // Disable keys for now as no events are fired for them anyway\n\t this._controls.keys = false;\n\t\n\t // 89 degrees\n\t this._controls.maxPolarAngle = 1.5533;\n\t\n\t // this._controls.enableDamping = true;\n\t // this._controls.dampingFactor = 0.25;\n\t\n\t this._initEvents();\n\t\n\t this.emit('added');\n\t }\n\t }]);\n\t\n\t return Orbit;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function () {\n\t return new Orbit();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\t\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finter swipe\n\t\n\tvar OrbitControls = function OrbitControls(object, domElement) {\n\t\n\t\tthis.object = object;\n\t\n\t\tthis.domElement = domElement !== undefined ? domElement : document;\n\t\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\t\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new _three2['default'].Vector3();\n\t\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\t\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\t\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\t\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\t\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\t\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\t\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\t\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\t\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\t\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\t\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\t\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: _three2['default'].MOUSE.LEFT, ZOOM: _three2['default'].MOUSE.MIDDLE, PAN: _three2['default'].MOUSE.RIGHT };\n\t\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\t\n\t\t//\n\t\t// public methods\n\t\t//\n\t\n\t\tthis.getPolarAngle = function () {\n\t\n\t\t\treturn phi;\n\t\t};\n\t\n\t\tthis.getAzimuthalAngle = function () {\n\t\n\t\t\treturn theta;\n\t\t};\n\t\n\t\tthis.reset = function () {\n\t\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\tscope.update();\n\t\n\t\t\tstate = STATE.NONE;\n\t\t};\n\t\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new _three2['default'].Quaternion().setFromUnitVectors(object.up, new _three2['default'].Vector3(0, 1, 0));\n\t\t\tvar quatInverse = quat.clone().inverse();\n\t\n\t\t\tvar lastPosition = new _three2['default'].Vector3();\n\t\t\tvar lastQuaternion = new _three2['default'].Quaternion();\n\t\n\t\t\treturn function () {\n\t\n\t\t\t\tvar position = scope.object.position;\n\t\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\n\t\t\t\t// angle from z-axis around y-axis\n\t\n\t\t\t\ttheta = Math.atan2(offset.x, offset.z);\n\t\n\t\t\t\t// angle from y-axis\n\t\n\t\t\t\tphi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);\n\t\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\n\t\t\t\ttheta += thetaDelta;\n\t\t\t\tphi += phiDelta;\n\t\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\ttheta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, theta));\n\t\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tphi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, phi));\n\t\n\t\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\t\tphi = Math.max(EPS, Math.min(Math.PI - EPS, phi));\n\t\n\t\t\t\tvar radius = offset.length() * scale;\n\t\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tradius = Math.max(scope.minDistance, Math.min(scope.maxDistance, radius));\n\t\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\n\t\t\t\toffset.x = radius * Math.sin(phi) * Math.sin(theta);\n\t\t\t\toffset.y = radius * Math.cos(phi);\n\t\t\t\toffset.z = radius * Math.sin(phi) * Math.cos(theta);\n\t\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\n\t\t\t\tif (scope.enableDamping === true) {\n\t\n\t\t\t\t\tthetaDelta *= 1 - scope.dampingFactor;\n\t\t\t\t\tphiDelta *= 1 - scope.dampingFactor;\n\t\t\t\t} else {\n\t\n\t\t\t\t\tthetaDelta = 0;\n\t\t\t\t\tphiDelta = 0;\n\t\t\t\t}\n\t\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\n\t\t\t\tif (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\n\t\t\t\treturn false;\n\t\t\t};\n\t\t})();\n\t\n\t\tthis.dispose = function () {\n\t\n\t\t\tscope.domElement.removeEventListener('contextmenu', onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener('mousedown', onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener('mousewheel', onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\t\tscope.domElement.removeEventListener('touchstart', onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener('touchend', onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener('touchmove', onTouchMove, false);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\twindow.removeEventListener('keydown', onKeyDown, false);\n\t\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\t\t};\n\t\n\t\t//\n\t\t// internals\n\t\t//\n\t\n\t\tvar scope = this;\n\t\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\t\n\t\tvar STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\n\t\tvar state = STATE.NONE;\n\t\n\t\tvar EPS = 0.000001;\n\t\n\t\t// current position in spherical coordinates\n\t\tvar theta;\n\t\tvar phi;\n\t\n\t\tvar phiDelta = 0;\n\t\tvar thetaDelta = 0;\n\t\tvar scale = 1;\n\t\tvar panOffset = new _three2['default'].Vector3();\n\t\tvar zoomChanged = false;\n\t\n\t\tvar rotateStart = new _three2['default'].Vector2();\n\t\tvar rotateEnd = new _three2['default'].Vector2();\n\t\tvar rotateDelta = new _three2['default'].Vector2();\n\t\n\t\tvar panStart = new _three2['default'].Vector2();\n\t\tvar panEnd = new _three2['default'].Vector2();\n\t\tvar panDelta = new _three2['default'].Vector2();\n\t\n\t\tvar dollyStart = new _three2['default'].Vector2();\n\t\tvar dollyEnd = new _three2['default'].Vector2();\n\t\tvar dollyDelta = new _three2['default'].Vector2();\n\t\n\t\tfunction getAutoRotationAngle() {\n\t\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\n\t\tfunction getZoomScale() {\n\t\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\n\t\tfunction rotateLeft(angle) {\n\t\n\t\t\tthetaDelta -= angle;\n\t\t}\n\t\n\t\tfunction rotateUp(angle) {\n\t\n\t\t\tphiDelta -= angle;\n\t\t}\n\t\n\t\tvar panLeft = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panLeft( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get X column of objectMatrix\n\t\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( - distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\t// Fixed panning to x/y plane\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\t// var adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[0], 0, te[2]);\n\t\t\t\tv.multiplyScalar(-distance);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// Fixed panning to x/y plane\n\t\tvar panUp = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panUp( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get Y column of objectMatrix\n\t\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\tvar adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[4], 0, te[6]);\n\t\t\t\tv.multiplyScalar(adjDist);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\treturn function (deltaX, deltaY) {\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tvar targetDistance = offset.length();\n\t\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0);\n\t\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else {\n\t\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\t\n\t\tfunction dollyIn(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale /= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\tfunction dollyOut(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale *= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\n\t\tfunction handleMouseDownRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\t\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\t\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownPan(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownPan' );\n\t\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\t\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMovePan(event) {\n\t\n\t\t\t//console.log( 'handleMouseMovePan' );\n\t\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseUp(event) {\n\t\n\t\t\t//console.log( 'handleMouseUp' );\n\t\n\t\t}\n\t\n\t\tfunction handleMouseWheel(event) {\n\t\n\t\t\t//console.log( 'handleMouseWheel' );\n\t\n\t\t\tvar delta = 0;\n\t\n\t\t\tif (event.wheelDelta !== undefined) {\n\t\n\t\t\t\t// WebKit / Opera / Explorer 9\n\t\n\t\t\t\tdelta = event.wheelDelta;\n\t\t\t} else if (event.detail !== undefined) {\n\t\n\t\t\t\t// Firefox\n\t\n\t\t\t\tdelta = -event.detail;\n\t\t\t}\n\t\n\t\t\tif (delta > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (delta < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleKeyDown(event) {\n\t\n\t\t\t//console.log( 'handleKeyDown' );\n\t\n\t\t\tswitch (event.keyCode) {\n\t\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction handleTouchStartRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\t\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchStartDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\t\n\t\t\tvar dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tvar dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\n\t\tfunction handleTouchStartPan(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartPan' );\n\t\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\t\n\t\t\tvar dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tvar dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyEnd.set(0, distance);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMovePan(event) {\n\t\n\t\t\t//console.log( 'handleTouchMovePan' );\n\t\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchEnd(event) {}\n\t\n\t\t//console.log( 'handleTouchEnd' );\n\t\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\n\t\tfunction onMouseDown(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (event.button === scope.mouseButtons.ORBIT) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseDownRotate(event);\n\t\n\t\t\t\tstate = STATE.ROTATE;\n\t\t\t} else if (event.button === scope.mouseButtons.ZOOM) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseDownDolly(event);\n\t\n\t\t\t\tstate = STATE.DOLLY;\n\t\t\t} else if (event.button === scope.mouseButtons.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseDownPan(event);\n\t\n\t\t\t\tstate = STATE.PAN;\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tdocument.addEventListener('mousemove', onMouseMove, false);\n\t\t\t\tdocument.addEventListener('mouseup', onMouseUp, false);\n\t\t\t\tdocument.addEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (state === STATE.ROTATE) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t} else if (state === STATE.DOLLY) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t} else if (state === STATE.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseMovePan(event);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseUp(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleMouseUp(event);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onMouseWheel(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\thandleMouseWheel(event);\n\t\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\n\t\tfunction onKeyDown(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return;\n\t\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\n\t\tfunction onTouchStart(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\t\thandleTouchStartPan(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMovePan(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchEnd(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleTouchEnd(event);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onContextMenu(event) {\n\t\n\t\t\tevent.preventDefault();\n\t\t}\n\t\n\t\t//\n\t\n\t\tscope.domElement.addEventListener('contextmenu', onContextMenu, false);\n\t\n\t\tscope.domElement.addEventListener('mousedown', onMouseDown, false);\n\t\tscope.domElement.addEventListener('mousewheel', onMouseWheel, false);\n\t\tscope.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\tscope.domElement.addEventListener('touchstart', onTouchStart, false);\n\t\tscope.domElement.addEventListener('touchend', onTouchEnd, false);\n\t\tscope.domElement.addEventListener('touchmove', onTouchMove, false);\n\t\n\t\twindow.addEventListener('keydown', onKeyDown, false);\n\t\n\t\t// force an update at start\n\t\n\t\tthis.update();\n\t};\n\t\n\tOrbitControls.prototype = Object.create(_three2['default'].EventDispatcher.prototype);\n\tOrbitControls.prototype.constructor = _three2['default'].OrbitControls;\n\t\n\tObject.defineProperties(OrbitControls.prototype, {\n\t\n\t\tcenter: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .center has been renamed to .target');\n\t\t\t\treturn this.target;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t// backward compatibility\n\t\n\t\tnoZoom: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\treturn !this.enableZoom;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\tthis.enableZoom = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoRotate: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\treturn !this.enableRotate;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\tthis.enableRotate = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoPan: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\treturn !this.enablePan;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\tthis.enablePan = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoKeys: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\treturn !this.enableKeys;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\tthis.enableKeys = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tstaticMoving: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\treturn !this.constraint.enableDamping;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\tthis.constraint.enableDamping = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tdynamicDampingFactor: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\treturn this.constraint.dampingFactor;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\tthis.constraint.dampingFactor = value;\n\t\t\t}\n\t\n\t\t}\n\t\n\t});\n\t\n\texports['default'] = OrbitControls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar EnvironmentLayer = (function (_Layer) {\n\t _inherits(EnvironmentLayer, _Layer);\n\t\n\t function EnvironmentLayer() {\n\t _classCallCheck(this, EnvironmentLayer);\n\t\n\t _get(Object.getPrototypeOf(EnvironmentLayer.prototype), 'constructor', this).call(this);\n\t\n\t this._initLights();\n\t // this._initGrid();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(EnvironmentLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd() {}\n\t\n\t // Not fleshed out or thought through yet\n\t //\n\t // Lights could potentially be put it their own 'layer' to keep this class\n\t // much simpler and less messy\n\t }, {\n\t key: '_initLights',\n\t value: function _initLights() {\n\t // Position doesn't really matter (the angle is important), however it's\n\t // used here so the helpers look more natural.\n\t\n\t var directionalLight = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight.intesity = 0.1;\n\t directionalLight.position.x = 100;\n\t directionalLight.position.y = 100;\n\t directionalLight.position.z = 100;\n\t\n\t var directionalLight2 = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight2.intesity = 0.1;\n\t directionalLight2.position.x = -100;\n\t directionalLight2.position.y = 100;\n\t directionalLight2.position.z = -100;\n\t\n\t var helper = new _three2['default'].DirectionalLightHelper(directionalLight, 10);\n\t var helper2 = new _three2['default'].DirectionalLightHelper(directionalLight2, 10);\n\t\n\t this._layer.add(directionalLight);\n\t this._layer.add(directionalLight2);\n\t\n\t this._layer.add(helper);\n\t this._layer.add(helper2);\n\t }\n\t\n\t // Add grid helper for context during initial development\n\t }, {\n\t key: '_initGrid',\n\t value: function _initGrid() {\n\t var size = 4000;\n\t var step = 100;\n\t\n\t var gridHelper = new _three2['default'].GridHelper(size, step);\n\t this._layer.add(gridHelper);\n\t }\n\t }]);\n\t\n\t return EnvironmentLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = function () {\n\t return new EnvironmentLayer();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _engineScene = __webpack_require__(25);\n\t\n\tvar _engineScene2 = _interopRequireDefault(_engineScene);\n\t\n\tvar Layer = (function (_EventEmitter) {\n\t _inherits(Layer, _EventEmitter);\n\t\n\t function Layer() {\n\t _classCallCheck(this, Layer);\n\t\n\t _get(Object.getPrototypeOf(Layer.prototype), 'constructor', this).call(this);\n\t\n\t this._layer = new _three2['default'].Object3D();\n\t }\n\t\n\t // Add layer to world instance and store world reference\n\t\n\t _createClass(Layer, [{\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addLayer(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addLayer to actually add the layer\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t this._onAdd(world);\n\t this.emit('added');\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world = null;\n\t this._layer = null;\n\t }\n\t }]);\n\t\n\t return Layer;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = Layer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _TileLayer2 = __webpack_require__(34);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _ImageTile = __webpack_require__(44);\n\t\n\tvar _ImageTile2 = _interopRequireDefault(_ImageTile);\n\t\n\tvar _ImageTileLayerBaseMaterial = __webpack_require__(47);\n\t\n\tvar _ImageTileLayerBaseMaterial2 = _interopRequireDefault(_ImageTileLayerBaseMaterial);\n\t\n\tvar _lodashThrottle = __webpack_require__(48);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n\t// being removed and the new tiles being ready for display\n\t//\n\t// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n\t// of the basemap ground so it blends in a little more, or have a huge ground\n\t// plane underneath all the tiles that shows through between tile updates.\n\t//\n\t// Could keep the old tiles around until the new ones are ready, though they'd\n\t// probably need to be layered in a way so the old tiles don't overlap new ones,\n\t// which is similar to how Leaflet approaches this (it has 2 layers)\n\t//\n\t// Could keep the tile from the previous quadtree level visible until all 4\n\t// tiles at the new / current level have finished loading and are displayed.\n\t// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n\t// child quadcodes showing whether they are loaded and in view. If all true then\n\t// remove the parent tile, otherwise keep it on a lower layer.\n\t\n\t// TODO: Load and display a base layer separate to the LOD grid that is at a low\n\t// resolution – used as a backup / background to fill in empty areas / distance\n\t\n\t// DONE: Fix the issue where some tiles just don't load, or at least the texture\n\t// never shows up – tends to happen if you quickly zoom in / out past it while\n\t// it's still loading, leaving a blank space\n\t\n\t// TODO: Optimise the request of many image tiles – look at how Leaflet and\n\t// OpenWebGlobe approach this (eg. batching, queues, etc)\n\t\n\t// TODO: Cancel pending tile requests if they get removed from view before they\n\t// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n\t// images are re-requested when the tile is next in scene (even if from cache)\n\t\n\tvar ImageTileLayer = (function (_TileLayer) {\n\t _inherits(ImageTileLayer, _TileLayer);\n\t\n\t function ImageTileLayer(path, options) {\n\t _classCallCheck(this, ImageTileLayer);\n\t\n\t // Cache 1000 tiles\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'constructor', this).call(this, 1000);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(ImageTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t this._initEvents();\n\t\n\t // Add base layer\n\t var geom = new _three2['default'].PlaneBufferGeometry(40000, 40000, 1);\n\t var mesh = new _three2['default'].Mesh(geom, (0, _ImageTileLayerBaseMaterial2['default'])('#f5f5f3'));\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t this._baseLayer = mesh;\n\t this._layer.add(mesh);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_moveBaseLayer',\n\t value: function _moveBaseLayer(point) {\n\t this._baseLayer.position.x = point.x;\n\t this._baseLayer.position.z = point.y;\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t return (0, _ImageTile2['default'])(quadcode, this._path, layer);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Dispose of mesh and materials\n\t this._baseLayer.geometry.dispose();\n\t this._baseLayer.geometry = null;\n\t\n\t if (this._baseLayer.material.map) {\n\t this._baseLayer.material.map.dispose();\n\t this._baseLayer.material.map = null;\n\t }\n\t\n\t this._baseLayer.material.dispose();\n\t this._baseLayer.material = null;\n\t\n\t this._baseLayer = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return ImageTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new ImageTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _TileCache = __webpack_require__(35);\n\t\n\tvar _TileCache2 = _interopRequireDefault(_TileCache);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// DONE: Prevent tiles from being loaded if they are further than a certain\n\t// distance from the camera and are unlikely to be seen anyway\n\t\n\t// TODO: Avoid performing LOD calculation when it isn't required. For example,\n\t// when nothing has changed since the last frame and there are no tiles to be\n\t// loaded or in need of rendering\n\t\n\t// TODO: Only remove tiles from the layer that aren't to be rendered in the\n\t// current frame – it seems excessive to remove all tiles and re-add them on\n\t// every single frame, even if it's just array manipulation\n\t\n\t// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n\t// problems (eg. making min above 5 causes all sorts of issues)\n\t\n\t// TODO: Reuse THREE objects where possible instead of creating new instances\n\t// on every LOD calculation\n\t\n\t// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n\t// to avoid creating unnecessary memory for garbage collection\n\t\n\t// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n\t// closest to the camera) so visual inconsistancies during loading are minimised\n\t\n\tvar TileLayer = (function (_Layer) {\n\t _inherits(TileLayer, _Layer);\n\t\n\t function TileLayer(maxCache) {\n\t var _this = this;\n\t\n\t _classCallCheck(this, TileLayer);\n\t\n\t _get(Object.getPrototypeOf(TileLayer.prototype), 'constructor', this).call(this);\n\t\n\t this._tileCache = (0, _TileCache2['default'])(maxCache, function (tile) {\n\t _this._destroyTile(tile);\n\t });\n\t\n\t // TODO: Work out why changing the minLOD causes loads of issues\n\t this._minLOD = 3;\n\t this._maxLOD = 18;\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t this._tiles = new _three2['default'].Object3D();\n\t }\n\t\n\t _createClass(TileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t this._layer.add(this._tiles);\n\t }\n\t }, {\n\t key: '_updateFrustum',\n\t value: function _updateFrustum() {\n\t var camera = this._world.getCamera();\n\t var projScreenMatrix = new _three2['default'].Matrix4();\n\t projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\n\t this._frustum.setFromMatrix(camera.projectionMatrix);\n\t this._frustum.setFromMatrix(new _three2['default'].Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n\t }\n\t }, {\n\t key: '_tileInFrustum',\n\t value: function _tileInFrustum(tile) {\n\t var bounds = tile.getBounds();\n\t return this._frustum.intersectsBox(new _three2['default'].Box3(new _three2['default'].Vector3(bounds[0], 0, bounds[3]), new _three2['default'].Vector3(bounds[2], 0, bounds[1])));\n\t }\n\t }, {\n\t key: '_calculateLOD',\n\t value: function _calculateLOD() {\n\t var _this2 = this;\n\t\n\t if (this._stop || !this._world) {\n\t return;\n\t }\n\t\n\t // var start = performance.now();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // 1. Update and retrieve camera frustum\n\t this._updateFrustum(this._frustum, camera);\n\t\n\t // 2. Add the four root items of the quadtree to a check list\n\t var checkList = this._checklist;\n\t checkList = [];\n\t checkList.push(this._requestTile('0', this));\n\t checkList.push(this._requestTile('1', this));\n\t checkList.push(this._requestTile('2', this));\n\t checkList.push(this._requestTile('3', this));\n\t\n\t // 3. Call Divide, passing in the check list\n\t this._divide(checkList);\n\t\n\t // 4. Remove all tiles from layer\n\t this._removeTiles();\n\t\n\t // 5. Render the tiles remaining in the check list\n\t checkList.forEach(function (tile, index) {\n\t // Skip tile if it's not in the current view frustum\n\t if (!_this2._tileInFrustum(tile)) {\n\t return;\n\t }\n\t\n\t // // TODO: Can probably speed this up\n\t // var center = tile.getCenter();\n\t // var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\t\n\t // Manual distance limit to cut down on tiles so far away\n\t // if (dist > 8000) {\n\t // return;\n\t // }\n\t\n\t // Does the tile have a mesh?\n\t //\n\t // If yes, continue\n\t // If no, generate tile mesh, request texture and skip\n\t if (!tile.getMesh()) {\n\t tile.requestTileAsync();\n\t return;\n\t }\n\t\n\t // Are the mesh and texture ready?\n\t //\n\t // If yes, continue\n\t // If no, skip\n\t if (!tile.isReady()) {\n\t return;\n\t }\n\t\n\t // Add tile to layer (and to scene)\n\t _this2._tiles.add(tile.getMesh());\n\t });\n\t\n\t // console.log(performance.now() - start);\n\t }\n\t }, {\n\t key: '_divide',\n\t value: function _divide(checkList) {\n\t var count = 0;\n\t var currentItem;\n\t var quadcode;\n\t\n\t // 1. Loop until count equals check list length\n\t while (count != checkList.length) {\n\t currentItem = checkList[count];\n\t quadcode = currentItem.getQuadcode();\n\t\n\t // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n\t if (currentItem.length === this._maxLOD) {\n\t count++;\n\t continue;\n\t }\n\t\n\t // 3. Else, calculate screen-space error metric for quadcode\n\t if (this._screenSpaceError(currentItem)) {\n\t // 4. If error is sufficient...\n\t\n\t // 4a. Remove parent item from the check list\n\t checkList.splice(count, 1);\n\t\n\t // 4b. Add 4 child items to the check list\n\t checkList.push(this._requestTile(quadcode + '0', this));\n\t checkList.push(this._requestTile(quadcode + '1', this));\n\t checkList.push(this._requestTile(quadcode + '2', this));\n\t checkList.push(this._requestTile(quadcode + '3', this));\n\t\n\t // 4d. Continue the loop without increasing count\n\t continue;\n\t } else {\n\t // 5. Else, increase count and continue loop\n\t count++;\n\t }\n\t }\n\t }\n\t }, {\n\t key: '_screenSpaceError',\n\t value: function _screenSpaceError(tile) {\n\t var minDepth = this._minLOD;\n\t var maxDepth = this._maxLOD;\n\t\n\t var quadcode = tile.getQuadcode();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // Tweak this value to refine specific point that each quad is subdivided\n\t //\n\t // It's used to multiple the dimensions of the tile sides before\n\t // comparing against the tile distance from camera\n\t var quality = 3.0;\n\t\n\t // 1. Return false if quadcode length is greater than maxDepth\n\t if (quadcode.length > maxDepth) {\n\t return false;\n\t }\n\t\n\t // 2. Return true if quadcode length is less than minDepth\n\t if (quadcode.length < minDepth) {\n\t return true;\n\t }\n\t\n\t // 3. Return false if quadcode bounds are not in view frustum\n\t if (!this._tileInFrustum(tile)) {\n\t return false;\n\t }\n\t\n\t var center = tile.getCenter();\n\t\n\t // 4. Calculate screen-space error metric\n\t // TODO: Use closest distance to one of the 4 tile corners\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t var error = quality * tile.getSide() / dist;\n\t\n\t // 5. Return true if error is greater than 1.0, else return false\n\t return error > 1.0;\n\t }\n\t }, {\n\t key: '_removeTiles',\n\t value: function _removeTiles() {\n\t for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t }\n\t\n\t // Return a new tile instance\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {}\n\t\n\t // Get a cached tile or request a new one if not in cache\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile(quadcode, layer) {\n\t var tile = this._tileCache.getTile(quadcode);\n\t\n\t if (!tile) {\n\t // Set up a brand new tile\n\t tile = this._createTile(quadcode, layer);\n\t\n\t // Add tile to cache, though it won't be ready yet as the data is being\n\t // requested from various places asynchronously\n\t this._tileCache.setTile(quadcode, tile);\n\t }\n\t\n\t return tile;\n\t }\n\t }, {\n\t key: '_destroyTile',\n\t value: function _destroyTile(tile) {\n\t // Remove tile from scene\n\t this._layer.remove(tile);\n\t\n\t // Delete any references to the tile within this component\n\t\n\t // Call destory on tile instance\n\t tile.destroy();\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t var i;\n\t\n\t // Remove all tiles\n\t for (i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t\n\t // Remove everything else in the layer\n\t for (i = this._layer.children.length - 1; i >= 0; i--) {\n\t this._layer.remove(this._layer.children[i]);\n\t }\n\t\n\t this._tileCache.destroy();\n\t this._tileCache = null;\n\t\n\t this._world = null;\n\t this._tiles = null;\n\t this._layer = null;\n\t this._frustum = null;\n\t }\n\t }]);\n\t\n\t return TileLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = TileLayer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _lruCache = __webpack_require__(36);\n\t\n\tvar _lruCache2 = _interopRequireDefault(_lruCache);\n\t\n\t// This process is based on a similar approach taken by OpenWebGlobe\n\t// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\t\n\tvar TileCache = (function () {\n\t function TileCache(cacheLimit, onDestroyTile) {\n\t _classCallCheck(this, TileCache);\n\t\n\t this._cache = (0, _lruCache2['default'])({\n\t max: cacheLimit,\n\t dispose: function dispose(key, tile) {\n\t onDestroyTile(tile);\n\t }\n\t });\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Returns true if all specified tile providers are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(TileCache, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return false;\n\t }\n\t\n\t // Get a cached tile without requesting a new one\n\t }, {\n\t key: 'getTile',\n\t value: function getTile(quadcode) {\n\t return this._cache.get(quadcode);\n\t }\n\t\n\t // Add tile to cache\n\t }, {\n\t key: 'setTile',\n\t value: function setTile(quadcode, tile) {\n\t this._cache.set(quadcode, tile);\n\t }\n\t\n\t // Destroy the cache and remove it from memory\n\t //\n\t // TODO: Call destroy method on items in cache\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cache.reset();\n\t this._cache = null;\n\t }\n\t }]);\n\t\n\t return TileCache;\n\t})();\n\t\n\texports['default'] = function (cacheLimit, onDestroyTile) {\n\t return new TileCache(cacheLimit, onDestroyTile);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = LRUCache\n\t\n\t// This will be a proper iterable 'Map' in engines that support it,\n\t// or a fakey-fake PseudoMap in older versions.\n\tvar Map = __webpack_require__(37)\n\tvar util = __webpack_require__(40)\n\t\n\t// A linked list to keep track of recently-used-ness\n\tvar Yallist = __webpack_require__(43)\n\t\n\t// use symbols if possible, otherwise just _props\n\tvar symbols = {}\n\tvar hasSymbol = typeof Symbol === 'function'\n\tvar makeSymbol\n\tif (hasSymbol) {\n\t makeSymbol = function (key) {\n\t return Symbol.for(key)\n\t }\n\t} else {\n\t makeSymbol = function (key) {\n\t return '_' + key\n\t }\n\t}\n\t\n\tfunction priv (obj, key, val) {\n\t var sym\n\t if (symbols[key]) {\n\t sym = symbols[key]\n\t } else {\n\t sym = makeSymbol(key)\n\t symbols[key] = sym\n\t }\n\t if (arguments.length === 2) {\n\t return obj[sym]\n\t } else {\n\t obj[sym] = val\n\t return val\n\t }\n\t}\n\t\n\tfunction naiveLength () { return 1 }\n\t\n\t// lruList is a yallist where the head is the youngest\n\t// item, and the tail is the oldest. the list contains the Hit\n\t// objects as the entries.\n\t// Each Hit object has a reference to its Yallist.Node. This\n\t// never changes.\n\t//\n\t// cache is a Map (or PseudoMap) that matches the keys to\n\t// the Yallist.Node object.\n\tfunction LRUCache (options) {\n\t if (!(this instanceof LRUCache)) {\n\t return new LRUCache(options)\n\t }\n\t\n\t if (typeof options === 'number') {\n\t options = { max: options }\n\t }\n\t\n\t if (!options) {\n\t options = {}\n\t }\n\t\n\t var max = priv(this, 'max', options.max)\n\t // Kind of weird to have a default max of Infinity, but oh well.\n\t if (!max ||\n\t !(typeof max === 'number') ||\n\t max <= 0) {\n\t priv(this, 'max', Infinity)\n\t }\n\t\n\t var lc = options.length || naiveLength\n\t if (typeof lc !== 'function') {\n\t lc = naiveLength\n\t }\n\t priv(this, 'lengthCalculator', lc)\n\t\n\t priv(this, 'allowStale', options.stale || false)\n\t priv(this, 'maxAge', options.maxAge || 0)\n\t priv(this, 'dispose', options.dispose)\n\t this.reset()\n\t}\n\t\n\t// resize the cache when the max changes.\n\tObject.defineProperty(LRUCache.prototype, 'max', {\n\t set: function (mL) {\n\t if (!mL || !(typeof mL === 'number') || mL <= 0) {\n\t mL = Infinity\n\t }\n\t priv(this, 'max', mL)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'max')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'allowStale', {\n\t set: function (allowStale) {\n\t priv(this, 'allowStale', !!allowStale)\n\t },\n\t get: function () {\n\t return priv(this, 'allowStale')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'maxAge', {\n\t set: function (mA) {\n\t if (!mA || !(typeof mA === 'number') || mA < 0) {\n\t mA = 0\n\t }\n\t priv(this, 'maxAge', mA)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'maxAge')\n\t },\n\t enumerable: true\n\t})\n\t\n\t// resize the cache when the lengthCalculator changes.\n\tObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n\t set: function (lC) {\n\t if (typeof lC !== 'function') {\n\t lC = naiveLength\n\t }\n\t if (lC !== priv(this, 'lengthCalculator')) {\n\t priv(this, 'lengthCalculator', lC)\n\t priv(this, 'length', 0)\n\t priv(this, 'lruList').forEach(function (hit) {\n\t hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t }, this)\n\t }\n\t trim(this)\n\t },\n\t get: function () { return priv(this, 'lengthCalculator') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'length', {\n\t get: function () { return priv(this, 'length') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'itemCount', {\n\t get: function () { return priv(this, 'lruList').length },\n\t enumerable: true\n\t})\n\t\n\tLRUCache.prototype.rforEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n\t var prev = walker.prev\n\t forEachStep(this, fn, walker, thisp)\n\t walker = prev\n\t }\n\t}\n\t\n\tfunction forEachStep (self, fn, node, thisp) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) {\n\t hit = undefined\n\t }\n\t }\n\t if (hit) {\n\t fn.call(thisp, hit.value, hit.key, self)\n\t }\n\t}\n\t\n\tLRUCache.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').head; walker !== null;) {\n\t var next = walker.next\n\t forEachStep(this, fn, walker, thisp)\n\t walker = next\n\t }\n\t}\n\t\n\tLRUCache.prototype.keys = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.key\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.values = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.value\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.reset = function () {\n\t if (priv(this, 'dispose') &&\n\t priv(this, 'lruList') &&\n\t priv(this, 'lruList').length) {\n\t priv(this, 'lruList').forEach(function (hit) {\n\t priv(this, 'dispose').call(this, hit.key, hit.value)\n\t }, this)\n\t }\n\t\n\t priv(this, 'cache', new Map()) // hash of items by key\n\t priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n\t priv(this, 'length', 0) // length of items in the list\n\t}\n\t\n\tLRUCache.prototype.dump = function () {\n\t return priv(this, 'lruList').map(function (hit) {\n\t if (!isStale(this, hit)) {\n\t return {\n\t k: hit.key,\n\t v: hit.value,\n\t e: hit.now + (hit.maxAge || 0)\n\t }\n\t }\n\t }, this).toArray().filter(function (h) {\n\t return h\n\t })\n\t}\n\t\n\tLRUCache.prototype.dumpLru = function () {\n\t return priv(this, 'lruList')\n\t}\n\t\n\tLRUCache.prototype.inspect = function (n, opts) {\n\t var str = 'LRUCache {'\n\t var extras = false\n\t\n\t var as = priv(this, 'allowStale')\n\t if (as) {\n\t str += '\\n allowStale: true'\n\t extras = true\n\t }\n\t\n\t var max = priv(this, 'max')\n\t if (max && max !== Infinity) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n max: ' + util.inspect(max, opts)\n\t extras = true\n\t }\n\t\n\t var maxAge = priv(this, 'maxAge')\n\t if (maxAge) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n\t extras = true\n\t }\n\t\n\t var lc = priv(this, 'lengthCalculator')\n\t if (lc && lc !== naiveLength) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n\t extras = true\n\t }\n\t\n\t var didFirst = false\n\t priv(this, 'lruList').forEach(function (item) {\n\t if (didFirst) {\n\t str += ',\\n '\n\t } else {\n\t if (extras) {\n\t str += ',\\n'\n\t }\n\t didFirst = true\n\t str += '\\n '\n\t }\n\t var key = util.inspect(item.key).split('\\n').join('\\n ')\n\t var val = { value: item.value }\n\t if (item.maxAge !== maxAge) {\n\t val.maxAge = item.maxAge\n\t }\n\t if (lc !== naiveLength) {\n\t val.length = item.length\n\t }\n\t if (isStale(this, item)) {\n\t val.stale = true\n\t }\n\t\n\t val = util.inspect(val, opts).split('\\n').join('\\n ')\n\t str += key + ' => ' + val\n\t })\n\t\n\t if (didFirst || extras) {\n\t str += '\\n'\n\t }\n\t str += '}'\n\t\n\t return str\n\t}\n\t\n\tLRUCache.prototype.set = function (key, value, maxAge) {\n\t maxAge = maxAge || priv(this, 'maxAge')\n\t\n\t var now = maxAge ? Date.now() : 0\n\t var len = priv(this, 'lengthCalculator').call(this, value, key)\n\t\n\t if (priv(this, 'cache').has(key)) {\n\t if (len > priv(this, 'max')) {\n\t del(this, priv(this, 'cache').get(key))\n\t return false\n\t }\n\t\n\t var node = priv(this, 'cache').get(key)\n\t var item = node.value\n\t\n\t // dispose of the old one before overwriting\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, item.value)\n\t }\n\t\n\t item.now = now\n\t item.maxAge = maxAge\n\t item.value = value\n\t priv(this, 'length', priv(this, 'length') + (len - item.length))\n\t item.length = len\n\t this.get(key)\n\t trim(this)\n\t return true\n\t }\n\t\n\t var hit = new Entry(key, value, len, now, maxAge)\n\t\n\t // oversized objects fall out of cache automatically.\n\t if (hit.length > priv(this, 'max')) {\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, value)\n\t }\n\t return false\n\t }\n\t\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t priv(this, 'lruList').unshift(hit)\n\t priv(this, 'cache').set(key, priv(this, 'lruList').head)\n\t trim(this)\n\t return true\n\t}\n\t\n\tLRUCache.prototype.has = function (key) {\n\t if (!priv(this, 'cache').has(key)) return false\n\t var hit = priv(this, 'cache').get(key).value\n\t if (isStale(this, hit)) {\n\t return false\n\t }\n\t return true\n\t}\n\t\n\tLRUCache.prototype.get = function (key) {\n\t return get(this, key, true)\n\t}\n\t\n\tLRUCache.prototype.peek = function (key) {\n\t return get(this, key, false)\n\t}\n\t\n\tLRUCache.prototype.pop = function () {\n\t var node = priv(this, 'lruList').tail\n\t if (!node) return null\n\t del(this, node)\n\t return node.value\n\t}\n\t\n\tLRUCache.prototype.del = function (key) {\n\t del(this, priv(this, 'cache').get(key))\n\t}\n\t\n\tLRUCache.prototype.load = function (arr) {\n\t // reset the cache\n\t this.reset()\n\t\n\t var now = Date.now()\n\t // A previous serialized cache has the most recent items first\n\t for (var l = arr.length - 1; l >= 0; l--) {\n\t var hit = arr[l]\n\t var expiresAt = hit.e || 0\n\t if (expiresAt === 0) {\n\t // the item was created without expiration in a non aged cache\n\t this.set(hit.k, hit.v)\n\t } else {\n\t var maxAge = expiresAt - now\n\t // dont add already expired items\n\t if (maxAge > 0) {\n\t this.set(hit.k, hit.v, maxAge)\n\t }\n\t }\n\t }\n\t}\n\t\n\tLRUCache.prototype.prune = function () {\n\t var self = this\n\t priv(this, 'cache').forEach(function (value, key) {\n\t get(self, key, false)\n\t })\n\t}\n\t\n\tfunction get (self, key, doUse) {\n\t var node = priv(self, 'cache').get(key)\n\t if (node) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) hit = undefined\n\t } else {\n\t if (doUse) {\n\t priv(self, 'lruList').unshiftNode(node)\n\t }\n\t }\n\t if (hit) hit = hit.value\n\t }\n\t return hit\n\t}\n\t\n\tfunction isStale (self, hit) {\n\t if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n\t return false\n\t }\n\t var stale = false\n\t var diff = Date.now() - hit.now\n\t if (hit.maxAge) {\n\t stale = diff > hit.maxAge\n\t } else {\n\t stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n\t }\n\t return stale\n\t}\n\t\n\tfunction trim (self) {\n\t if (priv(self, 'length') > priv(self, 'max')) {\n\t for (var walker = priv(self, 'lruList').tail;\n\t priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n\t // We know that we're about to delete this one, and also\n\t // what the next least recently used key will be, so just\n\t // go ahead and set it now.\n\t var prev = walker.prev\n\t del(self, walker)\n\t walker = prev\n\t }\n\t }\n\t}\n\t\n\tfunction del (self, node) {\n\t if (node) {\n\t var hit = node.value\n\t if (priv(self, 'dispose')) {\n\t priv(self, 'dispose').call(this, hit.key, hit.value)\n\t }\n\t priv(self, 'length', priv(self, 'length') - hit.length)\n\t priv(self, 'cache').delete(hit.key)\n\t priv(self, 'lruList').removeNode(node)\n\t }\n\t}\n\t\n\t// classy, since V8 prefers predictable objects.\n\tfunction Entry (key, value, length, now, maxAge) {\n\t this.key = key\n\t this.value = value\n\t this.length = length\n\t this.now = now\n\t this.maxAge = maxAge || 0\n\t}\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {if (process.env.npm_package_name === 'pseudomap' &&\n\t process.env.npm_lifecycle_script === 'test')\n\t process.env.TEST_PSEUDOMAP = 'true'\n\t\n\tif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n\t module.exports = Map\n\t} else {\n\t module.exports = __webpack_require__(39)\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(38)))\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\t\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = setTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t clearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t setTimeout(drainQueue, 0);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty\n\t\n\tmodule.exports = PseudoMap\n\t\n\tfunction PseudoMap (set) {\n\t if (!(this instanceof PseudoMap)) // whyyyyyyy\n\t throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\t\n\t this.clear()\n\t\n\t if (set) {\n\t if ((set instanceof PseudoMap) ||\n\t (typeof Map === 'function' && set instanceof Map))\n\t set.forEach(function (value, key) {\n\t this.set(key, value)\n\t }, this)\n\t else if (Array.isArray(set))\n\t set.forEach(function (kv) {\n\t this.set(kv[0], kv[1])\n\t }, this)\n\t else\n\t throw new TypeError('invalid argument')\n\t }\n\t}\n\t\n\tPseudoMap.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t Object.keys(this._data).forEach(function (k) {\n\t if (k !== 'size')\n\t fn.call(thisp, this._data[k].value, this._data[k].key)\n\t }, this)\n\t}\n\t\n\tPseudoMap.prototype.has = function (k) {\n\t return !!find(this._data, k)\n\t}\n\t\n\tPseudoMap.prototype.get = function (k) {\n\t var res = find(this._data, k)\n\t return res && res.value\n\t}\n\t\n\tPseudoMap.prototype.set = function (k, v) {\n\t set(this._data, k, v)\n\t}\n\t\n\tPseudoMap.prototype.delete = function (k) {\n\t var res = find(this._data, k)\n\t if (res) {\n\t delete this._data[res._index]\n\t this._data.size--\n\t }\n\t}\n\t\n\tPseudoMap.prototype.clear = function () {\n\t var data = Object.create(null)\n\t data.size = 0\n\t\n\t Object.defineProperty(this, '_data', {\n\t value: data,\n\t enumerable: false,\n\t configurable: true,\n\t writable: false\n\t })\n\t}\n\t\n\tObject.defineProperty(PseudoMap.prototype, 'size', {\n\t get: function () {\n\t return this._data.size\n\t },\n\t set: function (n) {},\n\t enumerable: true,\n\t configurable: true\n\t})\n\t\n\tPseudoMap.prototype.values =\n\tPseudoMap.prototype.keys =\n\tPseudoMap.prototype.entries = function () {\n\t throw new Error('iterators are not implemented in this version')\n\t}\n\t\n\t// Either identical, or both NaN\n\tfunction same (a, b) {\n\t return a === b || a !== a && b !== b\n\t}\n\t\n\tfunction Entry (k, v, i) {\n\t this.key = k\n\t this.value = v\n\t this._index = i\n\t}\n\t\n\tfunction find (data, k) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k))\n\t return data[key]\n\t }\n\t}\n\t\n\tfunction set (data, k, v) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k)) {\n\t data[key].value = v\n\t return\n\t }\n\t }\n\t data.size++\n\t data[key] = new Entry(k, v, key)\n\t}\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tvar formatRegExp = /%[sdj%]/g;\n\texports.format = function(f) {\n\t if (!isString(f)) {\n\t var objects = [];\n\t for (var i = 0; i < arguments.length; i++) {\n\t objects.push(inspect(arguments[i]));\n\t }\n\t return objects.join(' ');\n\t }\n\t\n\t var i = 1;\n\t var args = arguments;\n\t var len = args.length;\n\t var str = String(f).replace(formatRegExp, function(x) {\n\t if (x === '%%') return '%';\n\t if (i >= len) return x;\n\t switch (x) {\n\t case '%s': return String(args[i++]);\n\t case '%d': return Number(args[i++]);\n\t case '%j':\n\t try {\n\t return JSON.stringify(args[i++]);\n\t } catch (_) {\n\t return '[Circular]';\n\t }\n\t default:\n\t return x;\n\t }\n\t });\n\t for (var x = args[i]; i < len; x = args[++i]) {\n\t if (isNull(x) || !isObject(x)) {\n\t str += ' ' + x;\n\t } else {\n\t str += ' ' + inspect(x);\n\t }\n\t }\n\t return str;\n\t};\n\t\n\t\n\t// Mark that a method should not be used.\n\t// Returns a modified function which warns once by default.\n\t// If --no-deprecation is set, then it is a no-op.\n\texports.deprecate = function(fn, msg) {\n\t // Allow for deprecating things in the process of starting up.\n\t if (isUndefined(global.process)) {\n\t return function() {\n\t return exports.deprecate(fn, msg).apply(this, arguments);\n\t };\n\t }\n\t\n\t if (process.noDeprecation === true) {\n\t return fn;\n\t }\n\t\n\t var warned = false;\n\t function deprecated() {\n\t if (!warned) {\n\t if (process.throwDeprecation) {\n\t throw new Error(msg);\n\t } else if (process.traceDeprecation) {\n\t console.trace(msg);\n\t } else {\n\t console.error(msg);\n\t }\n\t warned = true;\n\t }\n\t return fn.apply(this, arguments);\n\t }\n\t\n\t return deprecated;\n\t};\n\t\n\t\n\tvar debugs = {};\n\tvar debugEnviron;\n\texports.debuglog = function(set) {\n\t if (isUndefined(debugEnviron))\n\t debugEnviron = process.env.NODE_DEBUG || '';\n\t set = set.toUpperCase();\n\t if (!debugs[set]) {\n\t if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n\t var pid = process.pid;\n\t debugs[set] = function() {\n\t var msg = exports.format.apply(exports, arguments);\n\t console.error('%s %d: %s', set, pid, msg);\n\t };\n\t } else {\n\t debugs[set] = function() {};\n\t }\n\t }\n\t return debugs[set];\n\t};\n\t\n\t\n\t/**\n\t * Echos the value of a value. Trys to print the value out\n\t * in the best way possible given the different types.\n\t *\n\t * @param {Object} obj The object to print out.\n\t * @param {Object} opts Optional options object that alters the output.\n\t */\n\t/* legacy: obj, showHidden, depth, colors*/\n\tfunction inspect(obj, opts) {\n\t // default options\n\t var ctx = {\n\t seen: [],\n\t stylize: stylizeNoColor\n\t };\n\t // legacy...\n\t if (arguments.length >= 3) ctx.depth = arguments[2];\n\t if (arguments.length >= 4) ctx.colors = arguments[3];\n\t if (isBoolean(opts)) {\n\t // legacy...\n\t ctx.showHidden = opts;\n\t } else if (opts) {\n\t // got an \"options\" object\n\t exports._extend(ctx, opts);\n\t }\n\t // set default options\n\t if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n\t if (isUndefined(ctx.depth)) ctx.depth = 2;\n\t if (isUndefined(ctx.colors)) ctx.colors = false;\n\t if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n\t if (ctx.colors) ctx.stylize = stylizeWithColor;\n\t return formatValue(ctx, obj, ctx.depth);\n\t}\n\texports.inspect = inspect;\n\t\n\t\n\t// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n\tinspect.colors = {\n\t 'bold' : [1, 22],\n\t 'italic' : [3, 23],\n\t 'underline' : [4, 24],\n\t 'inverse' : [7, 27],\n\t 'white' : [37, 39],\n\t 'grey' : [90, 39],\n\t 'black' : [30, 39],\n\t 'blue' : [34, 39],\n\t 'cyan' : [36, 39],\n\t 'green' : [32, 39],\n\t 'magenta' : [35, 39],\n\t 'red' : [31, 39],\n\t 'yellow' : [33, 39]\n\t};\n\t\n\t// Don't use 'blue' not visible on cmd.exe\n\tinspect.styles = {\n\t 'special': 'cyan',\n\t 'number': 'yellow',\n\t 'boolean': 'yellow',\n\t 'undefined': 'grey',\n\t 'null': 'bold',\n\t 'string': 'green',\n\t 'date': 'magenta',\n\t // \"name\": intentionally not styling\n\t 'regexp': 'red'\n\t};\n\t\n\t\n\tfunction stylizeWithColor(str, styleType) {\n\t var style = inspect.styles[styleType];\n\t\n\t if (style) {\n\t return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n\t '\\u001b[' + inspect.colors[style][1] + 'm';\n\t } else {\n\t return str;\n\t }\n\t}\n\t\n\t\n\tfunction stylizeNoColor(str, styleType) {\n\t return str;\n\t}\n\t\n\t\n\tfunction arrayToHash(array) {\n\t var hash = {};\n\t\n\t array.forEach(function(val, idx) {\n\t hash[val] = true;\n\t });\n\t\n\t return hash;\n\t}\n\t\n\t\n\tfunction formatValue(ctx, value, recurseTimes) {\n\t // Provide a hook for user-specified inspect functions.\n\t // Check that value is an object with an inspect function on it\n\t if (ctx.customInspect &&\n\t value &&\n\t isFunction(value.inspect) &&\n\t // Filter out the util module, it's inspect function is special\n\t value.inspect !== exports.inspect &&\n\t // Also filter out any prototype objects using the circular check.\n\t !(value.constructor && value.constructor.prototype === value)) {\n\t var ret = value.inspect(recurseTimes, ctx);\n\t if (!isString(ret)) {\n\t ret = formatValue(ctx, ret, recurseTimes);\n\t }\n\t return ret;\n\t }\n\t\n\t // Primitive types cannot have properties\n\t var primitive = formatPrimitive(ctx, value);\n\t if (primitive) {\n\t return primitive;\n\t }\n\t\n\t // Look up the keys of the object.\n\t var keys = Object.keys(value);\n\t var visibleKeys = arrayToHash(keys);\n\t\n\t if (ctx.showHidden) {\n\t keys = Object.getOwnPropertyNames(value);\n\t }\n\t\n\t // IE doesn't make error fields non-enumerable\n\t // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n\t if (isError(value)\n\t && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n\t return formatError(value);\n\t }\n\t\n\t // Some type of object without properties can be shortcutted.\n\t if (keys.length === 0) {\n\t if (isFunction(value)) {\n\t var name = value.name ? ': ' + value.name : '';\n\t return ctx.stylize('[Function' + name + ']', 'special');\n\t }\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t }\n\t if (isDate(value)) {\n\t return ctx.stylize(Date.prototype.toString.call(value), 'date');\n\t }\n\t if (isError(value)) {\n\t return formatError(value);\n\t }\n\t }\n\t\n\t var base = '', array = false, braces = ['{', '}'];\n\t\n\t // Make Array say that they are Array\n\t if (isArray(value)) {\n\t array = true;\n\t braces = ['[', ']'];\n\t }\n\t\n\t // Make functions say that they are functions\n\t if (isFunction(value)) {\n\t var n = value.name ? ': ' + value.name : '';\n\t base = ' [Function' + n + ']';\n\t }\n\t\n\t // Make RegExps say that they are RegExps\n\t if (isRegExp(value)) {\n\t base = ' ' + RegExp.prototype.toString.call(value);\n\t }\n\t\n\t // Make dates with properties first say the date\n\t if (isDate(value)) {\n\t base = ' ' + Date.prototype.toUTCString.call(value);\n\t }\n\t\n\t // Make error with message first say the error\n\t if (isError(value)) {\n\t base = ' ' + formatError(value);\n\t }\n\t\n\t if (keys.length === 0 && (!array || value.length == 0)) {\n\t return braces[0] + base + braces[1];\n\t }\n\t\n\t if (recurseTimes < 0) {\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t } else {\n\t return ctx.stylize('[Object]', 'special');\n\t }\n\t }\n\t\n\t ctx.seen.push(value);\n\t\n\t var output;\n\t if (array) {\n\t output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n\t } else {\n\t output = keys.map(function(key) {\n\t return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n\t });\n\t }\n\t\n\t ctx.seen.pop();\n\t\n\t return reduceToSingleString(output, base, braces);\n\t}\n\t\n\t\n\tfunction formatPrimitive(ctx, value) {\n\t if (isUndefined(value))\n\t return ctx.stylize('undefined', 'undefined');\n\t if (isString(value)) {\n\t var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n\t .replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"') + '\\'';\n\t return ctx.stylize(simple, 'string');\n\t }\n\t if (isNumber(value))\n\t return ctx.stylize('' + value, 'number');\n\t if (isBoolean(value))\n\t return ctx.stylize('' + value, 'boolean');\n\t // For some reason typeof null is \"object\", so special case here.\n\t if (isNull(value))\n\t return ctx.stylize('null', 'null');\n\t}\n\t\n\t\n\tfunction formatError(value) {\n\t return '[' + Error.prototype.toString.call(value) + ']';\n\t}\n\t\n\t\n\tfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n\t var output = [];\n\t for (var i = 0, l = value.length; i < l; ++i) {\n\t if (hasOwnProperty(value, String(i))) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t String(i), true));\n\t } else {\n\t output.push('');\n\t }\n\t }\n\t keys.forEach(function(key) {\n\t if (!key.match(/^\\d+$/)) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t key, true));\n\t }\n\t });\n\t return output;\n\t}\n\t\n\t\n\tfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n\t var name, str, desc;\n\t desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n\t if (desc.get) {\n\t if (desc.set) {\n\t str = ctx.stylize('[Getter/Setter]', 'special');\n\t } else {\n\t str = ctx.stylize('[Getter]', 'special');\n\t }\n\t } else {\n\t if (desc.set) {\n\t str = ctx.stylize('[Setter]', 'special');\n\t }\n\t }\n\t if (!hasOwnProperty(visibleKeys, key)) {\n\t name = '[' + key + ']';\n\t }\n\t if (!str) {\n\t if (ctx.seen.indexOf(desc.value) < 0) {\n\t if (isNull(recurseTimes)) {\n\t str = formatValue(ctx, desc.value, null);\n\t } else {\n\t str = formatValue(ctx, desc.value, recurseTimes - 1);\n\t }\n\t if (str.indexOf('\\n') > -1) {\n\t if (array) {\n\t str = str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n').substr(2);\n\t } else {\n\t str = '\\n' + str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n');\n\t }\n\t }\n\t } else {\n\t str = ctx.stylize('[Circular]', 'special');\n\t }\n\t }\n\t if (isUndefined(name)) {\n\t if (array && key.match(/^\\d+$/)) {\n\t return str;\n\t }\n\t name = JSON.stringify('' + key);\n\t if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n\t name = name.substr(1, name.length - 2);\n\t name = ctx.stylize(name, 'name');\n\t } else {\n\t name = name.replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"')\n\t .replace(/(^\"|\"$)/g, \"'\");\n\t name = ctx.stylize(name, 'string');\n\t }\n\t }\n\t\n\t return name + ': ' + str;\n\t}\n\t\n\t\n\tfunction reduceToSingleString(output, base, braces) {\n\t var numLinesEst = 0;\n\t var length = output.reduce(function(prev, cur) {\n\t numLinesEst++;\n\t if (cur.indexOf('\\n') >= 0) numLinesEst++;\n\t return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n\t }, 0);\n\t\n\t if (length > 60) {\n\t return braces[0] +\n\t (base === '' ? '' : base + '\\n ') +\n\t ' ' +\n\t output.join(',\\n ') +\n\t ' ' +\n\t braces[1];\n\t }\n\t\n\t return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n\t}\n\t\n\t\n\t// NOTE: These type checking functions intentionally don't use `instanceof`\n\t// because it is fragile and can be easily faked with `Object.create()`.\n\tfunction isArray(ar) {\n\t return Array.isArray(ar);\n\t}\n\texports.isArray = isArray;\n\t\n\tfunction isBoolean(arg) {\n\t return typeof arg === 'boolean';\n\t}\n\texports.isBoolean = isBoolean;\n\t\n\tfunction isNull(arg) {\n\t return arg === null;\n\t}\n\texports.isNull = isNull;\n\t\n\tfunction isNullOrUndefined(arg) {\n\t return arg == null;\n\t}\n\texports.isNullOrUndefined = isNullOrUndefined;\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\texports.isNumber = isNumber;\n\t\n\tfunction isString(arg) {\n\t return typeof arg === 'string';\n\t}\n\texports.isString = isString;\n\t\n\tfunction isSymbol(arg) {\n\t return typeof arg === 'symbol';\n\t}\n\texports.isSymbol = isSymbol;\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\texports.isUndefined = isUndefined;\n\t\n\tfunction isRegExp(re) {\n\t return isObject(re) && objectToString(re) === '[object RegExp]';\n\t}\n\texports.isRegExp = isRegExp;\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\texports.isObject = isObject;\n\t\n\tfunction isDate(d) {\n\t return isObject(d) && objectToString(d) === '[object Date]';\n\t}\n\texports.isDate = isDate;\n\t\n\tfunction isError(e) {\n\t return isObject(e) &&\n\t (objectToString(e) === '[object Error]' || e instanceof Error);\n\t}\n\texports.isError = isError;\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\texports.isFunction = isFunction;\n\t\n\tfunction isPrimitive(arg) {\n\t return arg === null ||\n\t typeof arg === 'boolean' ||\n\t typeof arg === 'number' ||\n\t typeof arg === 'string' ||\n\t typeof arg === 'symbol' || // ES6 symbol\n\t typeof arg === 'undefined';\n\t}\n\texports.isPrimitive = isPrimitive;\n\t\n\texports.isBuffer = __webpack_require__(41);\n\t\n\tfunction objectToString(o) {\n\t return Object.prototype.toString.call(o);\n\t}\n\t\n\t\n\tfunction pad(n) {\n\t return n < 10 ? '0' + n.toString(10) : n.toString(10);\n\t}\n\t\n\t\n\tvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n\t 'Oct', 'Nov', 'Dec'];\n\t\n\t// 26 Feb 16:19:34\n\tfunction timestamp() {\n\t var d = new Date();\n\t var time = [pad(d.getHours()),\n\t pad(d.getMinutes()),\n\t pad(d.getSeconds())].join(':');\n\t return [d.getDate(), months[d.getMonth()], time].join(' ');\n\t}\n\t\n\t\n\t// log is just a thin wrapper to console.log that prepends a timestamp\n\texports.log = function() {\n\t console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n\t};\n\t\n\t\n\t/**\n\t * Inherit the prototype methods from one constructor into another.\n\t *\n\t * The Function.prototype.inherits from lang.js rewritten as a standalone\n\t * function (not on Function.prototype). NOTE: If this file is to be loaded\n\t * during bootstrapping this function needs to be rewritten using some native\n\t * functions as prototype setup using normal JavaScript does not work as\n\t * expected during bootstrapping (see mirror.js in r114903).\n\t *\n\t * @param {function} ctor Constructor function which needs to inherit the\n\t * prototype.\n\t * @param {function} superCtor Constructor function to inherit prototype from.\n\t */\n\texports.inherits = __webpack_require__(42);\n\t\n\texports._extend = function(origin, add) {\n\t // Don't do anything if add isn't an object\n\t if (!add || !isObject(add)) return origin;\n\t\n\t var keys = Object.keys(add);\n\t var i = keys.length;\n\t while (i--) {\n\t origin[keys[i]] = add[keys[i]];\n\t }\n\t return origin;\n\t};\n\t\n\tfunction hasOwnProperty(obj, prop) {\n\t return Object.prototype.hasOwnProperty.call(obj, prop);\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(38)))\n\n/***/ },\n/* 41 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function isBuffer(arg) {\n\t return arg && typeof arg === 'object'\n\t && typeof arg.copy === 'function'\n\t && typeof arg.fill === 'function'\n\t && typeof arg.readUInt8 === 'function';\n\t}\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t // implementation from standard node.js 'util' module\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t ctor.prototype = Object.create(superCtor.prototype, {\n\t constructor: {\n\t value: ctor,\n\t enumerable: false,\n\t writable: true,\n\t configurable: true\n\t }\n\t });\n\t };\n\t} else {\n\t // old school shim for old browsers\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t var TempCtor = function () {}\n\t TempCtor.prototype = superCtor.prototype\n\t ctor.prototype = new TempCtor()\n\t ctor.prototype.constructor = ctor\n\t }\n\t}\n\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\tmodule.exports = Yallist\n\t\n\tYallist.Node = Node\n\tYallist.create = Yallist\n\t\n\tfunction Yallist (list) {\n\t var self = this\n\t if (!(self instanceof Yallist)) {\n\t self = new Yallist()\n\t }\n\t\n\t self.tail = null\n\t self.head = null\n\t self.length = 0\n\t\n\t if (list && typeof list.forEach === 'function') {\n\t list.forEach(function (item) {\n\t self.push(item)\n\t })\n\t } else if (arguments.length > 0) {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t self.push(arguments[i])\n\t }\n\t }\n\t\n\t return self\n\t}\n\t\n\tYallist.prototype.removeNode = function (node) {\n\t if (node.list !== this) {\n\t throw new Error('removing node which does not belong to this list')\n\t }\n\t\n\t var next = node.next\n\t var prev = node.prev\n\t\n\t if (next) {\n\t next.prev = prev\n\t }\n\t\n\t if (prev) {\n\t prev.next = next\n\t }\n\t\n\t if (node === this.head) {\n\t this.head = next\n\t }\n\t if (node === this.tail) {\n\t this.tail = prev\n\t }\n\t\n\t node.list.length --\n\t node.next = null\n\t node.prev = null\n\t node.list = null\n\t}\n\t\n\tYallist.prototype.unshiftNode = function (node) {\n\t if (node === this.head) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var head = this.head\n\t node.list = this\n\t node.next = head\n\t if (head) {\n\t head.prev = node\n\t }\n\t\n\t this.head = node\n\t if (!this.tail) {\n\t this.tail = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.pushNode = function (node) {\n\t if (node === this.tail) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var tail = this.tail\n\t node.list = this\n\t node.prev = tail\n\t if (tail) {\n\t tail.next = node\n\t }\n\t\n\t this.tail = node\n\t if (!this.head) {\n\t this.head = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.push = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t push(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.unshift = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t unshift(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.pop = function () {\n\t if (!this.tail)\n\t return undefined\n\t\n\t var res = this.tail.value\n\t this.tail = this.tail.prev\n\t this.tail.next = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.shift = function () {\n\t if (!this.head)\n\t return undefined\n\t\n\t var res = this.head.value\n\t this.head = this.head.next\n\t this.head.prev = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.head, i = 0; walker !== null; i++) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.next\n\t }\n\t}\n\t\n\tYallist.prototype.forEachReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.prev\n\t }\n\t}\n\t\n\tYallist.prototype.get = function (n) {\n\t for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.next\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.getReverse = function (n) {\n\t for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.prev\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.map = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.head; walker !== null; ) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.next\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.mapReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.tail; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.prev\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.reduce = function (fn, initial) {\n\t var acc\n\t var walker = this.head\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.head) {\n\t walker = this.head.next\n\t acc = this.head.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = 0; walker !== null; i++) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.next\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.reduceReverse = function (fn, initial) {\n\t var acc\n\t var walker = this.tail\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.tail) {\n\t walker = this.tail.prev\n\t acc = this.tail.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = this.length - 1; walker !== null; i--) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.prev\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.toArray = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.head; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.next\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.toArrayReverse = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.tail; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.prev\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.slice = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n\t walker = walker.next\n\t }\n\t for (; walker !== null && i < to; i++, walker = walker.next) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.sliceReverse = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n\t walker = walker.prev\n\t }\n\t for (; walker !== null && i > from; i--, walker = walker.prev) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.reverse = function () {\n\t var head = this.head\n\t var tail = this.tail\n\t for (var walker = head; walker !== null; walker = walker.prev) {\n\t var p = walker.prev\n\t walker.prev = walker.next\n\t walker.next = p\n\t }\n\t this.head = tail\n\t this.tail = head\n\t return this\n\t}\n\t\n\tfunction push (self, item) {\n\t self.tail = new Node(item, self.tail, null, self)\n\t if (!self.head) {\n\t self.head = self.tail\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction unshift (self, item) {\n\t self.head = new Node(item, null, self.head, self)\n\t if (!self.tail) {\n\t self.tail = self.head\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction Node (value, prev, next, list) {\n\t if (!(this instanceof Node)) {\n\t return new Node(value, prev, next, list)\n\t }\n\t\n\t this.list = list\n\t this.value = value\n\t\n\t if (prev) {\n\t prev.next = this\n\t this.prev = prev\n\t } else {\n\t this.prev = null\n\t }\n\t\n\t if (next) {\n\t next.prev = this\n\t this.next = next\n\t } else {\n\t this.next = null\n\t }\n\t}\n\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Tile2 = __webpack_require__(45);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(46);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar ImageTile = (function (_Tile) {\n\t _inherits(ImageTile, _Tile);\n\t\n\t function ImageTile(quadcode, path, layer) {\n\t _classCallCheck(this, ImageTile);\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the various tile provider\n\t\n\t _createClass(ImageTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTexture();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear image reference\n\t this._image = null;\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t depthWrite: false\n\t });\n\t\n\t var localMesh = new _three2['default'].Mesh(geom, material);\n\t localMesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t mesh.add(localMesh);\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t var box = new _vendorBoxHelper2['default'](localMesh);\n\t mesh.add(box);\n\t\n\t mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTexture',\n\t value: function _requestTexture() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t var image = document.createElement('img');\n\t\n\t image.addEventListener('load', function (event) {\n\t var texture = new _three2['default'].Texture();\n\t\n\t texture.image = image;\n\t texture.needsUpdate = true;\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t // Something went wrong and the tile or its material is missing\n\t //\n\t // Possibly removed by the cache before the image loaded\n\t if (!_this2._mesh || !_this2._mesh.children[0] || !_this2._mesh.children[0].material) {\n\t return;\n\t }\n\t\n\t _this2._mesh.children[0].material.map = texture;\n\t _this2._mesh.children[0].material.needsUpdate = true;\n\t\n\t _this2._texture = texture;\n\t _this2._ready = true;\n\t }, false);\n\t\n\t // image.addEventListener('progress', event => {}, false);\n\t // image.addEventListener('error', event => {}, false);\n\t\n\t image.crossOrigin = '';\n\t\n\t // Load image\n\t image.src = url;\n\t\n\t this._image = image;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._image) {\n\t return;\n\t }\n\t\n\t this._image.src = '';\n\t }\n\t }]);\n\t\n\t return ImageTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer) {\n\t return new ImageTile(quadcode, path, layer);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _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\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// Manages a single tile and its layers\n\t\n\tvar r2d = 180 / Math.PI;\n\t\n\tvar tileURLRegex = /\\{([szxy])\\}/g;\n\t\n\tvar Tile = (function () {\n\t function Tile(quadcode, path, layer) {\n\t _classCallCheck(this, Tile);\n\t\n\t this._layer = layer;\n\t this._quadcode = quadcode;\n\t this._path = path;\n\t\n\t this._ready = false;\n\t\n\t this._tile = this._quadcodeToTile(quadcode);\n\t\n\t // Bottom-left and top-right bounds in WGS84 coordinates\n\t this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\t\n\t // Bottom-left and top-right bounds in world coordinates\n\t this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\t\n\t // Tile center in world coordinates\n\t this._center = this._boundsToCenter(this._boundsWorld);\n\t\n\t // Length of a tile side in world coorindates\n\t this._side = this._getSide(this._boundsWorld);\n\t }\n\t\n\t // Returns true if the tile mesh and texture are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(Tile, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return this._ready;\n\t }\n\t\n\t // Request data for the tile\n\t }, {\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {}\n\t }, {\n\t key: 'getQuadcode',\n\t value: function getQuadcode() {\n\t return this._quadcode;\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {\n\t return this._boundsWorld;\n\t }\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t }, {\n\t key: 'getSide',\n\t value: function getSide() {\n\t return this._side;\n\t }\n\t }, {\n\t key: 'getMesh',\n\t value: function getMesh() {\n\t return this._mesh;\n\t }\n\t\n\t // Destroys the tile and removes it from the layer and memory\n\t //\n\t // Ensure that this leaves no trace of the tile – no textures, no meshes,\n\t // nothing in memory or the GPU\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Delete reference to layer\n\t this._layer = null;\n\t\n\t // Delete location references\n\t this._boundsLatLon = null;\n\t this._boundsWorld = null;\n\t this._center = null;\n\t\n\t // Done if no mesh\n\t if (!this._mesh) {\n\t return;\n\t }\n\t\n\t if (this._mesh.children) {\n\t // Dispose of mesh and materials\n\t this._mesh.children.forEach(function (child) {\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t });\n\t } else {\n\t this._mesh.geometry.dispose();\n\t this._mesh.geometry = null;\n\t\n\t if (this._mesh.material.map) {\n\t this._mesh.material.map.dispose();\n\t this._mesh.material.map = null;\n\t }\n\t\n\t this._mesh.material.dispose();\n\t this._mesh.material = null;\n\t }\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {}\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {}\n\t }, {\n\t key: '_getTileURL',\n\t value: function _getTileURL(urlParams) {\n\t if (!urlParams.s) {\n\t // Default to a random choice of a, b or c\n\t s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n\t }\n\t\n\t tileURLRegex.lastIndex = 0;\n\t return this._path.replace(tileURLRegex, function (value, key) {\n\t // Replace with paramter, otherwise keep existing value\n\t return urlParams[key];\n\t });\n\t }\n\t\n\t // Convert from quadcode to TMS tile coordinates\n\t }, {\n\t key: '_quadcodeToTile',\n\t value: function _quadcodeToTile(quadcode) {\n\t var x = 0;\n\t var y = 0;\n\t var z = quadcode.length;\n\t\n\t for (var i = z; i > 0; i--) {\n\t var mask = 1 << i - 1;\n\t var q = +quadcode[z - i];\n\t if (q === 1) {\n\t x |= mask;\n\t }\n\t if (q === 2) {\n\t y |= mask;\n\t }\n\t if (q === 3) {\n\t x |= mask;\n\t y |= mask;\n\t }\n\t }\n\t\n\t return [x, y, z];\n\t }\n\t\n\t // Convert WGS84 tile bounds to world coordinates\n\t }, {\n\t key: '_tileBoundsFromWGS84',\n\t value: function _tileBoundsFromWGS84(boundsWGS84) {\n\t var sw = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[1], boundsWGS84[0]));\n\t var ne = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[3], boundsWGS84[2]));\n\t\n\t return [sw.x, sw.y, ne.x, ne.y];\n\t }\n\t\n\t // Get tile bounds in WGS84 coordinates\n\t }, {\n\t key: '_tileBoundsWGS84',\n\t value: function _tileBoundsWGS84(tile) {\n\t var e = this._tile2lon(tile[0] + 1, tile[2]);\n\t var w = this._tile2lon(tile[0], tile[2]);\n\t var s = this._tile2lat(tile[1] + 1, tile[2]);\n\t var n = this._tile2lat(tile[1], tile[2]);\n\t return [w, s, e, n];\n\t }\n\t }, {\n\t key: '_tile2lon',\n\t value: function _tile2lon(x, z) {\n\t return x / Math.pow(2, z) * 360 - 180;\n\t }\n\t }, {\n\t key: '_tile2lat',\n\t value: function _tile2lat(y, z) {\n\t var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n\t return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n\t }\n\t }, {\n\t key: '_boundsToCenter',\n\t value: function _boundsToCenter(bounds) {\n\t var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n\t var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\t\n\t return [x, y];\n\t }\n\t }, {\n\t key: '_getSide',\n\t value: function _getSide(bounds) {\n\t return new _three2['default'].Vector3(bounds[0], 0, bounds[3]).sub(new _three2['default'].Vector3(bounds[0], 0, bounds[1])).length();\n\t }\n\t }]);\n\t\n\t return Tile;\n\t})();\n\t\n\texports['default'] = Tile;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tBoxHelper = function (object) {\n\t\n\t\tvar indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);\n\t\tvar positions = new Float32Array(8 * 3);\n\t\n\t\tvar geometry = new _three2['default'].BufferGeometry();\n\t\tgeometry.setIndex(new _three2['default'].BufferAttribute(indices, 1));\n\t\tgeometry.addAttribute('position', new _three2['default'].BufferAttribute(positions, 3));\n\t\n\t\t_three2['default'].LineSegments.call(this, geometry, new _three2['default'].LineBasicMaterial({ linewidth: 2, color: 0xff0000 }));\n\t\n\t\tif (object !== undefined) {\n\t\n\t\t\tthis.update(object);\n\t\t}\n\t};\n\t\n\tBoxHelper.prototype = Object.create(_three2['default'].LineSegments.prototype);\n\tBoxHelper.prototype.constructor = BoxHelper;\n\t\n\tBoxHelper.prototype.update = (function () {\n\t\n\t\tvar box = new _three2['default'].Box3();\n\t\n\t\treturn function (object) {\n\t\n\t\t\tbox.setFromObject(object);\n\t\n\t\t\tif (box.isEmpty()) return;\n\t\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\t\n\t\t\t/*\n\t 5____4\n\t 1/___0/|\n\t | 6__|_7\n\t 2/___3/\n\t \t0: max.x, max.y, max.z\n\t 1: min.x, max.y, max.z\n\t 2: min.x, min.y, max.z\n\t 3: max.x, min.y, max.z\n\t 4: max.x, max.y, min.z\n\t 5: min.x, max.y, min.z\n\t 6: min.x, min.y, min.z\n\t 7: max.x, min.y, min.z\n\t */\n\t\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\t\n\t\t\tarray[0] = max.x;array[1] = max.y;array[2] = max.z;\n\t\t\tarray[3] = min.x;array[4] = max.y;array[5] = max.z;\n\t\t\tarray[6] = min.x;array[7] = min.y;array[8] = max.z;\n\t\t\tarray[9] = max.x;array[10] = min.y;array[11] = max.z;\n\t\t\tarray[12] = max.x;array[13] = max.y;array[14] = min.z;\n\t\t\tarray[15] = min.x;array[16] = max.y;array[17] = min.z;\n\t\t\tarray[18] = min.x;array[19] = min.y;array[20] = min.z;\n\t\t\tarray[21] = max.x;array[22] = min.y;array[23] = min.z;\n\t\n\t\t\tposition.needsUpdate = true;\n\t\n\t\t\tthis.geometry.computeBoundingSphere();\n\t\t};\n\t})();\n\t\n\texports['default'] = BoxHelper;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\texports['default'] = function (colour) {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 1;\n\t canvas.height = 1;\n\t\n\t var context = canvas.getContext('2d');\n\t context.fillStyle = colour;\n\t context.fillRect(0, 0, canvas.width, canvas.height);\n\t // context.strokeStyle = '#D0D0CF';\n\t // context.strokeRect(0, 0, canvas.width, canvas.height);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // // Silky smooth images when tilted\n\t // texture.magFilter = THREE.LinearFilter;\n\t // texture.minFilter = THREE.LinearMipMapLinearFilter;\n\t // //\n\t // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t // texture.anisotropy = 4;\n\t\n\t // texture.wrapS = THREE.RepeatWrapping;\n\t // texture.wrapT = THREE.RepeatWrapping;\n\t // texture.repeat.set(segments, segments);\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t depthWrite: false\n\t });\n\t\n\t return material;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.0 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar debounce = __webpack_require__(49);\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/**\n\t * Creates a throttled function that only invokes `func` at most once per\n\t * every `wait` milliseconds. The throttled function comes with a `cancel`\n\t * method to cancel delayed `func` invocations and a `flush` method to\n\t * immediately invoke them. Provide an options object to indicate whether\n\t * `func` should be invoked on the leading and/or trailing edge of the `wait`\n\t * timeout. The `func` is invoked with the last arguments provided to the\n\t * throttled function. Subsequent calls to the throttled function return the\n\t * result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the throttled function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.throttle` and `_.debounce`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to throttle.\n\t * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=true] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new throttled function.\n\t * @example\n\t *\n\t * // avoid excessively updating the position while scrolling\n\t * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n\t *\n\t * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n\t * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n\t * jQuery(element).on('click', throttled);\n\t *\n\t * // cancel a trailing throttled invocation\n\t * jQuery(window).on('popstate', throttled.cancel);\n\t */\n\tfunction throttle(func, wait, options) {\n\t var leading = true,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t if (isObject(options)) {\n\t leading = 'leading' in options ? !!options.leading : leading;\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t // Avoid a V8 JIT bug in Chrome 19-20.\n\t // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\tmodule.exports = throttle;\n\n\n/***/ },\n/* 49 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Gets the timestamp of the number of milliseconds that have elapsed since\n\t * the Unix epoch (1 January 1970 00:00:00 UTC).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Date\n\t * @returns {number} Returns the timestamp.\n\t * @example\n\t *\n\t * _.defer(function(stamp) {\n\t * console.log(_.now() - stamp);\n\t * }, _.now());\n\t * // => logs the number of milliseconds it took for the deferred function to be invoked\n\t */\n\tvar now = Date.now;\n\t\n\t/**\n\t * Creates a debounced function that delays invoking `func` until after `wait`\n\t * milliseconds have elapsed since the last time the debounced function was\n\t * invoked. The debounced function comes with a `cancel` method to cancel\n\t * delayed `func` invocations and a `flush` method to immediately invoke them.\n\t * Provide an options object to indicate whether `func` should be invoked on\n\t * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n\t * with the last arguments provided to the debounced function. Subsequent calls\n\t * to the debounced function return the result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the debounced function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.debounce` and `_.throttle`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to debounce.\n\t * @param {number} [wait=0] The number of milliseconds to delay.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=false] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n\t * delayed before it's invoked.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new debounced function.\n\t * @example\n\t *\n\t * // Avoid costly calculations while the window size is in flux.\n\t * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n\t *\n\t * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n\t * jQuery(element).on('click', _.debounce(sendMail, 300, {\n\t * 'leading': true,\n\t * 'trailing': false\n\t * }));\n\t *\n\t * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n\t * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n\t * var source = new EventSource('/stream');\n\t * jQuery(source).on('message', debounced);\n\t *\n\t * // Cancel the trailing debounced invocation.\n\t * jQuery(window).on('popstate', debounced.cancel);\n\t */\n\tfunction debounce(func, wait, options) {\n\t var args,\n\t maxTimeoutId,\n\t result,\n\t stamp,\n\t thisArg,\n\t timeoutId,\n\t trailingCall,\n\t lastCalled = 0,\n\t leading = false,\n\t maxWait = false,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t wait = toNumber(wait) || 0;\n\t if (isObject(options)) {\n\t leading = !!options.leading;\n\t maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t\n\t function cancel() {\n\t if (timeoutId) {\n\t clearTimeout(timeoutId);\n\t }\n\t if (maxTimeoutId) {\n\t clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = 0;\n\t args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n\t }\n\t\n\t function complete(isCalled, id) {\n\t if (id) {\n\t clearTimeout(id);\n\t }\n\t maxTimeoutId = timeoutId = trailingCall = undefined;\n\t if (isCalled) {\n\t lastCalled = now();\n\t result = func.apply(thisArg, args);\n\t if (!timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t }\n\t }\n\t\n\t function delayed() {\n\t var remaining = wait - (now() - stamp);\n\t if (remaining <= 0 || remaining > wait) {\n\t complete(trailingCall, maxTimeoutId);\n\t } else {\n\t timeoutId = setTimeout(delayed, remaining);\n\t }\n\t }\n\t\n\t function flush() {\n\t if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n\t result = func.apply(thisArg, args);\n\t }\n\t cancel();\n\t return result;\n\t }\n\t\n\t function maxDelayed() {\n\t complete(trailing, timeoutId);\n\t }\n\t\n\t function debounced() {\n\t args = arguments;\n\t stamp = now();\n\t thisArg = this;\n\t trailingCall = trailing && (timeoutId || !leading);\n\t\n\t if (maxWait === false) {\n\t var leadingCall = leading && !timeoutId;\n\t } else {\n\t if (!maxTimeoutId && !leading) {\n\t lastCalled = stamp;\n\t }\n\t var remaining = maxWait - (stamp - lastCalled),\n\t isCalled = remaining <= 0 || remaining > maxWait;\n\t\n\t if (isCalled) {\n\t if (maxTimeoutId) {\n\t maxTimeoutId = clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = stamp;\n\t result = func.apply(thisArg, args);\n\t }\n\t else if (!maxTimeoutId) {\n\t maxTimeoutId = setTimeout(maxDelayed, remaining);\n\t }\n\t }\n\t if (isCalled && timeoutId) {\n\t timeoutId = clearTimeout(timeoutId);\n\t }\n\t else if (!timeoutId && wait !== maxWait) {\n\t timeoutId = setTimeout(delayed, wait);\n\t }\n\t if (leadingCall) {\n\t isCalled = true;\n\t result = func.apply(thisArg, args);\n\t }\n\t if (isCalled && !timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t return result;\n\t }\n\t debounced.cancel = cancel;\n\t debounced.flush = flush;\n\t return debounced;\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = debounce;\n\n\n/***/ }\n/******/ ])\n});\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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap a24aec6171fe092a867e\n **/","import World from './World';\nimport Controls from './controls/index';\nimport EnvironmentLayer from './layer/environment/EnvironmentLayer';\nimport ImageTileLayer from './layer/tile/ImageTileLayer';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\n\nconst VIZI = {\n version: '0.3',\n\n // Public API\n World: World,\n Controls: Controls,\n EnvironmentLayer: EnvironmentLayer,\n ImageTileLayer: ImageTileLayer,\n Point: Point,\n LatLon: LatLon\n};\n\nexport default VIZI;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vizicities.js\n **/","import EventEmitter from 'eventemitter3';\nimport extend from 'lodash.assign';\nimport CRS from './geo/CRS/index';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\nimport Engine from './engine/Engine';\n\n// Pretty much any event someone using ViziCities would need will be emitted or\n// proxied by World (eg. render events, etc)\n\nclass World extends EventEmitter {\n constructor(domId, options) {\n super();\n\n var defaults = {\n crs: CRS.EPSG3857\n };\n\n this.options = extend(defaults, options);\n\n this._layers = [];\n this._controls = [];\n\n this._initContainer(domId);\n this._initEngine();\n this._initEvents();\n\n // Kick off the update and render loop\n this._update();\n }\n\n _initContainer(domId) {\n this._container = document.getElementById(domId);\n }\n\n _initEngine() {\n this._engine = Engine(this._container);\n\n // Engine events\n //\n // Consider proxying these through events on World for public access\n // this._engine.on('preRender', () => {});\n // this._engine.on('postRender', () => {});\n }\n\n _initEvents() {\n this.on('controlsMoveEnd', this._onControlsMoveEnd);\n }\n\n _onControlsMoveEnd(point) {\n var _point = Point(point.x, point.z);\n this._resetView(this.pointToLatLon(_point), _point);\n }\n\n // Reset world view\n _resetView(latlon, point) {\n this.emit('preResetView');\n\n this._moveStart();\n this._move(latlon, point);\n this._moveEnd();\n\n this.emit('postResetView');\n }\n\n _moveStart() {\n this.emit('moveStart');\n }\n\n _move(latlon, point) {\n this._lastPosition = latlon;\n this.emit('move', latlon, point);\n }\n _moveEnd() {\n this.emit('moveEnd');\n }\n\n _update() {\n var delta = this._engine.clock.getDelta();\n\n // Once _update is called it will run forever, for now\n window.requestAnimationFrame(this._update.bind(this));\n\n // Update controls\n this._controls.forEach(controls => {\n controls.update();\n });\n\n this.emit('preUpdate');\n this._engine.update(delta);\n this.emit('postUpdate');\n }\n\n // Set world view\n setView(latlon) {\n // Store initial geographic coordinate for the [0,0,0] world position\n //\n // The origin point doesn't move in three.js / 3D space so only set it once\n // here instead of every time _resetView is called\n //\n // If it was updated every time then coorindates would shift over time and\n // would be out of place / context with previously-placed points (0,0 would\n // refer to a different point each time)\n this._originLatlon = latlon;\n this._originPoint = this.project(latlon);\n\n this._resetView(latlon);\n return this;\n }\n\n // Return world geographic position\n getPosition() {\n return this._lastPosition;\n }\n\n // Transform geographic coordinate to world point\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the origin point of the projection (not the world)\n project(latlon) {\n return this.options.crs.latLonToPoint(LatLon(latlon));\n }\n\n // Transform world point to geographic coordinate\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a point relative to the origin point of the\n // projection (not the world) and returns a geographic coordinate\n unproject(point) {\n return this.options.crs.pointToLatLon(Point(point));\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the three.js / 3D origin (0,0)\n latLonToPoint(latlon) {\n var projectedPoint = this.project(LatLon(latlon));\n return projectedPoint._subtract(this._originPoint);\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a point relative to the three.js / 3D origin (0,0)\n // and returns the exact geographic coordinate at that point\n pointToLatLon(point) {\n var projectedPoint = Point(point).add(this._originPoint);\n return this.unproject(projectedPoint);\n }\n\n // Unsure if it's a good idea to expose this here for components like\n // GridLayer to use (eg. to keep track of a frustum)\n getCamera() {\n return this._engine._camera;\n }\n\n addLayer(layer) {\n layer._addToWorld(this);\n\n this._layers.push(layer);\n\n // Could move this into Layer but it'll do here for now\n this._engine._scene.add(layer._layer);\n\n this.emit('layerAdded', layer);\n return this;\n }\n\n // Remove layer and perform clean up operations\n removeLayer(layer) {\n var layerIndex = this._layers.indexOf(layer);\n\n if (layerIndex > -1) {\n // Remove from this._layers\n this._layers.splice(layerIndex, 1);\n };\n\n this._engine._scene.remove(layer._layer);\n\n layer.destroy();\n\n this.emit('layerRemoved');\n return this;\n }\n\n addControls(controls) {\n controls._addToWorld(this);\n\n this._controls.push(controls);\n\n this.emit('controlsAdded', controls);\n return this;\n }\n\n removeControls(controls) {}\n}\n\n// Initialise without requiring new keyword\nexport default function(domId, options) {\n return new World(domId, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/World.js\n **/","'use strict';\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} once Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Holds the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events && this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if ('function' === typeof listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Functon} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return this;\n\n var listeners = this._events[evt]\n , events = [];\n\n if (fn) {\n if (listeners.fn) {\n if (\n listeners.fn !== fn\n || (once && !listeners.once)\n || (context && listeners.context !== context)\n ) {\n events.push(listeners);\n }\n } else {\n for (var i = 0, length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) {\n this._events[evt] = events.length === 1 ? events[0] : events;\n } else {\n delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n if (!this._events) return this;\n\n if (event) delete this._events[prefix ? prefix + event : event];\n else this._events = prefix ? {} : Object.create(null);\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/eventemitter3/index.js\n ** module id = 2\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar keys = require('lodash.keys'),\n rest = require('lodash.rest');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if ((!eq(objValue, value) ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object) {\n return copyObjectWith(source, props, object);\n}\n\n/**\n * This function is like `copyObject` except that it accepts a function to\n * customize copied values.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObjectWith(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\n assignValue(object, key, newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return rest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Assigns own enumerable properties of source objects to the destination\n * object. Source objects are applied from left to right. Subsequent sources\n * overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.c = 3;\n * }\n *\n * function Bar() {\n * this.e = 5;\n * }\n *\n * Foo.prototype.d = 4;\n * Bar.prototype.f = 6;\n *\n * _.assign({ 'a': 1 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3, 'e': 5 }\n */\nvar assign = createAssigner(function(object, source) {\n copyObject(source, keys(source), object);\n});\n\nmodule.exports = assign;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.assign/index.js\n ** module id = 3\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n stringTag = '[object String]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototypeOf = Object.getPrototypeOf,\n propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = Object.keys;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n // that are composed entirely of index properties, return `false` for\n // `hasOwnProperty` checks of them.\n return hasOwnProperty.call(object, key) ||\n (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @type Function\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n var length = object ? object.length : undefined;\n if (isLength(length) &&\n (isArray(object) || isString(object) || isArguments(object))) {\n return baseTimes(length, String);\n }\n return null;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n var isProto = isPrototype(object);\n if (!(isProto || isArrayLike(object))) {\n return baseKeys(object);\n }\n var indexes = indexKeys(object),\n skipIndexes = !!indexes,\n result = indexes || [],\n length = result.length;\n\n for (var key in object) {\n if (baseHas(object, key) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n !(isProto && key == 'constructor')) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.keys/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n var length = args.length;\n switch (length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3');\n * // => 3\n */\nfunction toInteger(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n var remainder = value % 1;\n return value === value ? (remainder ? value - remainder : value) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = rest;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.rest/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import EPSG3857 from './CRS.EPSG3857';\nimport {EPSG900913} from './CRS.EPSG3857';\nimport EPSG3395 from './CRS.EPSG3395';\nimport EPSG4326 from './CRS.EPSG4326';\nimport Simple from './CRS.Simple';\nimport Proj4 from './CRS.Proj4';\n\nconst CRS = {};\n\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\nCRS.Proj4 = Proj4;\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/index.js\n **/","/*\n * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport SphericalMercator from '../projection/Projection.SphericalMercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3857 = {\n code: 'EPSG:3857',\n projection: SphericalMercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * SphericalMercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * SphericalMercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3857 = extend({}, Earth, _EPSG3857);\n\nconst EPSG900913 = extend({}, EPSG3857, {\n code: 'EPSG:900913'\n});\n\nexport {EPSG900913};\n\nexport default EPSG3857;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3857.js\n **/","/*\n * CRS.Earth is the base class for all CRS representing Earth.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLon from '../LatLon';\n\nconst Earth = {\n wrapLon: [-180, 180],\n\n R: 6378137,\n\n // Distance between two geographical points using spherical law of cosines\n // approximation or Haversine\n //\n // See: http://www.movable-type.co.uk/scripts/latlong.html\n distance: function(latlon1, latlon2, accurate) {\n var rad = Math.PI / 180;\n\n var lat1;\n var lat2;\n\n var a;\n\n if (!accurate) {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\n return this.R * Math.acos(Math.min(a, 1));\n } else {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n var lon1 = latlon1.lon * rad;\n var lon2 = latlon2.lon * rad;\n\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n\n var halfDeltaLat = deltaLat / 2;\n var halfDeltaLon = deltaLon / 2;\n\n a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return this.R * c;\n }\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Defaults to a scale factor of 1 if no calculation method exists\n //\n // Probably need to run this through the CRS transformation or similar so the\n // resulting scale is relative to the dimensions of the world space\n // Eg. 1 metre in projected space is likly scaled up or down to some other\n // number\n pointScale: function(latlon, accurate) {\n return (this.projection.pointScale) ? this.projection.pointScale(latlon, accurate) : [1, 1];\n },\n\n // Convert real metres to projected units\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n metresToProjected: function(metres, pointScale) {\n return metres * pointScale[1];\n },\n\n // Convert projected units to real metres\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n projectedToMetres: function(projectedUnits, pointScale) {\n return projectedUnits / pointScale[1];\n },\n\n // Convert real metres to a value in world (WebGL) units\n metresToWorld: function(metres, pointScale, zoom) {\n // Transform metres to projected metres using the latitude point scale\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n var projectedMetres = this.metresToProjected(metres, pointScale);\n\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n // Scale projected metres\n var scaledMetres = (scale * (this.transformScale * projectedMetres)) / pointScale[1];\n\n return scaledMetres;\n },\n\n // Convert world (WebGL) units to a value in real metres\n worldToMetres: function(worldUnits, pointScale, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var projectedUnits = ((worldUnits / scale) / this.transformScale) * pointScale[1];\n var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\n return realMetres;\n }\n};\n\nexport default extend({}, CRS, Earth);\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Earth.js\n **/","/*\n * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\nimport wrapNum from '../../util/wrapNum';\n\nconst CRS = {\n // Scale factor determines final dimensions of world space\n //\n // Projection transformation in range -1 to 1 is multiplied by scale factor to\n // find final world coordinates\n //\n // Scale factor can be considered as half the amount of the desired dimension\n // for the largest side when transformation is equal to 1 or -1, or as the\n // distance between 0 and 1 on the largest side\n //\n // For example, if you want the world dimensions to be between -1000 and 1000\n // then the scale factor will be 1000\n scaleFactor: 1000000,\n\n // Converts geo coords to pixel / WebGL ones\n latLonToPoint: function(latlon, zoom) {\n var projectedPoint = this.projection.project(latlon);\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n return this.transformation._transform(projectedPoint, scale);\n },\n\n // Converts pixel / WebGL coords to geo coords\n pointToLatLon: function(point, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var untransformedPoint = this.transformation.untransform(point, scale);\n\n return this.projection.unproject(untransformedPoint);\n },\n\n // Converts geo coords to projection-specific coords (e.g. in meters)\n project: function(latlon) {\n return this.projection.project(latlon);\n },\n\n // Converts projected coords to geo coords\n unproject: function(point) {\n return this.projection.unproject(point);\n },\n\n // If zoom is provided, returns the map width in pixels for a given zoom\n // Else, provides fixed scale value\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom >= 0) {\n return 256 * Math.pow(2, zoom);\n // Else, return fixed scale value to expand projected coordinates from\n // their 0 to 1 range into something more practical\n } else {\n return this.scaleFactor;\n }\n },\n\n // Returns zoom level for a given scale value\n // This only works with a scale value that is based on map pixel width\n zoom: function(scale) {\n return Math.log(scale / 256) / Math.LN2;\n },\n\n // Returns the bounds of the world in projected coords if applicable\n getProjectedBounds: function(zoom) {\n if (this.infinite) { return null; }\n\n var b = this.projection.bounds;\n var s = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n s /= 2;\n }\n\n // Bottom left\n var min = this.transformation.transform(Point(b[0]), s);\n\n // Top right\n var max = this.transformation.transform(Point(b[1]), s);\n\n return [min, max];\n },\n\n // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n // wrapLon: [min, max],\n // wrapLat: [min, max],\n\n // If true, the coordinate space will be unbounded (infinite in all directions)\n // infinite: false,\n\n // Wraps geo coords in certain ranges if applicable\n wrapLatLon: function(latlon) {\n var lat = this.wrapLat ? wrapNum(latlon.lat, this.wrapLat, true) : latlon.lat;\n var lon = this.wrapLon ? wrapNum(latlon.lon, this.wrapLon, true) : latlon.lon;\n var alt = latlon.alt;\n\n return LatLon(lat, lon, alt);\n }\n};\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.js\n **/","/*\n * LatLon is a helper class for ensuring consistent geographic coordinates.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n */\n\nclass LatLon {\n constructor(lat, lon, alt) {\n if (isNaN(lat) || isNaN(lon)) {\n throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n }\n\n this.lat = +lat;\n this.lon = +lon;\n\n if (alt !== undefined) {\n this.alt = +alt;\n }\n }\n\n clone() {\n return new LatLon(this.lat, this.lon, this.alt);\n }\n}\n\n// Initialise without requiring new keyword\n//\n// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n// Also converts between lng and lon\nexport default function(a, b, c) {\n if (a instanceof LatLon) {\n return a;\n }\n if (Array.isArray(a) && typeof a[0] !== 'object') {\n if (a.length === 3) {\n return new LatLon(a[0], a[1], a[2]);\n }\n if (a.length === 2) {\n return new LatLon(a[0], a[1]);\n }\n return null;\n }\n if (a === undefined || a === null) {\n return a;\n }\n if (typeof a === 'object' && 'lat' in a) {\n return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n }\n if (b === undefined) {\n return null;\n }\n return new LatLon(a, b, c);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/LatLon.js\n **/","/*\n * Point is a helper class for ensuring consistent world positions.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n */\n\nclass Point {\n constructor(x, y, round) {\n this.x = (round ? Math.round(x) : x);\n this.y = (round ? Math.round(y) : y);\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n // Non-destructive\n add(point) {\n return this.clone()._add(_point(point));\n }\n\n // Destructive\n _add(point) {\n this.x += point.x;\n this.y += point.y;\n return this;\n }\n\n // Non-destructive\n subtract(point) {\n return this.clone()._subtract(_point(point));\n }\n\n // Destructive\n _subtract(point) {\n this.x -= point.x;\n this.y -= point.y;\n return this;\n }\n}\n\n// Accepts (point), ([x, y]) and (x, y, round)\nvar _point = function(x, y, round) {\n if (x instanceof Point) {\n return x;\n }\n if (Array.isArray(x)) {\n return new Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n return new Point(x, y, round);\n};\n\n// Initialise without requiring new keyword\nexport default _point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Point.js\n **/","/*\n * Wrap the given number to lie within a certain range (eg. longitude)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n */\n\nconst wrapNum = function(x, range, includeMax) {\n var max = range[1];\n var min = range[0];\n var d = max - min;\n return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n};\n\nexport default wrapNum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/wrapNum.js\n **/","/*\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n * used by default.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst SphericalMercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n MAX_LATITUDE: 85.0511287798,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var max = this.MAX_LATITUDE;\n var lat = Math.max(Math.min(max, latlon.lat), -max);\n var sin = Math.sin(lat * d);\n\n return Point(\n this.R * latlon.lon * d,\n this.R * Math.log((1 + sin) / (1 - sin)) / 2\n );\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n\n return LatLon(\n (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\n point.x * d / this.R\n );\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Accurate scale factor uses proper Web Mercator scaling\n // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n // See: http://jsfiddle.net/robhawkes/yws924cf/\n pointScale: function(latlon, accurate) {\n var rad = Math.PI / 180;\n\n var k;\n\n if (!accurate) {\n k = 1 / Math.cos(latlon.lat * rad);\n\n // [scaleX, scaleY]\n return [k, k];\n } else {\n var lat = latlon.lat * rad;\n var lon = latlon.lon * rad;\n\n var a = this.R;\n\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n\n var cosLat = Math.cos(lat);\n\n // Radius meridian\n var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\n // Radius prime meridian\n var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\n // Scale N/S\n var h = (a / p) / cosLat;\n\n // Scale E/W\n k = (a / v) / cosLat;\n\n // [scaleX, scaleY]\n return [k, h];\n }\n },\n\n // Not using this.R due to scoping\n bounds: (function() {\n var d = 6378137 * Math.PI;\n return [[-d, -d], [d, d]];\n })()\n};\n\nexport default SphericalMercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.SphericalMercator.js\n **/","/*\n * Transformation is an utility class to perform simple point transformations\n * through a 2d-matrix.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n */\n\nimport Point from '../geo/Point';\n\nclass Transformation {\n constructor(a, b, c, d) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n }\n\n transform(point, scale) {\n // Copy input point as to not destroy the original data\n return this._transform(point.clone(), scale);\n }\n\n // Destructive transform (faster)\n _transform(point, scale) {\n scale = scale || 1;\n\n point.x = scale * (this._a * point.x + this._b);\n point.y = scale * (this._c * point.y + this._d);\n return point;\n }\n\n untransform(point, scale) {\n scale = scale || 1;\n return Point(\n (point.x / scale - this._b) / this._a,\n (point.y / scale - this._d) / this._c\n );\n }\n}\n\nexport default Transformation;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Transformation.js\n **/","/*\n * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Mercator from '../projection/Projection.Mercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3395 = {\n code: 'EPSG:3395',\n projection: Mercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * Mercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * Mercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3395 = extend({}, Earth, _EPSG3395);\n\nexport default EPSG3395;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3395.js\n **/","/*\n * Mercator projection that takes into account that the Earth is not a perfect\n * sphere. Less popular than spherical mercator; used by projections like\n * EPSG:3395.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Mercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n R_MINOR: 6356752.314245179,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var r = this.R;\n var y = latlon.lat * d;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var con = e * Math.sin(y);\n\n var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n y = -r * Math.log(Math.max(ts, 1E-10));\n\n return Point(latlon.lon * d * r, y);\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n var r = this.R;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var ts = Math.exp(-point.y / r);\n var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\n for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n con = e * Math.sin(phi);\n con = Math.pow((1 - con) / (1 + con), e / 2);\n dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n phi += dphi;\n }\n\n return LatLon(phi * d, point.x * d / r);\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n pointScale: function(latlon) {\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n var cosLat = Math.cos(lat);\n\n var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\n // [scaleX, scaleY]\n return [k, k];\n },\n\n bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n};\n\nexport default Mercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Mercator.js\n **/","/*\n * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG4326 = {\n code: 'EPSG:4326',\n projection: LatLonProjection,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / 180,\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n //\n // TODO: Cannot use this.transformScale due to scope\n transformation: new Transformation(1 / 180, 0, -1 / 180, 0)\n};\n\nconst EPSG4326 = extend({}, Earth, _EPSG4326);\n\nexport default EPSG4326;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG4326.js\n **/","/*\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n * and Simple.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst ProjectionLatLon = {\n project: function(latlon) {\n return Point(latlon.lon, latlon.lat);\n },\n\n unproject: function(point) {\n return LatLon(point.y, point.x);\n },\n\n // Scale factor for converting between real metres and degrees\n //\n // degrees = realMetres * pointScale\n // realMetres = degrees / pointScale\n //\n // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n pointScale: function(latlon) {\n var m1 = 111132.92;\n var m2 = -559.82;\n var m3 = 1.175;\n var m4 = -0.0023;\n var p1 = 111412.84;\n var p2 = -93.5;\n var p3 = 0.118;\n\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n\n var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\n return [1 / latlen, 1 / lonlen];\n },\n\n bounds: [[-180, -90], [180, 90]]\n};\n\nexport default ProjectionLatLon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.LatLon.js\n **/","/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n * maps.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _Simple = {\n projection: LatLonProjection,\n\n // Straight 1:1 mapping (-1, -1 would be top-left)\n transformation: new Transformation(1, 0, 1, 0),\n\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom) {\n return Math.pow(2, zoom);\n // Else, make no change to scale – may need to increase this or make it a\n // user-definable variable\n } else {\n return 1;\n }\n },\n\n zoom: function(scale) {\n return Math.log(scale) / Math.LN2;\n },\n\n distance: function(latlon1, latlon2) {\n var dx = latlon2.lon - latlon1.lon;\n var dy = latlon2.lat - latlon1.lat;\n\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n infinite: true\n};\n\nconst Simple = extend({}, CRS, _Simple);\n\nexport default Simple;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Simple.js\n **/","/*\n * CRS.Proj4 for any Proj4-supported CRS.\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Proj4Projection from '../projection/Projection.Proj4';\nimport Transformation from '../../util/Transformation';\n\nvar _Proj4 = function(code, def, bounds) {\n var projection = Proj4Projection(def, bounds);\n\n // Transformation calcuations\n var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\n var halfX = diffX / 2;\n var halfY = diffY / 2;\n\n // This is the raw scale factor\n var scaleX = 1 / halfX;\n var scaleY = 1 / halfY;\n\n // Find the minimum scale factor\n //\n // The minimum scale factor comes from the largest side and is the one\n // you want to use for both axis so they stay relative in dimension\n var scale = Math.min(scaleX, scaleY);\n\n // Find amount to offset each axis by to make the central point lie on\n // the [0,0] origin\n var offsetX = scale * (projection.bounds[0][0] + halfX);\n var offsetY = scale * (projection.bounds[0][1] + halfY);\n\n return {\n code: code,\n projection: projection,\n\n transformScale: scale,\n\n // Map the input to a [-1,1] range with [0,0] in the centre\n transformation: new Transformation(scale, -offsetX, -scale, offsetY)\n };\n};\n\nconst Proj4 = function(code, def, bounds) {\n return extend({}, Earth, _Proj4(code, def, bounds));\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Proj4.js\n **/","/*\n * Proj4 support for any projection.\n */\n\nimport proj4 from 'proj4';\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Proj4 = function(def, bounds) {\n var proj = proj4(def);\n\n var project = function(latlon) {\n return Point(proj.forward([latlon.lon, latlon.lat]));\n };\n\n var unproject = function(point) {\n var inverse = proj.inverse([point.x, point.y]);\n return LatLon(inverse[1], inverse[0]);\n };\n\n return {\n project: project,\n unproject: unproject,\n\n // Scale factor for converting between real metres and projected metres\\\n //\n // Need to work out the best way to provide the pointScale calculations\n // for custom, unknown projections (if wanting to override default)\n //\n // For now, user can manually override crs.pointScale or\n // crs.projection.pointScale\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n pointScale: function(latlon, accurate) {\n return [1, 1];\n },\n\n // Try and calculate bounds if none are provided\n //\n // This will provide incorrect bounds for some projections, so perhaps make\n // bounds a required input instead\n bounds: (function() {\n if (bounds) {\n return bounds;\n } else {\n var bottomLeft = project([-90, -180]);\n var topRight = project([90, 180]);\n\n return [bottomLeft, topRight];\n }\n })()\n };\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Proj4.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"proj4\"\n ** module id = 22\n ** module chunks = 0\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from './Scene';\nimport Renderer from './Renderer';\nimport Camera from './Camera';\n\nclass Engine extends EventEmitter {\n constructor(container) {\n console.log('Init Engine');\n\n super();\n\n this._scene = Scene;\n this._renderer = Renderer(container);\n this._camera = Camera(container);\n this.clock = new THREE.Clock();\n\n this._frustum = new THREE.Frustum();\n }\n\n update(delta) {\n this.emit('preRender');\n this._renderer.render(this._scene, this._camera);\n this.emit('postRender');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(container) {\n return new Engine(container);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Engine.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"THREE\"\n ** module id = 24\n ** module chunks = 0\n **/","import THREE from 'three';\n\n// This can be imported from anywhere and will still reference the same scene,\n// though there is a helper reference in Engine.scene\n\nexport default (function() {\n var scene = new THREE.Scene();\n scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n return scene;\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Scene.js\n **/","import THREE from 'three';\nimport Scene from './Scene';\n\n// This can only be accessed from Engine.renderer if you want to reference the\n// same scene in multiple places\n\nexport default function(container) {\n var renderer = new THREE.WebGLRenderer({\n antialias: true\n });\n\n renderer.setClearColor(Scene.fog.color, 1);\n\n // Gamma settings make things look nicer\n renderer.gammaInput = true;\n renderer.gammaOutput = true;\n\n container.appendChild(renderer.domElement);\n\n var updateSize = function() {\n renderer.setSize(container.clientWidth, container.clientHeight);\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return renderer;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Renderer.js\n **/","import THREE from 'three';\n\n// This can only be accessed from Engine.camera if you want to reference the\n// same scene in multiple places\n\n// TODO: Ensure that FOV looks natural on all aspect ratios\n// http://stackoverflow.com/q/26655930/997339\n\nexport default function(container) {\n var camera = new THREE.PerspectiveCamera(45, 1, 1, 40000);\n camera.position.y = 400;\n camera.position.z = 400;\n\n var updateSize = function() {\n camera.aspect = container.clientWidth / container.clientHeight;\n camera.updateProjectionMatrix();\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return camera;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Camera.js\n **/","import Orbit from './Controls.Orbit';\n\nconst Controls = {\n Orbit: Orbit\n};\n\nexport default Controls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/index.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport OrbitControls from '../vendor/OrbitControls';\n\nclass Orbit extends EventEmitter {\n constructor() {\n super();\n }\n\n // Proxy control events\n //\n // There's currently no distinction between pan, orbit and zoom events\n _initEvents() {\n this._controls.addEventListener('start', (event) => {\n this._world.emit('controlsMoveStart', event.target.target);\n });\n\n this._controls.addEventListener('change', (event) => {\n this._world.emit('controlsMove', event.target.target);\n });\n\n this._controls.addEventListener('end', (event) => {\n this._world.emit('controlsMoveEnd', event.target.target);\n });\n }\n\n // Moving the camera along the [x,y,z] axis based on a target position\n _panTo(point, animate) {}\n _panBy(pointDelta, animate) {}\n\n // Zooming the camera in and out\n _zoomTo(metres, animate) {}\n _zoomBy(metresDelta, animate) {}\n\n // Force camera to look at something other than the target\n _lookAt(point, animate) {}\n\n // Make camera look at the target\n _lookAtTarget() {}\n\n // Tilt (up and down)\n _tiltTo(angle, animate) {}\n _tiltBy(angleDelta, animate) {}\n\n // Rotate (left and right)\n _rotateTo(angle, animate) {}\n _rotateBy(angleDelta, animate) {}\n\n // Fly to the given point, animating pan and tilt/rotation to final position\n // with nice zoom out and in\n //\n // Calling flyTo a second time before the previous animation has completed\n // will immediately start the new animation from wherever the previous one\n // has got to\n _flyTo(point, noZoom) {}\n\n // Proxy to OrbitControls.update()\n update() {\n this._controls.update();\n }\n\n // Add controls to world instance and store world reference\n addTo(world) {\n world.addControls(this);\n return this;\n }\n\n // Internal method called by World.addControls to actually add the controls\n _addToWorld(world) {\n this._world = world;\n\n // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n // See: http://stackoverflow.com/a/26188674/997339\n this._controls = new OrbitControls(world._engine._camera, world._container);\n\n // Disable keys for now as no events are fired for them anyway\n this._controls.keys = false;\n\n // 89 degrees\n this._controls.maxPolarAngle = 1.5533;\n\n // this._controls.enableDamping = true;\n // this._controls.dampingFactor = 0.25;\n\n this._initEvents();\n\n this.emit('added');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new Orbit();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/Controls.Orbit.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nvar OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn theta;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function () {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\n\t\t\ttheta = Math.atan2( offset.x, offset.z );\n\n\t\t\t// angle from y-axis\n\n\t\t\tphi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\ttheta += thetaDelta;\n\t\t\tphi += phiDelta;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\ttheta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tphi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, phi ) );\n\n\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\t\tvar radius = offset.length() * scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tradius = Math.max( scope.minDistance, Math.min( scope.maxDistance, radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\t\toffset.y = radius * Math.cos( phi );\n\t\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tthetaDelta *= ( 1 - scope.dampingFactor );\n\t\t\t\tphiDelta *= ( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tthetaDelta = 0;\n\t\t\t\tphiDelta = 0;\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function() {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\tscope.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar theta;\n\tvar phi;\n\n\tvar phiDelta = 0;\n\tvar thetaDelta = 0;\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tthetaDelta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tphiDelta -= angle;\n\n\t}\n\n\tvar panLeft = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panLeft( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get X column of objectMatrix\n\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n //\n\t\t// \tv.multiplyScalar( - distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n // Fixed panning to x/y plane\n return function panLeft(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t // var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 0 ], 0, te[ 2 ]);\n\t v.multiplyScalar(-distance);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n // Fixed panning to x/y plane\n\tvar panUp = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panUp( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get Y column of objectMatrix\n\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n //\n\t\t// \tv.multiplyScalar( distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n return function panUp(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 4 ], 0, te[ 6 ]);\n\t v.multiplyScalar(adjDist);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t//console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t//console.log( 'handleMouseWheel' );\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) {\n\n\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) {\n\n\t\t\t// Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( delta < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t//console.log( 'handleKeyDown' );\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\t//console.log( 'handleTouchStartPan' );\n\n\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\t//console.log( 'handleTouchMovePan' );\n\n\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseDownRotate( event );\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseDownDolly( event );\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseDownPan( event );\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\tdocument.addEventListener( 'mouseout', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseMoveRotate( event );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseMoveDolly( event );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseMovePan( event );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tscope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nOrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.constraint.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.constraint.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.constraint.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.constraint.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n\nexport default OrbitControls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/OrbitControls.js\n **/","import Layer from '../Layer';\nimport THREE from 'three';\n\nclass EnvironmentLayer extends Layer {\n constructor() {\n super();\n\n this._initLights();\n // this._initGrid();\n }\n\n _onAdd() {}\n\n // Not fleshed out or thought through yet\n //\n // Lights could potentially be put it their own 'layer' to keep this class\n // much simpler and less messy\n _initLights() {\n // Position doesn't really matter (the angle is important), however it's\n // used here so the helpers look more natural.\n\n var directionalLight = new THREE.DirectionalLight(0x999999);\n directionalLight.intesity = 0.1;\n directionalLight.position.x = 100;\n directionalLight.position.y = 100;\n directionalLight.position.z = 100;\n\n var directionalLight2 = new THREE.DirectionalLight(0x999999);\n directionalLight2.intesity = 0.1;\n directionalLight2.position.x = -100;\n directionalLight2.position.y = 100;\n directionalLight2.position.z = -100;\n\n var helper = new THREE.DirectionalLightHelper(directionalLight, 10);\n var helper2 = new THREE.DirectionalLightHelper(directionalLight2, 10);\n\n this._layer.add(directionalLight);\n this._layer.add(directionalLight2);\n\n this._layer.add(helper);\n this._layer.add(helper2);\n }\n\n // Add grid helper for context during initial development\n _initGrid() {\n var size = 4000;\n var step = 100;\n\n var gridHelper = new THREE.GridHelper(size, step);\n this._layer.add(gridHelper);\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new EnvironmentLayer();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/EnvironmentLayer.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from '../engine/Scene';\n\nclass Layer extends EventEmitter {\n constructor() {\n super();\n\n this._layer = new THREE.Object3D();\n }\n\n // Add layer to world instance and store world reference\n addTo(world) {\n world.addLayer(this);\n return this;\n }\n\n // Internal method called by World.addLayer to actually add the layer\n _addToWorld(world) {\n this._world = world;\n this._onAdd(world);\n this.emit('added');\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world = null;\n this._layer = null;\n }\n}\n\nexport default Layer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/Layer.js\n **/","import TileLayer from './TileLayer';\nimport ImageTile from './ImageTile';\nimport ImageTileLayerBaseMaterial from './ImageTileLayerBaseMaterial';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\n// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n// being removed and the new tiles being ready for display\n//\n// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n// of the basemap ground so it blends in a little more, or have a huge ground\n// plane underneath all the tiles that shows through between tile updates.\n//\n// Could keep the old tiles around until the new ones are ready, though they'd\n// probably need to be layered in a way so the old tiles don't overlap new ones,\n// which is similar to how Leaflet approaches this (it has 2 layers)\n//\n// Could keep the tile from the previous quadtree level visible until all 4\n// tiles at the new / current level have finished loading and are displayed.\n// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n// child quadcodes showing whether they are loaded and in view. If all true then\n// remove the parent tile, otherwise keep it on a lower layer.\n\n// TODO: Load and display a base layer separate to the LOD grid that is at a low\n// resolution – used as a backup / background to fill in empty areas / distance\n\n// DONE: Fix the issue where some tiles just don't load, or at least the texture\n// never shows up – tends to happen if you quickly zoom in / out past it while\n// it's still loading, leaving a blank space\n\n// TODO: Optimise the request of many image tiles – look at how Leaflet and\n// OpenWebGlobe approach this (eg. batching, queues, etc)\n\n// TODO: Cancel pending tile requests if they get removed from view before they\n// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n// images are re-requested when the tile is next in scene (even if from cache)\n\nclass ImageTileLayer extends TileLayer {\n constructor(path, options) {\n // Cache 1000 tiles\n super(1000);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n this._initEvents();\n\n // Add base layer\n var geom = new THREE.PlaneBufferGeometry(40000, 40000, 1);\n var mesh = new THREE.Mesh(geom, ImageTileLayerBaseMaterial('#f5f5f3'));\n mesh.rotation.x = -90 * Math.PI / 180;\n\n this._baseLayer = mesh;\n this._layer.add(mesh);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n }\n\n _onWorldMove(latlon, point) {\n this._moveBaseLayer(point);\n }\n\n _moveBaseLayer(point) {\n this._baseLayer.position.x = point.x;\n this._baseLayer.position.z = point.y;\n }\n\n _createTile(quadcode, layer) {\n return ImageTile(quadcode, this._path, layer);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Dispose of mesh and materials\n this._baseLayer.geometry.dispose();\n this._baseLayer.geometry = null;\n\n if (this._baseLayer.material.map) {\n this._baseLayer.material.map.dispose();\n this._baseLayer.material.map = null;\n }\n\n this._baseLayer.material.dispose();\n this._baseLayer.material = null;\n\n this._baseLayer = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new ImageTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayer.js\n **/","import Layer from '../Layer';\nimport TileCache from './TileCache';\nimport THREE from 'three';\n\n// DONE: Prevent tiles from being loaded if they are further than a certain\n// distance from the camera and are unlikely to be seen anyway\n\n// TODO: Avoid performing LOD calculation when it isn't required. For example,\n// when nothing has changed since the last frame and there are no tiles to be\n// loaded or in need of rendering\n\n// TODO: Only remove tiles from the layer that aren't to be rendered in the\n// current frame – it seems excessive to remove all tiles and re-add them on\n// every single frame, even if it's just array manipulation\n\n// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n// problems (eg. making min above 5 causes all sorts of issues)\n\n// TODO: Reuse THREE objects where possible instead of creating new instances\n// on every LOD calculation\n\n// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n// to avoid creating unnecessary memory for garbage collection\n\n// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n// closest to the camera) so visual inconsistancies during loading are minimised\n\nclass TileLayer extends Layer {\n constructor(maxCache) {\n super();\n\n this._tileCache = TileCache(maxCache, tile => {\n this._destroyTile(tile);\n });\n\n // TODO: Work out why changing the minLOD causes loads of issues\n this._minLOD = 3;\n this._maxLOD = 18;\n\n this._frustum = new THREE.Frustum();\n this._tiles = new THREE.Object3D();\n }\n\n _onAdd(world) {\n this._layer.add(this._tiles);\n }\n\n _updateFrustum() {\n var camera = this._world.getCamera();\n var projScreenMatrix = new THREE.Matrix4();\n projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\n this._frustum.setFromMatrix(camera.projectionMatrix);\n this._frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n }\n\n _tileInFrustum(tile) {\n var bounds = tile.getBounds();\n return this._frustum.intersectsBox(new THREE.Box3(new THREE.Vector3(bounds[0], 0, bounds[3]), new THREE.Vector3(bounds[2], 0, bounds[1])));\n }\n\n _calculateLOD() {\n if (this._stop || !this._world) {\n return;\n }\n\n // var start = performance.now();\n\n var camera = this._world.getCamera();\n\n // 1. Update and retrieve camera frustum\n this._updateFrustum(this._frustum, camera);\n\n // 2. Add the four root items of the quadtree to a check list\n var checkList = this._checklist;\n checkList = [];\n checkList.push(this._requestTile('0', this));\n checkList.push(this._requestTile('1', this));\n checkList.push(this._requestTile('2', this));\n checkList.push(this._requestTile('3', this));\n\n // 3. Call Divide, passing in the check list\n this._divide(checkList);\n\n // 4. Remove all tiles from layer\n this._removeTiles();\n\n // 5. Render the tiles remaining in the check list\n checkList.forEach((tile, index) => {\n // Skip tile if it's not in the current view frustum\n if (!this._tileInFrustum(tile)) {\n return;\n }\n\n // // TODO: Can probably speed this up\n // var center = tile.getCenter();\n // var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n // Manual distance limit to cut down on tiles so far away\n // if (dist > 8000) {\n // return;\n // }\n\n // Does the tile have a mesh?\n //\n // If yes, continue\n // If no, generate tile mesh, request texture and skip\n if (!tile.getMesh()) {\n tile.requestTileAsync();\n return;\n }\n\n // Are the mesh and texture ready?\n //\n // If yes, continue\n // If no, skip\n if (!tile.isReady()) {\n return;\n }\n\n // Add tile to layer (and to scene)\n this._tiles.add(tile.getMesh());\n });\n\n // console.log(performance.now() - start);\n }\n\n _divide(checkList) {\n var count = 0;\n var currentItem;\n var quadcode;\n\n // 1. Loop until count equals check list length\n while (count != checkList.length) {\n currentItem = checkList[count];\n quadcode = currentItem.getQuadcode();\n\n // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n if (currentItem.length === this._maxLOD) {\n count++;\n continue;\n }\n\n // 3. Else, calculate screen-space error metric for quadcode\n if (this._screenSpaceError(currentItem)) {\n // 4. If error is sufficient...\n\n // 4a. Remove parent item from the check list\n checkList.splice(count, 1);\n\n // 4b. Add 4 child items to the check list\n checkList.push(this._requestTile(quadcode + '0', this));\n checkList.push(this._requestTile(quadcode + '1', this));\n checkList.push(this._requestTile(quadcode + '2', this));\n checkList.push(this._requestTile(quadcode + '3', this));\n\n // 4d. Continue the loop without increasing count\n continue;\n } else {\n // 5. Else, increase count and continue loop\n count++;\n }\n }\n }\n\n _screenSpaceError(tile) {\n var minDepth = this._minLOD;\n var maxDepth = this._maxLOD;\n\n var quadcode = tile.getQuadcode();\n\n var camera = this._world.getCamera();\n\n // Tweak this value to refine specific point that each quad is subdivided\n //\n // It's used to multiple the dimensions of the tile sides before\n // comparing against the tile distance from camera\n var quality = 3.0;\n\n // 1. Return false if quadcode length is greater than maxDepth\n if (quadcode.length > maxDepth) {\n return false;\n }\n\n // 2. Return true if quadcode length is less than minDepth\n if (quadcode.length < minDepth) {\n return true;\n }\n\n // 3. Return false if quadcode bounds are not in view frustum\n if (!this._tileInFrustum(tile)) {\n return false;\n }\n\n var center = tile.getCenter();\n\n // 4. Calculate screen-space error metric\n // TODO: Use closest distance to one of the 4 tile corners\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n var error = quality * tile.getSide() / dist;\n\n // 5. Return true if error is greater than 1.0, else return false\n return (error > 1.0);\n }\n\n _removeTiles() {\n for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n }\n\n // Return a new tile instance\n _createTile(quadcode, layer) {}\n\n // Get a cached tile or request a new one if not in cache\n _requestTile(quadcode, layer) {\n var tile = this._tileCache.getTile(quadcode);\n\n if (!tile) {\n // Set up a brand new tile\n tile = this._createTile(quadcode, layer);\n\n // Add tile to cache, though it won't be ready yet as the data is being\n // requested from various places asynchronously\n this._tileCache.setTile(quadcode, tile);\n }\n\n return tile;\n }\n\n _destroyTile(tile) {\n // Remove tile from scene\n this._layer.remove(tile);\n\n // Delete any references to the tile within this component\n\n // Call destory on tile instance\n tile.destroy();\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n var i;\n\n // Remove all tiles\n for (i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n\n // Remove everything else in the layer\n for (i = this._layer.children.length - 1; i >= 0; i--) {\n this._layer.remove(this._layer.children[i]);\n }\n\n this._tileCache.destroy();\n this._tileCache = null;\n\n this._world = null;\n this._tiles = null;\n this._layer = null;\n this._frustum = null;\n }\n}\n\nexport default TileLayer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileLayer.js\n **/","import LRUCache from 'lru-cache';\n\n// This process is based on a similar approach taken by OpenWebGlobe\n// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\nclass TileCache {\n constructor(cacheLimit, onDestroyTile) {\n this._cache = LRUCache({\n max: cacheLimit,\n dispose: (key, tile) => {\n onDestroyTile(tile);\n }\n });\n }\n\n // Returns true if all specified tile providers are ready to be used\n // Otherwise, returns false\n isReady() {\n return false;\n }\n\n // Get a cached tile without requesting a new one\n getTile(quadcode) {\n return this._cache.get(quadcode);\n }\n\n // Add tile to cache\n setTile(quadcode, tile) {\n this._cache.set(quadcode, tile);\n }\n\n // Destroy the cache and remove it from memory\n //\n // TODO: Call destroy method on items in cache\n destroy() {\n this._cache.reset();\n this._cache = null;\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(cacheLimit, onDestroyTile) {\n return new TileCache(cacheLimit, onDestroyTile);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileCache.js\n **/","module.exports = LRUCache\n\n// This will be a proper iterable 'Map' in engines that support it,\n// or a fakey-fake PseudoMap in older versions.\nvar Map = require('pseudomap')\nvar util = require('util')\n\n// A linked list to keep track of recently-used-ness\nvar Yallist = require('yallist')\n\n// use symbols if possible, otherwise just _props\nvar symbols = {}\nvar hasSymbol = typeof Symbol === 'function'\nvar makeSymbol\nif (hasSymbol) {\n makeSymbol = function (key) {\n return Symbol.for(key)\n }\n} else {\n makeSymbol = function (key) {\n return '_' + key\n }\n}\n\nfunction priv (obj, key, val) {\n var sym\n if (symbols[key]) {\n sym = symbols[key]\n } else {\n sym = makeSymbol(key)\n symbols[key] = sym\n }\n if (arguments.length === 2) {\n return obj[sym]\n } else {\n obj[sym] = val\n return val\n }\n}\n\nfunction naiveLength () { return 1 }\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nfunction LRUCache (options) {\n if (!(this instanceof LRUCache)) {\n return new LRUCache(options)\n }\n\n if (typeof options === 'number') {\n options = { max: options }\n }\n\n if (!options) {\n options = {}\n }\n\n var max = priv(this, 'max', options.max)\n // Kind of weird to have a default max of Infinity, but oh well.\n if (!max ||\n !(typeof max === 'number') ||\n max <= 0) {\n priv(this, 'max', Infinity)\n }\n\n var lc = options.length || naiveLength\n if (typeof lc !== 'function') {\n lc = naiveLength\n }\n priv(this, 'lengthCalculator', lc)\n\n priv(this, 'allowStale', options.stale || false)\n priv(this, 'maxAge', options.maxAge || 0)\n priv(this, 'dispose', options.dispose)\n this.reset()\n}\n\n// resize the cache when the max changes.\nObject.defineProperty(LRUCache.prototype, 'max', {\n set: function (mL) {\n if (!mL || !(typeof mL === 'number') || mL <= 0) {\n mL = Infinity\n }\n priv(this, 'max', mL)\n trim(this)\n },\n get: function () {\n return priv(this, 'max')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'allowStale', {\n set: function (allowStale) {\n priv(this, 'allowStale', !!allowStale)\n },\n get: function () {\n return priv(this, 'allowStale')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'maxAge', {\n set: function (mA) {\n if (!mA || !(typeof mA === 'number') || mA < 0) {\n mA = 0\n }\n priv(this, 'maxAge', mA)\n trim(this)\n },\n get: function () {\n return priv(this, 'maxAge')\n },\n enumerable: true\n})\n\n// resize the cache when the lengthCalculator changes.\nObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n set: function (lC) {\n if (typeof lC !== 'function') {\n lC = naiveLength\n }\n if (lC !== priv(this, 'lengthCalculator')) {\n priv(this, 'lengthCalculator', lC)\n priv(this, 'length', 0)\n priv(this, 'lruList').forEach(function (hit) {\n hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n priv(this, 'length', priv(this, 'length') + hit.length)\n }, this)\n }\n trim(this)\n },\n get: function () { return priv(this, 'lengthCalculator') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'length', {\n get: function () { return priv(this, 'length') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'itemCount', {\n get: function () { return priv(this, 'lruList').length },\n enumerable: true\n})\n\nLRUCache.prototype.rforEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n var prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n}\n\nfunction forEachStep (self, fn, node, thisp) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) {\n hit = undefined\n }\n }\n if (hit) {\n fn.call(thisp, hit.value, hit.key, self)\n }\n}\n\nLRUCache.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').head; walker !== null;) {\n var next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n}\n\nLRUCache.prototype.keys = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.key\n }, this)\n}\n\nLRUCache.prototype.values = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.value\n }, this)\n}\n\nLRUCache.prototype.reset = function () {\n if (priv(this, 'dispose') &&\n priv(this, 'lruList') &&\n priv(this, 'lruList').length) {\n priv(this, 'lruList').forEach(function (hit) {\n priv(this, 'dispose').call(this, hit.key, hit.value)\n }, this)\n }\n\n priv(this, 'cache', new Map()) // hash of items by key\n priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n priv(this, 'length', 0) // length of items in the list\n}\n\nLRUCache.prototype.dump = function () {\n return priv(this, 'lruList').map(function (hit) {\n if (!isStale(this, hit)) {\n return {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }\n }\n }, this).toArray().filter(function (h) {\n return h\n })\n}\n\nLRUCache.prototype.dumpLru = function () {\n return priv(this, 'lruList')\n}\n\nLRUCache.prototype.inspect = function (n, opts) {\n var str = 'LRUCache {'\n var extras = false\n\n var as = priv(this, 'allowStale')\n if (as) {\n str += '\\n allowStale: true'\n extras = true\n }\n\n var max = priv(this, 'max')\n if (max && max !== Infinity) {\n if (extras) {\n str += ','\n }\n str += '\\n max: ' + util.inspect(max, opts)\n extras = true\n }\n\n var maxAge = priv(this, 'maxAge')\n if (maxAge) {\n if (extras) {\n str += ','\n }\n str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n extras = true\n }\n\n var lc = priv(this, 'lengthCalculator')\n if (lc && lc !== naiveLength) {\n if (extras) {\n str += ','\n }\n str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n extras = true\n }\n\n var didFirst = false\n priv(this, 'lruList').forEach(function (item) {\n if (didFirst) {\n str += ',\\n '\n } else {\n if (extras) {\n str += ',\\n'\n }\n didFirst = true\n str += '\\n '\n }\n var key = util.inspect(item.key).split('\\n').join('\\n ')\n var val = { value: item.value }\n if (item.maxAge !== maxAge) {\n val.maxAge = item.maxAge\n }\n if (lc !== naiveLength) {\n val.length = item.length\n }\n if (isStale(this, item)) {\n val.stale = true\n }\n\n val = util.inspect(val, opts).split('\\n').join('\\n ')\n str += key + ' => ' + val\n })\n\n if (didFirst || extras) {\n str += '\\n'\n }\n str += '}'\n\n return str\n}\n\nLRUCache.prototype.set = function (key, value, maxAge) {\n maxAge = maxAge || priv(this, 'maxAge')\n\n var now = maxAge ? Date.now() : 0\n var len = priv(this, 'lengthCalculator').call(this, value, key)\n\n if (priv(this, 'cache').has(key)) {\n if (len > priv(this, 'max')) {\n del(this, priv(this, 'cache').get(key))\n return false\n }\n\n var node = priv(this, 'cache').get(key)\n var item = node.value\n\n // dispose of the old one before overwriting\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n priv(this, 'length', priv(this, 'length') + (len - item.length))\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n var hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > priv(this, 'max')) {\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, value)\n }\n return false\n }\n\n priv(this, 'length', priv(this, 'length') + hit.length)\n priv(this, 'lruList').unshift(hit)\n priv(this, 'cache').set(key, priv(this, 'lruList').head)\n trim(this)\n return true\n}\n\nLRUCache.prototype.has = function (key) {\n if (!priv(this, 'cache').has(key)) return false\n var hit = priv(this, 'cache').get(key).value\n if (isStale(this, hit)) {\n return false\n }\n return true\n}\n\nLRUCache.prototype.get = function (key) {\n return get(this, key, true)\n}\n\nLRUCache.prototype.peek = function (key) {\n return get(this, key, false)\n}\n\nLRUCache.prototype.pop = function () {\n var node = priv(this, 'lruList').tail\n if (!node) return null\n del(this, node)\n return node.value\n}\n\nLRUCache.prototype.del = function (key) {\n del(this, priv(this, 'cache').get(key))\n}\n\nLRUCache.prototype.load = function (arr) {\n // reset the cache\n this.reset()\n\n var now = Date.now()\n // A previous serialized cache has the most recent items first\n for (var l = arr.length - 1; l >= 0; l--) {\n var hit = arr[l]\n var expiresAt = hit.e || 0\n if (expiresAt === 0) {\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n } else {\n var maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n}\n\nLRUCache.prototype.prune = function () {\n var self = this\n priv(this, 'cache').forEach(function (value, key) {\n get(self, key, false)\n })\n}\n\nfunction get (self, key, doUse) {\n var node = priv(self, 'cache').get(key)\n if (node) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) hit = undefined\n } else {\n if (doUse) {\n priv(self, 'lruList').unshiftNode(node)\n }\n }\n if (hit) hit = hit.value\n }\n return hit\n}\n\nfunction isStale (self, hit) {\n if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n return false\n }\n var stale = false\n var diff = Date.now() - hit.now\n if (hit.maxAge) {\n stale = diff > hit.maxAge\n } else {\n stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n }\n return stale\n}\n\nfunction trim (self) {\n if (priv(self, 'length') > priv(self, 'max')) {\n for (var walker = priv(self, 'lruList').tail;\n priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n var prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nfunction del (self, node) {\n if (node) {\n var hit = node.value\n if (priv(self, 'dispose')) {\n priv(self, 'dispose').call(this, hit.key, hit.value)\n }\n priv(self, 'length', priv(self, 'length') - hit.length)\n priv(self, 'cache').delete(hit.key)\n priv(self, 'lruList').removeNode(node)\n }\n}\n\n// classy, since V8 prefers predictable objects.\nfunction Entry (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lru-cache/lib/lru-cache.js\n ** module id = 36\n ** module chunks = 0\n **/","if (process.env.npm_package_name === 'pseudomap' &&\n process.env.npm_lifecycle_script === 'test')\n process.env.TEST_PSEUDOMAP = 'true'\n\nif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n module.exports = Map\n} else {\n module.exports = require('./pseudomap')\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/map.js\n ** module id = 37\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/process/browser.js\n ** module id = 38\n ** module chunks = 0\n **/","var hasOwnProperty = Object.prototype.hasOwnProperty\n\nmodule.exports = PseudoMap\n\nfunction PseudoMap (set) {\n if (!(this instanceof PseudoMap)) // whyyyyyyy\n throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\n this.clear()\n\n if (set) {\n if ((set instanceof PseudoMap) ||\n (typeof Map === 'function' && set instanceof Map))\n set.forEach(function (value, key) {\n this.set(key, value)\n }, this)\n else if (Array.isArray(set))\n set.forEach(function (kv) {\n this.set(kv[0], kv[1])\n }, this)\n else\n throw new TypeError('invalid argument')\n }\n}\n\nPseudoMap.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n Object.keys(this._data).forEach(function (k) {\n if (k !== 'size')\n fn.call(thisp, this._data[k].value, this._data[k].key)\n }, this)\n}\n\nPseudoMap.prototype.has = function (k) {\n return !!find(this._data, k)\n}\n\nPseudoMap.prototype.get = function (k) {\n var res = find(this._data, k)\n return res && res.value\n}\n\nPseudoMap.prototype.set = function (k, v) {\n set(this._data, k, v)\n}\n\nPseudoMap.prototype.delete = function (k) {\n var res = find(this._data, k)\n if (res) {\n delete this._data[res._index]\n this._data.size--\n }\n}\n\nPseudoMap.prototype.clear = function () {\n var data = Object.create(null)\n data.size = 0\n\n Object.defineProperty(this, '_data', {\n value: data,\n enumerable: false,\n configurable: true,\n writable: false\n })\n}\n\nObject.defineProperty(PseudoMap.prototype, 'size', {\n get: function () {\n return this._data.size\n },\n set: function (n) {},\n enumerable: true,\n configurable: true\n})\n\nPseudoMap.prototype.values =\nPseudoMap.prototype.keys =\nPseudoMap.prototype.entries = function () {\n throw new Error('iterators are not implemented in this version')\n}\n\n// Either identical, or both NaN\nfunction same (a, b) {\n return a === b || a !== a && b !== b\n}\n\nfunction Entry (k, v, i) {\n this.key = k\n this.value = v\n this._index = i\n}\n\nfunction find (data, k) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k))\n return data[key]\n }\n}\n\nfunction set (data, k, v) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k)) {\n data[key].value = v\n return\n }\n }\n data.size++\n data[key] = new Entry(k, v, key)\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/pseudomap.js\n ** module id = 39\n ** module chunks = 0\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/util.js\n ** module id = 40\n ** module chunks = 0\n **/","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/support/isBufferBrowser.js\n ** module id = 41\n ** module chunks = 0\n **/","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/inherits/inherits_browser.js\n ** module id = 42\n ** module chunks = 0\n **/","module.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length --\n node.next = null\n node.prev = null\n node.list = null\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length ++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length ++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail)\n return undefined\n\n var res = this.tail.value\n this.tail = this.tail.prev\n this.tail.next = null\n this.length --\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head)\n return undefined\n\n var res = this.head.value\n this.head = this.head.next\n this.head.prev = null\n this.length --\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length ++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length ++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/yallist/yallist.js\n ** module id = 43\n ** module chunks = 0\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\n\nclass ImageTile extends Tile {\n constructor(quadcode, path, layer) {\n super(quadcode, path, layer);\n }\n\n // Request data for the various tile provider\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTexture();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear image reference\n this._image = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\n var material = new THREE.MeshBasicMaterial({\n depthWrite: false\n });\n\n var localMesh = new THREE.Mesh(geom, material);\n localMesh.rotation.x = -90 * Math.PI / 180;\n\n mesh.add(localMesh);\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n var box = new BoxHelper(localMesh);\n mesh.add(box);\n\n mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTexture() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n var image = document.createElement('img');\n\n image.addEventListener('load', event => {\n var texture = new THREE.Texture();\n\n texture.image = image;\n texture.needsUpdate = true;\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n // Something went wrong and the tile or its material is missing\n //\n // Possibly removed by the cache before the image loaded\n if (!this._mesh || !this._mesh.children[0] || !this._mesh.children[0].material) {\n return;\n }\n\n this._mesh.children[0].material.map = texture;\n this._mesh.children[0].material.needsUpdate = true;\n\n this._texture = texture;\n this._ready = true;\n }, false);\n\n // image.addEventListener('progress', event => {}, false);\n // image.addEventListener('error', event => {}, false);\n\n image.crossOrigin = '';\n\n // Load image\n image.src = url;\n\n this._image = image;\n }\n\n _abortRequest() {\n if (!this._image) {\n return;\n }\n\n this._image.src = '';\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer) {\n return new ImageTile(quadcode, path, layer);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTile.js\n **/","import LatLon from '../../geo/LatLon';\nimport THREE from 'three';\n\n// Manages a single tile and its layers\n\nvar r2d = 180 / Math.PI;\n\nvar tileURLRegex = /\\{([szxy])\\}/g;\n\nclass Tile {\n constructor(quadcode, path, layer) {\n this._layer = layer;\n this._quadcode = quadcode;\n this._path = path;\n\n this._ready = false;\n\n this._tile = this._quadcodeToTile(quadcode);\n\n // Bottom-left and top-right bounds in WGS84 coordinates\n this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\n // Bottom-left and top-right bounds in world coordinates\n this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\n // Tile center in world coordinates\n this._center = this._boundsToCenter(this._boundsWorld);\n\n // Length of a tile side in world coorindates\n this._side = this._getSide(this._boundsWorld);\n }\n\n // Returns true if the tile mesh and texture are ready to be used\n // Otherwise, returns false\n isReady() {\n return this._ready;\n }\n\n // Request data for the tile\n requestTileAsync() {}\n\n getQuadcode() {\n return this._quadcode;\n }\n\n getBounds() {\n return this._boundsWorld;\n }\n\n getCenter() {\n return this._center;\n }\n\n getSide() {\n return this._side;\n }\n\n getMesh() {\n return this._mesh;\n }\n\n // Destroys the tile and removes it from the layer and memory\n //\n // Ensure that this leaves no trace of the tile – no textures, no meshes,\n // nothing in memory or the GPU\n destroy() {\n // Delete reference to layer\n this._layer = null;\n\n // Delete location references\n this._boundsLatLon = null;\n this._boundsWorld = null;\n this._center = null;\n\n // Done if no mesh\n if (!this._mesh) {\n return;\n }\n\n if (this._mesh.children) {\n // Dispose of mesh and materials\n this._mesh.children.forEach(child => {\n child.geometry.dispose();\n child.geometry = null;\n\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n });\n } else {\n this._mesh.geometry.dispose();\n this._mesh.geometry = null;\n\n if (this._mesh.material.map) {\n this._mesh.material.map.dispose();\n this._mesh.material.map = null;\n }\n\n this._mesh.material.dispose();\n this._mesh.material = null;\n }\n }\n\n _createMesh() {}\n _createDebugMesh() {}\n\n _getTileURL(urlParams) {\n if (!urlParams.s) {\n // Default to a random choice of a, b or c\n s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n }\n\n tileURLRegex.lastIndex = 0;\n return this._path.replace(tileURLRegex, function(value, key) {\n // Replace with paramter, otherwise keep existing value\n return urlParams[key];\n });\n }\n\n // Convert from quadcode to TMS tile coordinates\n _quadcodeToTile(quadcode) {\n var x = 0;\n var y = 0;\n var z = quadcode.length;\n\n for (var i = z; i > 0; i--) {\n var mask = 1 << (i - 1);\n var q = +quadcode[z - i];\n if (q === 1) {\n x |= mask;\n }\n if (q === 2) {\n y |= mask;\n }\n if (q === 3) {\n x |= mask;\n y |= mask;\n }\n }\n\n return [x, y, z];\n }\n\n // Convert WGS84 tile bounds to world coordinates\n _tileBoundsFromWGS84(boundsWGS84) {\n var sw = this._layer._world.latLonToPoint(LatLon(boundsWGS84[1], boundsWGS84[0]));\n var ne = this._layer._world.latLonToPoint(LatLon(boundsWGS84[3], boundsWGS84[2]));\n\n return [sw.x, sw.y, ne.x, ne.y];\n }\n\n // Get tile bounds in WGS84 coordinates\n _tileBoundsWGS84(tile) {\n var e = this._tile2lon(tile[0] + 1, tile[2]);\n var w = this._tile2lon(tile[0], tile[2]);\n var s = this._tile2lat(tile[1] + 1, tile[2]);\n var n = this._tile2lat(tile[1], tile[2]);\n return [w, s, e, n];\n }\n\n _tile2lon(x, z) {\n return x / Math.pow(2, z) * 360 - 180;\n }\n\n _tile2lat(y, z) {\n var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n }\n\n _boundsToCenter(bounds) {\n var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\n return [x, y];\n }\n\n _getSide(bounds) {\n return (new THREE.Vector3(bounds[0], 0, bounds[3])).sub(new THREE.Vector3(bounds[0], 0, bounds[1])).length();\n }\n}\n\nexport default Tile;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/Tile.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nBoxHelper = function ( object ) {\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new THREE.BufferGeometry();\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { linewidth: 2, color: 0xff0000 } ) );\n\n\tif ( object !== undefined ) {\n\n\t\tthis.update( object );\n\n\t}\n\n};\n\nBoxHelper.prototype = Object.create( THREE.LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new THREE.Box3();\n\n\treturn function ( object ) {\n\n\t\tbox.setFromObject( object );\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nexport default BoxHelper;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/BoxHelper.js\n **/","import THREE from 'three';\n\nexport default function(colour) {\n var canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n\n var context = canvas.getContext('2d');\n context.fillStyle = colour;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.strokeStyle = '#D0D0CF';\n // context.strokeRect(0, 0, canvas.width, canvas.height);\n\n var texture = new THREE.Texture(canvas);\n\n // // Silky smooth images when tilted\n // texture.magFilter = THREE.LinearFilter;\n // texture.minFilter = THREE.LinearMipMapLinearFilter;\n // //\n // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n // texture.anisotropy = 4;\n\n // texture.wrapS = THREE.RepeatWrapping;\n // texture.wrapT = THREE.RepeatWrapping;\n // texture.repeat.set(segments, segments);\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n depthWrite: false\n });\n\n return material;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayerBaseMaterial.js\n **/","/**\n * lodash 4.0.0 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar debounce = require('lodash.debounce');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide an options object to indicate whether\n * `func` should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // cancel a trailing throttled invocation\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = throttle;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/index.js\n ** module id = 48\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = Date.now;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide an options object to indicate whether `func` should be invoked on\n * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent calls\n * to the debounced function return the result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n leading = false,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function flush() {\n if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n result = func.apply(thisArg, args);\n }\n cancel();\n return result;\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/~/lodash.debounce/index.js\n ** module id = 49\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/package.json b/package.json index fd4f499..8bbd8e0 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,6 @@ "eventemitter3": "^1.1.1", "lodash.assign": "^4.0.2", "lodash.throttle": "^4.0.0", - "lru-cache": "^4.0.0", - "three-orbit-controls": "github:robhawkes/three-orbit-controls" + "lru-cache": "^4.0.0" } } diff --git a/src/controls/Controls.Orbit.js b/src/controls/Controls.Orbit.js index ef50f01..059df5a 100644 --- a/src/controls/Controls.Orbit.js +++ b/src/controls/Controls.Orbit.js @@ -1,8 +1,6 @@ import EventEmitter from 'eventemitter3'; import THREE from 'three'; -import OrbitControls from 'three-orbit-controls'; - -var _OrbitControls = OrbitControls(THREE); +import OrbitControls from '../vendor/OrbitControls'; class Orbit extends EventEmitter { constructor() { @@ -14,15 +12,15 @@ class Orbit extends EventEmitter { // There's currently no distinction between pan, orbit and zoom events _initEvents() { this._controls.addEventListener('start', (event) => { - this._world.emit('controlsMoveStart', event.target.center); + this._world.emit('controlsMoveStart', event.target.target); }); this._controls.addEventListener('change', (event) => { - this._world.emit('controlsMove', event.target.center); + this._world.emit('controlsMove', event.target.target); }); this._controls.addEventListener('end', (event) => { - this._world.emit('controlsMoveEnd', event.target.center); + this._world.emit('controlsMoveEnd', event.target.target); }); } @@ -73,7 +71,7 @@ class Orbit extends EventEmitter { // TODO: Override panLeft and panUp methods to prevent panning on Y axis // See: http://stackoverflow.com/a/26188674/997339 - this._controls = new _OrbitControls(world._engine._camera, world._container); + this._controls = new OrbitControls(world._engine._camera, world._container); // Disable keys for now as no events are fired for them anyway this._controls.keys = false; diff --git a/src/vendor/BoxHelper.js b/src/vendor/BoxHelper.js index 84b73f5..6b26bbb 100644 --- a/src/vendor/BoxHelper.js +++ b/src/vendor/BoxHelper.js @@ -1,5 +1,6 @@ // jscs:disable /*eslint eqeqeq:0*/ + import THREE from 'three'; /** diff --git a/src/vendor/OrbitControls.js b/src/vendor/OrbitControls.js new file mode 100644 index 0000000..32004a8 --- /dev/null +++ b/src/vendor/OrbitControls.js @@ -0,0 +1,1084 @@ +// jscs:disable +/*eslint eqeqeq:0*/ + +import THREE from 'three'; + +/** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one finger move +// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish +// Pan - right mouse, or arrow keys / touch: three finter swipe + +var OrbitControls = function ( object, domElement ) { + + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return phi; + + }; + + this.getAzimuthalAngle = function () { + + return theta; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function() { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function () { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + + theta = Math.atan2( offset.x, offset.z ); + + // angle from y-axis + + phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + theta += thetaDelta; + phi += phiDelta; + + // restrict theta to be between desired limits + theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, theta ) ); + + // restrict phi to be between desired limits + phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, phi ) ); + + // restrict phi to be betwee EPS and PI-EPS + phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) ); + + var radius = offset.length() * scale; + + // restrict radius to be between desired limits + radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, radius ) ); + + // move target to panned location + scope.target.add( panOffset ); + + offset.x = radius * Math.sin( phi ) * Math.sin( theta ); + offset.y = radius * Math.cos( phi ); + offset.z = radius * Math.sin( phi ) * Math.cos( theta ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + thetaDelta *= ( 1 - scope.dampingFactor ); + phiDelta *= ( 1 - scope.dampingFactor ); + + } else { + + thetaDelta = 0; + phiDelta = 0; + + } + + scale = 1; + panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function() { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'mousewheel', onMouseWheel, false ); + scope.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + document.removeEventListener( 'mouseout', onMouseUp, false ); + + window.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var theta; + var phi; + + var phiDelta = 0; + var thetaDelta = 0; + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + thetaDelta -= angle; + + } + + function rotateUp( angle ) { + + phiDelta -= angle; + + } + + var panLeft = function() { + + var v = new THREE.Vector3(); + + // return function panLeft( distance, objectMatrix ) { + // + // var te = objectMatrix.elements; + // + // // get X column of objectMatrix + // v.set( te[ 0 ], te[ 1 ], te[ 2 ] ); + // + // v.multiplyScalar( - distance ); + // + // panOffset.add( v ); + // + // }; + + // Fixed panning to x/y plane + return function panLeft(distance, objectMatrix) { + var te = objectMatrix.elements; + // var adjDist = distance / Math.cos(phi); + + v.set(te[ 0 ], 0, te[ 2 ]); + v.multiplyScalar(-distance); + + panOffset.add(v); + }; + + }(); + + // Fixed panning to x/y plane + var panUp = function() { + + var v = new THREE.Vector3(); + + // return function panUp( distance, objectMatrix ) { + // + // var te = objectMatrix.elements; + // + // // get Y column of objectMatrix + // v.set( te[ 4 ], te[ 5 ], te[ 6 ] ); + // + // v.multiplyScalar( distance ); + // + // panOffset.add( v ); + // + // }; + + return function panUp(distance, objectMatrix) { + var te = objectMatrix.elements; + var adjDist = distance / Math.cos(phi); + + v.set(te[ 4 ], 0, te[ 6 ]); + v.multiplyScalar(adjDist); + + panOffset.add(v); + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function() { + + var offset = new THREE.Vector3(); + + return function( deltaX, deltaY ) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( event ) { + + //console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel( event ) { + + //console.log( 'handleMouseWheel' ); + + var delta = 0; + + if ( event.wheelDelta !== undefined ) { + + // WebKit / Opera / Explorer 9 + + delta = event.wheelDelta; + + } else if ( event.detail !== undefined ) { + + // Firefox + + delta = - event.detail; + + } + + if ( delta > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( delta < 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + //console.log( 'handleKeyDown' ); + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + scope.update(); + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate( event ) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchStartDolly( event ) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartPan( event ) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchMoveRotate( event ) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleTouchMoveDolly( event ) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleTouchMovePan( event ) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleTouchEnd( event ) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( event.button === scope.mouseButtons.ORBIT ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else if ( event.button === scope.mouseButtons.ZOOM ) { + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + } else if ( event.button === scope.mouseButtons.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + document.addEventListener( 'mouseout', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + } else if ( state === STATE.DOLLY ) { + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + } else if ( state === STATE.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + document.removeEventListener( 'mouseout', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel( event ); + + scope.dispatchEvent( startEvent ); // not sure why these are here... + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + + handleTouchStartDolly( event ); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + handleTouchMoveRotate( event ); + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + handleTouchMoveDolly( event ); + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + if ( state !== STATE.TOUCH_PAN ) return; // is this needed?... + + handleTouchMovePan( event ); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'mousewheel', onMouseWheel, false ); + scope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + window.addEventListener( 'keydown', onKeyDown, false ); + + // force an update at start + + this.update(); + +}; + +OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); +OrbitControls.prototype.constructor = THREE.OrbitControls; + +Object.defineProperties( OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .center has been renamed to .target' ); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + return ! this.enableRotate; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + this.enableRotate = ! value; + + } + + }, + + noPan: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + return ! this.enablePan; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + this.enablePan = ! value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + return ! this.enableKeys; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + this.enableKeys = ! value; + + } + + }, + + staticMoving : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + return ! this.constraint.enableDamping; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + this.constraint.enableDamping = ! value; + + } + + }, + + dynamicDampingFactor : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + return this.constraint.dampingFactor; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + this.constraint.dampingFactor = value; + + } + + } + +} ); + +export default OrbitControls;