docs: function extendEventData(ev) {
      var startEv = this.current.startEvent;
  
      // if the touches change, set the new touches over the startEvent touches
      // this because touchevents don't have all the touches on touchstart, or the
      // user must place his fingers at the EXACT same time on the screen, which is not realistic
      // but, sometimes it happens that both fingers are touching at the EXACT same time
      if(startEv && (ev.touches.length != startEv.touches.length || ev.touches === startEv.touches)) {
        // extend 1 level deep to get the touchlist with the touch objects
        startEv.touches = [];
        Hammer.utils.each(ev.touches, function(touch) {
          startEv.touches.push(Hammer.utils.extend({}, touch));
        });
      }
  
      var delta_time = ev.timeStamp - startEv.timeStamp
        , delta_x = ev.center.pageX - startEv.center.pageX
        , delta_y = ev.center.pageY - startEv.center.pageY
        , velocity = Hammer.utils.getVelocity(delta_time, delta_x, delta_y)
        , interimAngle
        , interimDirection;
  
      // end events (e.g. dragend) don't have useful values for interimDirection & interimAngle
      // because the previous event has exactly the same coordinates
      // so for end events, take the previous values of interimDirection & interimAngle
      // instead of recalculating them and getting a spurious '0'
      if(ev.eventType === 'end') {
        interimAngle = this.current.lastEvent && this.current.lastEvent.interimAngle;
        interimDirection = this.current.lastEvent && this.current.lastEvent.interimDirection;
      }
      else {
        interimAngle = this.current.lastEvent && Hammer.utils.getAngle(this.current.lastEvent.center, ev.center);
        interimDirection = this.current.lastEvent && Hammer.utils.getDirection(this.current.lastEvent.center, ev.center);
      }
  
      Hammer.utils.extend(ev, {
        deltaTime: delta_time,
  
        deltaX: delta_x,
        deltaY: delta_y,
  
        velocityX: velocity.x,
        velocityY: velocity.y,
  
        distance: Hammer.utils.getDistance(startEv.center, ev.center),
  
        angle: Hammer.utils.getAngle(startEv.center, ev.center),
        interimAngle: interimAngle,
  
        direction: Hammer.utils.getDirection(startEv.center, ev.center),
        interimDirection: interimDirection,
  
        scale: Hammer.utils.getScale(startEv.touches, ev.touches),
        rotation: Hammer.utils.getRotation(startEv.touches, ev.touches),
  
        startEvent: startEv
      });
  
      return ev;
    }