docs: function touchcancelHandler(event) {
  
    if (Object.keys(gestures).length == 2) {
      var elements = []
      for (var p in gestures) {
        elements.push(gestures[p].element)
      }
      fireEvent(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
        touches: slice.call(event.touches),
        touchEvent: event
      })
    }
  
    for (var i = 0; i < event.changedTouches.length; i++) {
      var touch = event.changedTouches[i]
      var id = touch.identifier
      var gesture = gestures[id]
  
      if (!gesture) {
        continue
      }
  
      if (gesture.pressingHandler) {
        clearTimeout(gesture.pressingHandler)
        gesture.pressingHandler = null
      }
  
      if (gesture.status === 'panning') {
        fireEvent(gesture.element, 'panend', {
          touch: touch,
          touches: event.touches,
          changedTouches: event.changedTouches,
          touchEvent: event
        })
      }
      if (gesture.status === 'pressing') {
        fireEvent(gesture.element, 'pressend', {
          touch: touch,
          touchEvent: event
        })
      }
      delete gestures[id]
    }
  
    if (Object.keys(gestures).length === 0) {
      docEl.removeEventListener('touchmove', touchmoveHandler, false)
      docEl.removeEventListener('touchend', touchendHandler, false)
      docEl.removeEventListener('touchcancel', touchcancelHandler, false)
    }
  }