{"version":3,"file":"prosthetic-hand.js","sources":["../src/Hand.js","../src/Enums.js","../src/Finger.js","../src/Capabilities.js","../src/IvansIndexFinger.js"],"sourcesContent":["\nimport Finger from './Finger.js';\nimport * as enums from './Enums.js';\nimport * as capabilities from './Capabilities.js';\n\n// 🖑class Hand\n// Represents a set of `Finger`s, capable of performing synthetic touch gestures\n\n/*\n🖑example\n\n```js\nvar h = new Hand({ timing: '20ms' });\n```\n\n*/\nexport default class Hand {\n\n\t// 🖑factory Hand(options?: Hand options): Hand\n\t// Instantiates a new `Hand` with the given options.\n\tconstructor(options) {\n\n\t\tif (!options) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tthis._fingers = [];\n\n\t\tthis._fingersAreIdle = true;\n\n\n\t\t/// TODO: Timing modes: minimal, interval, frames\n\n\t\t// 🖑option timing: Timing= '20ms'\n\t\t// Defines how often new events will be fired, in one of the possible\n\t\t// timing modes\n\n\t\t// 🖑miniclass Timing (Hand)\n\t\tthis._timeInterval = 20;\n\t\tthis._timingMode = enums.INTERVAL;\n\t\tthis._framesPending = 0;\n\t\tif (options.timing) {\n\t\t\tvar timing = options.timing.toString();\n\n\t\t\t// 🖑option ms\n\t\t\t// Preceded by a number (e.g. `'20ms'`), this mode triggers an event\n\t\t\t// dispatch every that many milliseconds.\n\t\t\tif (timing.match(/^\\d+ms$/)) {\n\t\t\t\tthis._timingMode = enums.INTERVAL;\n\t\t\t\tthis._timeInterval = parseInt(timing);\n\t\t\t}\n\n\t\t\t// 🖑option frame\n\t\t\t// This mode dispatches an event every [animation frame](https://developer.mozilla.org/docs/Web/API/Window/requestAnimationFrame).\n\t\t\tif (timing === 'frame') {\n\t\t\t\tthis._timingMode = enums.FRAME;\n\t\t\t\tthis._timeInterval = parseInt(timing);\n\t\t\t}\n\n\t\t\t// 🖑option minimal\n\t\t\t// This mode triggers an event dispatch per finger change, and ensures\n\t\t\t// that every move can trigger its own event (no two movements will be\n\t\t\t// rolled into one event if they are very close).\n\t\t\tif (timing === 'minimal') {\n\t\t\t\tthis._timingMode = enums.MINIMAL;\n\t\t\t\tthis._timeInterval = false;\n\t\t\t}\n\n\t\t\t// 🖑option instant\n\t\t\t// Like the `minimal` mode, but ignores timings completely and dispatches\n\t\t\t// all events instantaneously. This might cause misbehaviour in graphical\n\t\t\t// browsers, and the `onStart` and `onStop` callbacks will be called at.\n\t\t\t// every step of the movement (as the movement ends before the next step\n\t\t\t// is chained in)\n\t\t\tif (timing === 'instant') {\n\t\t\t\tthis._timingMode = enums.INSTANT;\n\t\t\t\tthis._timeInterval = false;\n\t\t\t}\n\n\t\t\t// 🖑option fastframe\n\t\t\t// This mode ignores timings completely like the `instant` mode, and\n\t\t\t// dispatches a new event every so many frames.\n\t\t\tif (timing === 'fastframe') {\n\t\t\t\tthis._timingMode = enums.FASTFRAME;\n\t\t\t\tthis._timeInterval = parseInt(timing);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// 🖑class Hand\n\n\t\t// 🖑option onStart: Function\n\t\t// If set to a callback function, it will be called (with the `Hand` \n\t\t// as its only argument) whenever the movements start.\n\t\tif (options.onStart) {\n\t\t\tthis._onStart = options.onStart;\n\t\t}\n\t\t\n\t\t// 🖑option onStop: Function\n\t\t// If set to a callback function, it will be called (with the `Hand` \n\t\t// as its only argument) whenever the movements are completed.\n\t\tif (options.onStop) {\n\t\t\tthis._onStop = options.onStop;\n\t\t}\n\t\t\n\n\t\t// Cancellable reference to the next call to `_dispatchEvents`. This\n\t\t// might be either a `setTimeout` reference or a `requestAnimationFrame`\n\t\t// reference.\n\t\tthis._nextDispatch = null;\n\t}\n\n\n\t// 🖑method growFinger(eventMode, options): Finger\n\t// Creates a new `Finger` with the same parameters as the [`Finger` constructor](#finger-finger),\n\t// and adds it to the hand.\n\tgrowFinger(fingerMode, options) {\n\n\t\tif (!options) {\n\t\t\toptions = {};\n\t\t}\n\t\tObject.assign(options, {hand: this});\n\n\t\tvar finger = new Finger(fingerMode, options);\n\n\t\tthis._fingers.push(finger);\n\t\treturn finger;\n\t}\n\n\n\n\n\t// 🖑method fingerIsBusy(): this\n\t// Used by this hand's fingers to signal that there are movements to be\n\t// performed by at least one finger.\n\tfingerIsBusy() {\n\n\t\t/// TODO: Start up the event loop\n\n\t\tif (this._fingersAreIdle) {\n\t\t\t// 🖑section\n\t\t\t// Use `document.addEventListener('prostheticHandStop', fn)` to\n\t\t\t// do stuff with it.\n\t\t\t// 🖑event prostheticHandStart: CustomEvent\n\t\t\t// Fired when all movements are complete.\n\t\t\tdocument.dispatchEvent(new CustomEvent('prostheticHandStart', {target: this}));\n\n\t\t\tif (this._onStart && this._onStart instanceof Function) {\n\t\t\t\tthis._onStart(this);\n\t\t\t}\n\t\t\t\n\t\t\tthis._fingersAreIdle = false;\n\t\t\tthis._scheduleNextDispatch();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// 🖑method fingerIsIdle(): this\n\t// Used by this hand's fingers to signal that one finger has finished doing\n\t// all the queued movements.\n\tfingerIsIdle() {\n\n\t\tif (this._fingers.every( f => f.isIdle())) {\n\n\t\t\tif (!this._fingersAreIdle) {\n\t\t\t\t// 🖑event prostheticHandStop: CustomEvent\n\t\t\t\t// Fired when all movements are complete.\n\n\t\t\t\tdocument.dispatchEvent(new CustomEvent('prostheticHandStop', {target: this}));\n\t\t\t\t\n\n\t\t\t\tif (this._onStop && this._onStop instanceof Function) {\n\t\t\t\t\tthis._onStop(this);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._fingersAreIdle = true;\n\t\t}\n\t}\n\n\n\t// 🖑method sync(delay): this\n\t// Synchronizes the finger movements by adding a delay of **at least** `delay`\n\t// milliseconds to each finger. After a sync, the movements of the fingers\n\t// will happen at exactly the same time.\n\tsync(delay) {\n\n\t\tvar endTimestamp = performance.now();\n\n\t\tthis._fingers.forEach( f => {\n\t\t\tvar movesUntil = f._movesUntil;\n\t\t\tif (movesUntil) {\n\t\t\t\tendTimestamp = Math.max(endTimestamp, movesUntil);\n\t\t\t}\n\t\t});\n\n\t\tvar waitUntil = endTimestamp + delay;\n\n\t\tthis._fingers.forEach( f => {\n\t\t\tf.waitUntil(waitUntil);\n\t\t});\n\n\t}\n\n\n\n\n\t// 🖑method private_dispatchEvents(): this\n\t// Updates all the fingers, fetching their events/touchpoints, and dispatches\n\t// all `Event`s triggered by the update.\n\t// This is meant to be called on an internal timer.\n\t_dispatchEvents(timestamp) {\n\n\t\t// 🖑event prostheticHandTick: CustomEvent\n\t\t// Fired a movement is about to start, just before the mouse/touch/pointer\n\t\t// events are fired.\n\t\tdocument.dispatchEvent(new CustomEvent('prostheticHandStart', {target: this}));\n\n\n\t\tvar now = timestamp || performance.now();\n\t\tvar events = [];\n\t\tvar touches = [];\n\t\tvar changedTouches = [];\n\n\t\tvar hasTouchStart = false;\n\t\tvar touchStartTarget = undefined;\n\t\tvar hasTouchEnd = false;\n\t\tvar touchEndTarget = undefined;\n\n\t\tvar fast = this._timingMode === enums.MINIMAL ||\n\t\t this._timingMode === enums.INSTANT ||\n\t\t this._timingMode === enums.FASTFRAME;\n\n\t\tthis._fingers.forEach(f=> {\n\n\t\t\tvar evs = f.getEvents(now, fast);\n\n\t\t\tevs.forEach( ev => {\n\t\t\t\tif ('event' in ev) {\n\t\t\t\t\tevents.push(ev.event);\n\t\t\t\t}\n\t\t\t\tif ('touch' in ev) {\n\t\t\t\t\tif (ev.type === 'down') {\n\t\t\t\t\t\thasTouchStart = true;\n\t\t\t\t\t\ttouchStartTarget = ev.touch.target;\n\t\t\t\t\t\t// If several touches start in the same instant at\n\t\t\t\t\t\t// the diffetent targets, this code will instead\n\t\t\t\t\t\t// assume the last target.\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ev.type === 'up') {\n\t\t\t\t\t\thasTouchEnd = true;\n\t\t\t\t\t\ttouchEndTarget = ev.touch.target;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Touches which have just been lost must not be added\n\t\t\t\t\t\t// to 'touches' or 'targetTouches'\n\t\t\t\t\t\ttouches.push(ev.touch);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ev.type !== 'idle') {\n\t\t\t\t\t\tchangedTouches.push(ev.touch);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Fire all `MouseEvent`s and `PointerEvent`s\n\t\tevents.forEach( ev => {\n// \t\t\tconsole.log('Dispatching: ', ev.type);\n\t\t\tdocument.elementFromPoint(ev.clientX, ev.clientY).dispatchEvent(ev);\n\t\t});\n\n\n\t\t/// Build *ONE* `TouchEvent` with `TouchList`s built with\n\t\t/// the fingers' touches.\n\t\tif (touches.length || hasTouchEnd) {\n\t\t\tvar touchEvent;\n\t\t\tvar touchTarget;\n\n\t\t\tif (hasTouchStart) {\n\t\t\t\t// In case touches are added and removed on the same instant,\n\t\t\t\t// `touchstart` takes precedence.\n\n\t\t\t\ttouchEvent = this._createTouchEvent(\"touchstart\", {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\ttouches: touches,\n\t\t\t\t\ttargetTouches: touches.filter( t => t.target === touchStartTarget ),\n\t\t\t\t\tchangedTouches: changedTouches\n\t\t\t\t});\n\t\t\t\ttouchTarget = touchStartTarget;\n// console.log('synthesizing touchstart', touchStartTarget, touchEvent);\n\n\t\t\t} else if (hasTouchEnd) {\n\n\t\t\t\t// This goes directly against the specifications!! They say:\n\t\t\t\t// «touchend: The event's target is the same element that received\n\t\t\t\t// the touchstart event corresponding to the touch point, even\n\t\t\t\t// if the touch point has moved outside that element.»\n\t\t\t\ttouchEndTarget = document.elementFromPoint(changedTouches[0].clientX, changedTouches[0].clientY);\n\n\t\t\t\ttouchEvent = this._createTouchEvent(\"touchend\", {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\ttouches: touches,\n\t\t\t\t\ttarget: touchEndTarget,\n\t\t\t\t\ttargetTouches: touches.filter( t => t.target === touchEndTarget ),\n\t\t\t\t\tchangedTouches: changedTouches\n\t\t\t\t});\n\t\t\t\ttouchTarget = touchEndTarget;\n// console.log('synthesizing touchend', touchEndTarget, touchEvent);\n\n\t\t\t} else {\n\n\t\t\t\t// I have no idea what I'm doing!!!!1\n\t\t\t\t// Apparently dispatching a touch event to the target of a touch\n\t\t\t\t// will not work.\n// \t\t\t\ttouchTarget = touches[0].target;\n\t\t\t\ttouchTarget = document.elementFromPoint(touches[0].clientX, touches[0].clientY);\n\n\t\t\t\ttouchEvent = this._createTouchEvent(\"touchmove\", {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\ttouches: touches,\n\t\t\t\t\ttargetTouches: touches.filter( t => t.target === touchTarget ),\n\t\t\t\t\tchangedTouches: changedTouches\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tif (changedTouches.length) {\n// console.log('Dispatching touch event:', touchEvent.type, touchEvent, touchTarget);\n\n\t\t\t\t// Safari misbehaves when searching for the elementFromPoint(0, 0)\n\t\t\t\t// and returns `undefined` instead of `document`\n\t\t\t\tif (!touchTarget) {\n\t\t\t\t\ttouchTarget = document;\n\t\t\t\t}\n\n\t\t\t\ttouchTarget.dispatchEvent(touchEvent);\n\t\t\t}\n\n\t\t}\n\n\t\tthis._scheduleNextDispatch();\n\n\t\treturn this;\n\t}\n\n\t// Wrapper over `new Event()` or `createEvent(); initTouchEvent()` depending\n\t// on what the browser supports.\n\t_createTouchEvent(type, data) {\n\t\tif (capabilities.touchEventConstructor) {\n\t\t\treturn new TouchEvent(type, data);\n\t\t} else {\n\t\t\t// It's ugly, it's legacy, but it should work.\n\t\t\t// See https://miketaylr.com/posts/2015/09/init-touch-event-is-a-rats-nest.html\n\n\t\t\tvar touchEvent;\n\t\t\ttry {\n\t\t\t\ttouchEvent = document.createEvent('TouchEvent');\n\t\t\t} catch (e) {\n\t\t\t\ttouchEvent = document.createEvent('UIEvent');\n\t\t\t}\n\n\t\t\tif (touchEvent && touchEvent.initTouchEvent) {\n\t\t\t\tif (touchEvent.initTouchEvent.length == 0 && !capabilities.safari) { // Chrome\n\t\t\t\t\ttouchEvent.initTouchEvent(\n\t\t\t\t\t\tthis._createTouchListFromArray(data.touches),\n\t\t\t\t\t\tthis._createTouchListFromArray(data.targetTouches),\n\t\t\t\t\t\tthis._createTouchListFromArray(data.changedTouches),\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\twindow,\n\t\t\t\t\t\t0,\t// screenX\n\t\t\t\t\t\t0,\t// screenY\n\t\t\t\t\t\t0,\t// clientX\n\t\t\t\t\t\t0\t// clientY\n\t\t\t\t\t);\n\n\t\t\t\t} else if ( touchEvent.initTouchEvent.length == 12 ) { //firefox\n\t\t\t\t\ttouchEvent.initTouchEvent(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tdata.bubbles,\n\t\t\t\t\t\tdata.cancelable,\n\t\t\t\t\t\twindow,\n\t\t\t\t\t\tdata.detail,\n\t\t\t\t\t\tdata.ctrlKey,\n\t\t\t\t\t\tdata.altKey,\n\t\t\t\t\t\tdata.shiftKey,\n\t\t\t\t\t\tdata.metaKey,\n\t\t\t\t\t\tthis._createTouchListFromArray(data.touches),\n\t\t\t\t\t\tthis._createTouchListFromArray(data.targetTouches),\n\t\t\t\t\t\tthis._createTouchListFromArray(data.changedTouches)\n\t\t\t\t\t);\n\n\t\t\t\t} else { // Safari (length = 18, shows 0)\n\t\t\t\t\t// https://developer.apple.com/library/safari/documentation/UserExperience/Reference/TouchEventClassReference/index.html#//apple_ref/javascript/instm/TouchEvent/initTouchEvent\n\t\t\t\t\ttouchEvent.initTouchEvent(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tdata.bubbles,\n\t\t\t\t\t\tdata.cancelable,\n\t\t\t\t\t\twindow,\n\t\t\t\t\t\tdata.detail,\n\t\t\t\t\t\t0, // screenX,\n\t\t\t\t\t\t0, // screenY,\n\t\t\t\t\t\t0, // pageX,\n\t\t\t\t\t\t0, // pageY,\n\t\t\t\t\t\tdata.ctrlKey,\n\t\t\t\t\t\tdata.altKey,\n\t\t\t\t\t\tdata.shiftKey,\n\t\t\t\t\t\tdata.metaKey,\n\t\t\t\t\t\tthis._createTouchListFromArray(data.touches),\n\t\t\t\t\t\tthis._createTouchListFromArray(data.targetTouches),\n\t\t\t\t\t\tthis._createTouchListFromArray(data.changedTouches),\n\t\t\t\t\t\t1, // data.scale,\t- as factor of initial distance between the two first touches\n\t\t\t\t\t\t0 // data.rotation\t- as delta of angle of two first touches\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn touchEvent;\n\t\t}\n\t}\n\n\n\t// Stupid wrapper over document.createTouchList, because PhantomJS\n\t// doesn't like document.createTouchList.apply. I know this is a hack.\n\t// **Hopefully** nobody needs more than 8 fingers at the same time in PhantomJS.\n\t_createTouchListFromArray(touches) {\n\t\tswitch(touches.length) {\n\t\t\tcase 0:\n\t\t\t\treturn document.createTouchList();\n\t\t\tcase 1:\n\t\t\t\treturn document.createTouchList(touches[0]);\n\t\t\tcase 2:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1]);\n\t\t\tcase 3:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1], touches[2]);\n\t\t\tcase 4:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1], touches[2], touches[3]);\n\t\t\tcase 5:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1], touches[2], touches[3], touches[4]);\n\t\t\tcase 6:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1], touches[2], touches[3], touches[4], touches[5]);\n\t\t\tcase 7:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1], touches[2], touches[3], touches[4], touches[5], touches[6]);\n\t\t\tdefault:\n\t\t\t\treturn document.createTouchList(touches[0], touches[1], touches[2], touches[3], touches[4], touches[5], touches[6], touches[7]);\n\t\t}\n\n\t}\n\n\n\t_scheduleNextDispatch(){\n\t\tif (!this._fingersAreIdle) {\n\n\t\t\t// Calculate time for next movement end. Could be refactored out for\n\t\t\t// some timing modes.\n\t\t\tvar min = Infinity;\n\t\t\tthis._fingers.forEach(f=> {\n\t\t\t\tif (!f.isIdle()) {\n\t\t\t\t\tvar next = f.getNextMoveEndTime();\n\t\t\t\t\t// \t\t\t\t\t\tconsole.log('next:', next);\n\t\t\t\t\tif (next < min) {\n\t\t\t\t\t\tmin = next;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t\tif (this._timingMode === enums.INTERVAL) {\n\t\t\t\tthis._nextDispatch = setTimeout(this._dispatchEvents.bind(this), this._timeInterval);\n\n\t\t\t} else if (this._timingMode === enums.MINIMAL) {\n\t\t\t\tthis._nextDispatch = setTimeout(this._dispatchEvents.bind(this), min - performance.now());\n\n\t\t\t} else if (this._timingMode === enums.INSTANT) {\n\t\t\t\treturn this._dispatchEvents(min);\n\n\t\t\t} else if (this._timingMode === enums.FRAME) {\n\t\t\t\tthis._nextDispatch = requestAnimationFrame( this._dispatchEvents.bind(this) );\n\n\t\t\t} else if (this._timingMode === enums.FASTFRAME) {\n\t\t\t\tthis._nextDispatch = requestAnimationFrame( function() {\n\t\t\t\t\tthis._dispatchEvents(min);\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n\n\n\n","\n// Exports a bunch of symbols^H^H^H^H^H ints for use as enums\n\nexport var INTERVAL = 1;\nexport var MINIMAL = 2;\nexport var INSTANT = 3;\nexport var FRAME = 4;\nexport var FASTFRAME = 5;\n\n// export var INTERVAL = new Symbol();\n// export var MINIMAL = new Symbol();\n// export var INSTANT = new Symbol();\n//\n\n","\nimport IvansFinger from './IvansIndexFinger.js';\nimport * as capabilities from './Capabilities.js';\n\n\n// Self-incrementing identifier for touch ID and pointer ID.\n// Fingers can either keep the same ID for their life, or request a new\n// ID whenever they go down.\nvar fingerIdSequence = 1;\n\n// 🖑class Finger\n// Represents a finger, capable of performing single touch/pointer/mouse synthetic\n// events.\n\n/*\n🖑example\n\n```js\nvar h = new Hand();\nvar fatFinger = h.growFinger('pointer', { pointerType: 'touch', pressure: 0.9 });\nvar lightFinger = h.growFinger('pointer', { pointerType: 'touch', pressure: 0.1 });\n\nfatFinger.wait(500).moveTo(200, 250, 0).down().moveBy(100, 150, 2000).up();\n```\n\n*/\nexport default class Finger {\n\n\t// 🖑factory Finger(eventMode: String, options?: Finger state): Finger\n\t// Instantiates a new `Finger`. `eventMode` must be `mouse`, `touch` or `pointer`\n\t// for `MouseEvent`s, `TouchEvent`s or `PointerEvent`s, respectively.\n\tconstructor(eventMode, options) {\n\n\t\tthis._id = fingerIdSequence++;\n\n\t\tthis._mode = eventMode || 'mouse';\n\n\t\tthis._hand = options.hand;\n\n\t\t/// TODO: parkinsonFactor or shakesFactor or jitteryness or something\n\n\n\t\t// 🖑section Finger state\n\t\t// The internal state of a `Finger` has options which will be reflected as\n\t\t// properties of the events fired afterwards. Some of these state options\n\t\t// apply only to a specific event mode.\n\t\tthis._state = Object.assign({}, {\n\t\t\t// 🖑option x: Number; The number of pixels from the left boundary the finger is at.\n\t\t\tx: 0,\n\n\t\t\t// 🖑option y: Number; The number of pixels from the top boundary the finger is at.\n\t\t\ty: 0,\n\n\t\t\t// 🖑option down: Boolean; Whether the finger is down (clicking/touching/pressing) or not. This is referred to as \"active\" in some of the events specifications.\n\t\t\tdown: false,\n\n\t\t\t// 🖑option pressure: Number = 0.5; The value for [`Touch.force`](`https://developer.mozilla.org/docs/Web/API/Touch/force`) or [`PointerEvent.pressure`](https://developer.mozilla.org/docs/Web/API/PointerEvent/pressure), between `0.0` and `1.0`\n\t\t\tpressure: 0.5,\n\n\t\t\t// 🖑option tiltX: Number = 0; The value for [`PointerEvent.tiltX`](https://developer.mozilla.org/docs/Web/API/PointerEvent/tiltX)\n\t\t\ttiltX: 0,\n\n\t\t\t// 🖑option tiltY: Number = 0; The value for [`PointerEvent.tiltX`](https://developer.mozilla.org/docs/Web/API/PointerEvent/tiltY)\n\t\t\ttiltY: 0,\n\n\t\t\t// 🖑option width: Number = 25; The value for [`Touch.radiusX`](`https://developer.mozilla.org/docs/Web/API/Touch/radiusX`) or [`PointerEvent.width`](https://developer.mozilla.org/docs/Web/API/PointerEvent/width)\n\t\t\twidth: 25,\n\n\t\t\t// 🖑option radiusY: Number = 25; The value for [`Touch.radiusY`](`https://developer.mozilla.org/docs/Web/API/Touch/radiusY`) or [`PointerEvent.height`](https://developer.mozilla.org/docs/Web/API/PointerEvent/height)\n\t\t\theight: 25,\n\n\t\t\t// 🖑option pointerType: String = 'pen'; The value for [`PointerEvent.pointerType`](https://developer.mozilla.org/docs/Web/API/PointerEvent/pointerType)\n\t\t\tpointerType: 'pen'\n\t\t}, options);\n\n\n\n\t\t// A \"finger movement\" is a plain hashmap that describes either a\n\t\t// instantaneous state change (e.g. \"touch down\", \"up/lift touch\",\n\t\t// \"change pressure\") or a movement(\"move\", \"wiggle\", \"vary pressure\n\t\t// during a few seconds\").\n\t\t// A finger movement has three things:\n\t\t// * A duration (can be zero)\n\t\t// * A final finger state\n\t\t// * A function that returns the finger state (run when the movement is\n\t\t// still running, i.e. the end timestamp is not reached yet)\n\t\t// These are called duration, finalState and getState().\n\t\t// getState() gets called with an amount of milliseconds since the last movement\n\t\t// getState() might return `false`, meaning 'nothing happened since last time'\n\n\t\tthis._movements = [];\n\n\t\t// Timestamp for the end of the last movement.\n\t\tthis._movesUntil = performance.now();\n\n\t\t// Timestamp for the start of the current movement. This is always in the past.\n\t\tthis._movesFrom = performance.now();\n\n\t\t// Final state of the last movement (to calculate the next movement if needed).\n\t\tthis._finalState = Object.assign({}, this._state);\n\n\t\t// This should be configurable with custom/more graphics\n\t\tif (this._mode === 'touch') {\n\t\t\tthis._initGraphicIvansFinger();\n\t\t\tif (!capabilities.touch) {\n\t\t\t\tconsole.warn('This browser cannot emulate touch events.');\n\t\t\t}\n\t\t} else if (this._mode === 'pointer') {\n\t\t\tif (this._state.pointerType === 'touch') {\n\t\t\t\tthis._initGraphicIvansFinger();\n\t\t\t} else {\n\t\t\t\tthis._initGraphicCircle();\n\t\t\t}\n\t\t\tif (!capabilities.pointer) {\n\t\t\t\tconsole.warn('This browser cannot emulate pointer events.');\n\t\t\t}\n\t\t} else {\n\t\t\tthis._mode = 'mouse';\n\t\t\tthis._initGraphicCircle();\n\t\t\tif (!capabilities.mouse) {\n\t\t\t\tconsole.warn('This browser cannot emulate mouse events.');\n\t\t\t}\n\t\t}\n\n\n\t\t// Only used for `TouchEvent`s (as `Touch.target`): Will hold a\n\t\t// reference to the DOM element on which the touch point started when\n\t\t// it was first placed on the surface.\n\t\tthis._touchTargetWhenDowned = undefined;\n\n\t\t// For checking mouseover/mouseout/pointerover/pointerout events, and\n\t\t// for checking whether a `Touch` should be in the `targetTouches` `TouchList`\n\t\tthis._currentTarget = undefined;\n\n\t}\n\n\n\t// 🖑method isIdle(): Boolean\n\t// Returns true when the finger has no more pending movements/waits/wiggles/etc.\n\tisIdle() {\n\t\treturn !(this._movements.length);\n\t}\n\n\n\t// 🖑method down(delay?: Number): this\n\t// Puts the finger down, optionally after a delay.\n\tdown(delay) {\n\t\treturn this.update({ down: true, getState: this._falseFn, duration: delay || 0 });\n\t}\n\n\n\t// 🖑method up(options?: {}): this\n\t// Lifts the finger up, after an optional delay.\n\tup(delay) {\n\t\treturn this.update({ down: false, getState: this._falseFn, duration: delay || 0 });\n\t}\n\n\n\t// 🖑method wait(delay): this\n\t// Don't move this finger for `delay` milliseconds.\n\twait(delay) {\n\t\tthis._queueMove({finalState: this._finalState, getState: this._falseFn, duration: delay});\n\t\treturn this;\n\t}\n\n\n\t// 🖑method waitUntil(timestamp): this\n\t// Don't move this finger until the given timestamp is reached.\n\twaitUntil(timestamp) {\n\t\tif (this._movements.length) {\n\t\t\treturn this.wait( timestamp - this._movesUntil );\n\t\t} else {\n\t\t\tvar move = {\n\t\t\t\tfinalState: this._finalState,\n\t\t\t\tgetState: this._falseFn,\n\t\t\t\tduration: timestamp - performance.now(),\n\t\t\t\tuntil: timestamp\n\t\t\t};\n\t\t\tthis._movesUntil = this._movesFrom = move.until;\n\t\t\tthis._movements.push(move);\n\n\t\t\tthis._hand.fingerIsBusy();\n\t\t}\n\t\treturn this;\n\t}\n\n\n\t// 🖑method update(options?: {}): this\n\t// Updates some of the finger options, like pressure or touch angle,\n\t// without disturbing its movement, after an optional delay.\n\tupdate(options, delay) {\n\t\tthis._queueMove({finalState: options, getState: this._falseFn, duration: delay || 0});\n\t\treturn this;\n\t}\n\n\n\t// 🖑method reset(options?: {}): this\n\t// Clears all the queued movements for this finger and immediately lifts it up\n\treset(options) {\n\t\treturn this;\n\t}\n\n\n\n\t// 🖑method moveTo(x: Number, y: Number, delay: Number, options?: {}): this\n\t// Queues moving this finger to an absolute position at `(x, y)`; the\n\t// movement will last for `delay` milliseconds.\n\tmoveTo(x, y, delay) {\n\t\treturn this.moveBy(x - this._finalState.x, y - this._finalState.y, delay);\n\t}\n\n\n\t// 🖑method moveBy(x: Number, y: Number, delay: Number, options?: {}): this\n\t// Queues a move of this finger to an position relative to its last position\n\t// plus`(x, y)`; the movement will last for `delay` milliseconds.\n\tmoveBy(x, y, delay) {\n\t\tvar fromX = this._finalState.x;\n\t\tvar fromY = this._finalState.y;\n\n\t\tvar move = {\n\t\t\tfinalState: {\n\t\t\t\tx: fromX + x,\n\t\t\t\ty: fromY + y,\n\t\t\t},\n\n\t\t\tgetState: (function(x1, y1, dx, dy){\n\t\t\t\treturn function(msec) {\n\t\t\t\t\tvar percent = msec / delay;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: Math.round(x1 + (dx * percent)),\n\t\t\t\t\t\ty: Math.round(y1 + (dy * percent))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})(fromX, fromY, x, y, delay),\n\n\t\t\tduration: delay\n// \t\t\tuntil: this._movesUntil + delay\n\t\t}\n\n\t\tthis._queueMove(move);\n\n\t\treturn this;\n\t}\n\n\n\t// An aux function that always returns false\n\t_falseFn() {\n\t\treturn false;\n\t}\n\n\n\t// Queues a movement\n\t_queueMove( move ) {\n\n\t\tif (!this._movements.length) {\n\t\t\tthis._movesUntil = this._movesFrom = performance.now();\n\t\t}\n\n\t\tmove.until = this._movesUntil + move.duration;\n\t\tthis._movements.push(move);\n\n\t\tthis._finalState = move.finalState = Object.assign({}, this._finalState, move.finalState);\n\n\t\tthis._movesUntil = move.until;\n\n\t\tif (this._movements.length === 1) {\n\t\t\tthis._hand.fingerIsBusy();\n\t\t}\n\t}\n\n\n\t// Returns the timestamp when the next movement will be finished\n\t// 🖑method getNextMoveEndTime(): Number|undefined\n\tgetNextMoveEndTime() {\n\t\tif (!this._movements.length) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this._movements[0].until;\n\t}\n\n\n\t/*\n\t * 🖑method getEvents(timestamp?: Number, justOne: Boolean): []\n\t * Updates the private properties of the finger (x, y, timestamp) by\n\t * running the next movement(s) as far as indicated by the timestamp (or\n\t * as fas as to `performance.now()`), then checks if the state has changed\n\t * and means an event should be fired.\n\t *\n\t * If `justOne` is set to truthy, then this will run just one movements.\n\t * Otherwise, it will run as many movements as needed until `timestamp` is reached.\n\t *\n\t * Returns an array of objects of the form `{type: 'foo', event: MouseEvent(...), finger: Finger}`\n\t * or `{type: 'foo', touch: Touch(...), finger: Finger}`, with all the active `Touch`es or\n\t * all triggered mouse/pointer events triggered by executing moves until\n\t * `timestamp`.\n\t *\n\t * If the finger doesn't matter when `getEvents()` is called, then an empty\n\t * array is return instead. This happens for mice not moving, and fingers\n\t * not touching (fingers touching but not moving, and mice not pressing\n\t * but moving *do* matter).\n\t *\n\t * A `Hand` is reponsible for getting events (using loops, timings, or\n\t * whatever), requesting the right timestamps if needed, merging `Touch`es\n\t * into `TouchEvent`s, and firing the events via `dispatchEvent()`.\n\t*/\n\tgetEvents(timestamp, justOne) {\n\t\tvar now = timestamp || performance.now();\n\t\tvar changed = false;\n\t\tvar previousState = Object.assign({}, this._state);\n\t\t// Process all moves that already happened (since last frame)\n\t\twhile (this._movements.length && this._movements[0].until <= now && !(changed && justOne)) {\n\t\t\tvar done = this._movements.shift();\n\t\t\tObject.assign(this._state, done.finalState);\n\t\t\tthis._movesFrom = done.until;\n\t\t\tchanged = true;\n\t\t}\n\n\t\t// Process ongoing movement\n\t\tif (this._movements.length && !(changed && justOne)) {\n\t\t\tvar move = this._movements[0];\n\n\t\t\tvar updatedState = move.getState( now - this._movesFrom );\n\n\t\t\tif (updatedState && !this._statesAreEqual(updatedState, this._state)) {\n\t\t\t\tchanged = true;\n\t\t\t\tObject.assign(this._state, updatedState);\n\t\t\t}\n\n\t\t}\n\n\t\tif (!this._movements.length) {\n\t\t\tthis._hand.fingerIsIdle();\n\t\t}\n\n// \t\t// TODO: Add jitter if needed\n\n\t\tvar evType = 'idle';\n\n\t\tif (changed) {\n\n\t\t\tif (previousState.x !== this._state.x || previousState.y !== this._state.y) {\n\t\t\t\tevType = 'move'\n\t\t\t\tthis._currentTarget = document.elementFromPoint(this._state.x, this._state.y);\n\t\t\t}\n\t\t\t/// TODO: Detect over/out events when the event target changes.\n\n\t\t\tif (previousState.down && (!this._state.down)) {\n\t\t\t\tthis._graphic.style.display = 'none';\n\t\t\t\tevType = 'up';\n\t\t\t} else if ((!previousState.down) && this._state.down){\n\t\t\t\t// TODO: Optionally reset the finger ID and grab a fresh one\n\n\t\t\t\tthis._graphic.style.display = 'block';\n\t\t\t\tthis._touchTargetWhenDowned = this._currentTarget = document.elementFromPoint(this._state.x, this._state.y);\n\t\t\t\tevType = 'down';\n\t\t\t}\n\n\t\t\tthis._setGraphicPosition(this._state.x, this._state.y);\n\t\t}\n\n\n\t\t// `MouseEvent`s\n\t\tif (this._mode === 'mouse' || this._mode === 'touchpad') {\n\t\t\tif (evType === 'idle') {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\t/// TODO: Check for mouseover/mouseout events, add them to the\n\t\t\t/// array.\n\t\t\t/// TODO: Create synthetic `click` and `dblclick` events if/when\n\t\t\t/// needed, add them to the array.\n\t\t\treturn [{ type: evType, event: this._asMouseEvent(evType), finger: this }];\n\t\t}\n\n\t\t// `PointerEvent`s\n\t\tif (this._mode === 'pointer') {\n\t\t\tif (evType === 'idle') {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\t/// TODO: Check for pointerover/pointerout events, add them to the\n\t\t\t/// array.\n\t\t\t/// TODO: Create synthetic `click` and `dblclick` events if/when\n\t\t\t/// needed, add them to the array.\n\t\t\treturn [{ type: evType, event: this._asPointerEvent(evType), finger: this }];\n\t\t}\n\n\t\t// `Touch`es\n\t\tif (this._mode === 'touch') {\n\t\t\tif (this._touchTargetWhenDowned) {\n\n\t\t\t\tvar ret = [{ type: evType, touch: this._asTouch(evType), finger: this }];\n\t\t\t\tif (evType === 'up') {\n\t\t\t\t\tthis._touchTargetWhenDowned = undefined;\n\t\t\t\t}\n\n\t\t\t\treturn ret;\n\t\t\t} else {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\treturn [];\n\t}\n\n\n\n\t// 🖑method private_asTouch(): Touch\n\t// Returns an instance of `Touch` representing the current state of the finger\n\t// Note this is not an event - a `TouchEvent` must be created later, with several\n\t// `Touch`es.\n\t_asTouch() {\n\t\tvar touch;\n\t\tif (capabilities.touchConstructor && !capabilities.safari) {\n\t\t\ttouch = new Touch({\n\t\t\t\tidentifier: this._id,\n\t\t\t\ttarget: this._touchTargetWhenDowned,\n\t\t\t\tclientX: this._state.x,\n\t\t\t\tclientY: this._state.y,\n\t\t\t\tscreenX: this._state.x,\t/// TODO: Handle page scrolling\n\t\t\t\tscreenY: this._state.y,\n\t\t\t\tpageX: this._state.x,\n\t\t\t\tpageY: this._state.y,\n\t\t\t\tradiusX: 25,\n\t\t\t\tradiusY: 25,\n\t\t\t\trotationAngle: 0,\n\t\t\t\tforce: this._state.pressure\n\t\t\t});\n\t\t} else {\n\n\t\t\tif (capabilities.chrome) {\n\t\t\t\ttouch = document.createTouch(\n\t\t\t\t\twindow,\t// view\n\t\t\t\t\tthis._touchTargetWhenDowned,\t// target\n\t\t\t\t\tthis._id,\t// identifier\n\t\t\t\t\tthis._state.x,\t// clientX\n\t\t\t\t\tthis._state.y,\t// clientY\n\t\t\t\t\tthis._state.x,\t// screenX\n\t\t\t\t\tthis._state.y,\t// screenY\n\n\t\t\t\t\t// Inconsistency: These break anything other than chrome:\n\t\t\t\t\t25,\t// radiusX\n\t\t\t\t\t25,\t// radiusY\n\t\t\t\t\t0,\t// rotationAngle\n\t\t\t\t\tthis._state.pressure\t// force\n\t\t\t\t);\n\t\t\t} else if (capabilities.gecko) {\n\t\t\t\ttouch = document.createTouch(\n\t\t\t\t\twindow,\t// view\n\t\t\t\t\tthis._touchTargetWhenDowned,\t// target\n\t\t\t\t\tthis._id,\t// identifier\n\t\t\t\t\tthis._state.x,\t// clientX\n\t\t\t\t\tthis._state.y,\t// clientY\n\t\t\t\t\tthis._state.x,\t// screenX\n\t\t\t\t\tthis._state.y,\t// screenY\n\n\t\t\t\t\t// Inconsistency: these are needed in Firefox\n\t\t\t\t\tthis._state.x,\t// pageX\n\t\t\t\t\tthis._state.y\t// pageY\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttouch = document.createTouch(\n\t\t\t\t\twindow,\t// view\n\t\t\t\t\tthis._touchTargetWhenDowned,\t// target\n\t\t\t\t\tthis._id,\t// identifier\n\t\t\t\t\tthis._state.x,\t// clientX\n\t\t\t\t\tthis._state.y,\t// clientY\n\t\t\t\t\tthis._state.x,\t// screenX\n\t\t\t\t\tthis._state.y\t// screenY\n\t\t\t\t);\n\t\t\t}\n\n\t\t}\n\t\treturn touch;\n\t}\n\n\t// 🖑method private_asPointerEvent(): PointerEvent\n\t// Returns an instance of `PointerEvent` representing the current state of the finger\n\t_asPointerEvent(evType) {\n\t\tvar ev = new PointerEvent('pointer' + evType, {\n\t\t\tbubbles: true,\n\t\t\tbutton: 0,\t// Moz doesn't use -1 when no buttons are pressed, WTF?\n// \t\t\tbuttons: this._state.down ? 1 : 0,\n// \t\t\tdetail: (evType === 'down' || evType === 'up') ? 1 : 0,\t// TODO: count consecutive clicks\n\t\t\tclientX: this._state.x,\n\t\t\tclientY: this._state.y,\n\t\t\tscreenX: this._state.x,\t/// TODO: Handle page scrolling\n\t\t\tscreenY: this._state.y,\n\t\t\tpageX: this._state.x,\n\t\t\tpageY: this._state.y,\n\t\t\tpointerType: 'pen',\n\t\t\tpointerId: this._id,\n\t\t\tisPrimary: this._id === 1,\n\t\t\twidth: this._state.width,\n\t\t\theight: this._state.height,\n\t\t\ttiltX: this._state.tiltX,\n\t\t\ttiltY: this._state.tiltY,\n\t\t\tpressure: this._state.pressure\n// \t\t\ttarget: document.elementFromPoint(this._state.x, this._state.y),\t// works with viewport coords\n\t\t});\n\t\treturn ev;\n\t}\n\n\t// 🖑method private_asMouseEvent(evType: String): PointerEvent\n\t// Returns an instance of `PointerEvent` representing the current state of the finger\n\t_asMouseEvent(evType) {\n\t\tvar ev;\n\t\tif (capabilities.mouseEventConstructor) {\n\t\t\tev = new MouseEvent('mouse' + evType, {\n\t\t\t\tbubbles: true,\n\t\t\t\tbutton: 0,\t// Moz doesn't use -1 when no buttons are pressed, WTF?\n\t\t\t\tbuttons: this._state.down ? 1 : 0,\n\t\t\t\tdetail: (evType === 'down' || evType === 'up') ? 1 : 0,\t// TODO: count consecutive clicks\n\t\t\t\tclientX: this._state.x,\n\t\t\t\tclientY: this._state.y,\n\t\t\t\tscreenX: this._state.x,\t/// TODO: Handle page scrolling\n\t\t\t\tscreenY: this._state.y,\n\t\t\t\tpageX: this._state.x,\n\t\t\t\tpageY: this._state.y,\n\t// \t\t\ttarget: document.elementFromPoint(this._state.x, this._state.y),\t// works with viewport coords\n\t\t\t});\n\t\t} else {\n\t\t\t// For legacy browsers and PhantomJS\n\t\t\tev = document.createEvent('MouseEvent');\n\t\t\tev.initMouseEvent(\n\t\t\t\t'mouse' + evType,\t// Type\n\t\t\t\ttrue,\t// canBubble\n\t\t\t\ttrue,\t// cancellable\n\t\t\t\twindow,\t// view\n\t\t\t\t0,\t// detail\n\t\t\t\tthis._state.x,\t// screenX\n\t\t\t\tthis._state.y,\t// screenY\n\t\t\t\tthis._state.x,\t// clientX\n\t\t\t\tthis._state.y,\t// clientY\n\t\t\t\tfalse,\t// ctrlKey\n\t\t\t\tfalse,\t// altKey\n\t\t\t\tfalse,\t// shiftKey\n\t\t\t\tfalse,\t// metaKey\n\t\t\t\t0,\t// button\n\t\t\t\tnull\t// relatedTarget\n\t\t\t);\n\t\t}\n\t\treturn ev;\n\t}\n\n\n\t// Inits this._graphic to be a SVG circle.\n\t_initGraphicCircle() {\n\n\t\tthis._graphic = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\t\tthis._graphic.style.height = '50px';\n\t\tthis._graphic.style.width = '50px';\n\t\tthis._graphic.style.zIndex = 1000000;\t// Some ridiculously high value\n\t\tthis._graphic.style.position = 'absolute';\n\t\tthis._graphic.style.top = 0;\n\t\tthis._graphic.style.left = 0;\n\t\tthis._graphic.style.marginLeft = '-25px';\n\t\tthis._graphic.style.marginTop = '-25px';\n\t\tthis._graphic.style.pointerEvents = 'none';\n\n\t\tvar circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n\t\tcircle.cx.baseVal.value = 25;\n\t\tcircle.cy.baseVal.value = 25;\n\t\tcircle.r.baseVal.value = 20;\n\t\tcircle.style.stroke = 'rgba(0,0,0,0.3)';\n\t\tcircle.style.strokeWidth = 2;\n\t\tcircle.style.fill = 'rgba(0,0,0,0.1)';\n\n\t\tthis._graphic.appendChild(circle);\n\n\t\tthis._graphic.style.display = 'none';\n\t\tdocument.body.appendChild(this._graphic);\n\t}\n\n\t// Inits this._graphic to be an image of Ivan's index finger\n\t_initGraphicIvansFinger() {\n\n\t\tthis._graphic = document.createElement('img');\n\t\tthis._graphic.src = IvansFinger;\n\t\tthis._graphic.style.height = '160px';\n\t\tthis._graphic.style.width = '160px';\n\t\tthis._graphic.style.zIndex = 1000000;\t// Some ridiculously high value\n\t\tthis._graphic.style.position = 'absolute';\n\t\tthis._graphic.style.top = 0;\n\t\tthis._graphic.style.left = 0;\n\t\tthis._graphic.style.marginLeft = '-20px';\n\t\tthis._graphic.style.marginTop = '-20px';\n\t\tthis._graphic.style.pointerEvents = 'none';\n\n\t\tthis._graphic.style.display = 'none';\n\t\tdocument.body.appendChild(this._graphic);\n\t}\n\n\t_setGraphicPosition(x, y) {\n\t\t// Borrowed from Leaflet code\n\t\tthis._graphic.style.transform = 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n\t}\n\n\n\t// Simple, non-deep comparison of hashmaps, used for comparing internal finger states.\n\t// Returns `false` when one of the properties of s1 differs from the same property\n\t// of s2 (or s2 doesn't have it). It ignores if s1 doesn't have all properties from\n\t// s2.\n\t_statesAreEqual(s1, s2) {\n\t\tfor (var i in s1) {\n\t\t\tif (s1[i] !== s2[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n}\n\n\n\n\n\n\n\n","\n// Detects some browser capabilities. Only for internal use, not exposed to the\n// API user.\n\n\n\n// eventConstructors\n// `true` if the browser can run `new Event()`.\n// If `false`, then the library will resort to the (deprecated) `window.createEvent()`\n// and `event.initMouseEvent()`. This is needed for legacy browsers and PhantomJS.\nexport var eventConstructors = true;\n\ntry {\n\tvar foo = new Touch({ identifier: 0, target: document });\n// \tvar foo = new MouseEvent();\n} catch(e) {\n\teventConstructors = false;\n}\n\n// mouseEventConstructor, for MouseEvent\nexport var mouseEventConstructor = true;\n\ntry {\n\tvar foo = new MouseEvent('mousedown');\n} catch(e) {\n\tmouseEventConstructor = false;\n}\n\n\n// touchConstructor, for Touch\nexport var touchConstructor = true;\n\ntry {\n\tvar foo = new Touch({ identifier: 0, target: document });\n} catch(e) {\n\ttouchConstructor = false;\n}\n\n\n// touchEventConstructor, for TouchEvent\n// Weirdly, Safari on iOS has Touch constructor but no TouchEvent constructor.\nexport var touchEventConstructor = true;\n\ntry {\n\tvar foo = new TouchEvent('touchdown')\n} catch(e) {\n\ttouchEventConstructor = false;\n}\n\n\n// pointerEventConstructor, for PointerEvent\nexport var pointerEventConstructor = true;\n\ntry {\n\tvar foo = new PointerEvent('pointerdown');\n} catch(e) {\n\tpointerEventConstructor = false;\n}\n\n\n// mouse: `true` if the browser implements `MouseEvent`\nexport var mouse = !!('MouseEvent' in window);\n\n// touch: `true` if the browser implements `TouchEvent`\nexport var touch = !!('TouchEvent' in window);\n\n// pointer: `true` if the browser implements `PointerEvent`\nexport var pointer = !!('PointerEvent' in window);\n\n\n\n\n// Some bits borrowed from Leaflet's L.Browser\n\nvar ua = navigator.userAgent.toLowerCase(),\n ie = 'ActiveXObject' in window,\n webkit = ua.indexOf('webkit') !== -1,\n phantomjs = ua.indexOf('phantom') !== -1,\n android23 = ua.search('android [23]') !== -1,\n chrome = ua.indexOf('chrome') !== -1,\n gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie;\n\nexport var phantomjs = phantomjs;\nexport var ie = ie;\nexport var ielt9 = ie && !document.addEventListener;\nexport var edge = 'msLaunchUri' in navigator && !('documentMode' in document);\nexport var webkit = webkit;\nexport var gecko = gecko;\nexport var android = ua.indexOf('android') !== -1;\nexport var android23 = android23;\nexport var chrome = chrome;\nexport var safari = !chrome && !phantomjs && ua.indexOf('safari') !== -1;\n","export default 'data:image/png;base64,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'"],"names":["enums.FASTFRAME","enums.FRAME","enums.INSTANT","enums.MINIMAL","enums.INTERVAL","capabilities.safari","capabilities.touchEventConstructor","capabilities.mouseEventConstructor","capabilities.gecko","capabilities.chrome","capabilities.touchConstructor","capabilities.mouse","capabilities.pointer","capabilities.touch"],"mappings":"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"}