docs: function (pointer, event, eventTarget, curEventTarget, forceAction) {
              if (!forceAction && !this.inertiaStatus.active && this.pointerWasMoved && this.prepared.name) {
                  this.checkAndPreventDefault(event, this.target, this.element);
  
                  return;
              }
  
              this.pointerIsDown = true;
              this.downEvent = event;
  
              var pointerIndex = this.addPointer(pointer),
                  action;
  
              // If it is the second touch of a multi-touch gesture, keep the
              // target the same and get a new action if a target was set by the
              // first touch
              if (this.pointerIds.length > 1 && this.target._element === this.element) {
                  var newAction = validateAction(forceAction || this.target.getAction(pointer, event, this, this.element), this.target);
  
                  if (withinInteractionLimit(this.target, this.element, newAction)) {
                      action = newAction;
                  }
  
                  this.prepared.name = null;
              }
              // Otherwise, set the target if there is no action prepared
              else if (!this.prepared.name) {
                  var interactable = interactables.get(curEventTarget);
  
                  if (interactable
                      && !testIgnore(interactable, curEventTarget, eventTarget)
                      && testAllow(interactable, curEventTarget, eventTarget)
                      && (action = validateAction(forceAction || interactable.getAction(pointer, event, this, curEventTarget), interactable, eventTarget))
                      && withinInteractionLimit(interactable, curEventTarget, action)) {
                      this.target = interactable;
                      this.element = curEventTarget;
                  }
              }
  
              var target = this.target,
                  options = target && target.options;
  
              if (target && (forceAction || !this.prepared.name)) {
                  action = action || validateAction(forceAction || target.getAction(pointer, event, this, curEventTarget), target, this.element);
  
                  this.setEventXY(this.startCoords, this.pointers);
  
                  if (!action) { return; }
  
                  if (options.styleCursor) {
                      target._doc.documentElement.style.cursor = getActionCursor(action);
                  }
  
                  this.resizeAxes = action.name === 'resize'? action.axis : null;
  
                  if (action === 'gesture' && this.pointerIds.length < 2) {
                      action = null;
                  }
  
                  this.prepared.name  = action.name;
                  this.prepared.axis  = action.axis;
                  this.prepared.edges = action.edges;
  
                  this.snapStatus.snappedX = this.snapStatus.snappedY =
                      this.restrictStatus.restrictedX = this.restrictStatus.restrictedY = NaN;
  
                  this.downTimes[pointerIndex] = new Date().getTime();
                  this.downTargets[pointerIndex] = eventTarget;
                  pointerExtend(this.downPointer, pointer);
  
                  copyCoords(this.prevCoords, this.startCoords);
                  this.pointerWasMoved = false;
  
                  this.checkAndPreventDefault(event, target, this.element);
              }
              // if inertia is active try to resume action
              else if (this.inertiaStatus.active
                  && curEventTarget === this.element
                  && validateAction(target.getAction(pointer, event, this, this.element), target).name === this.prepared.name) {
  
                  cancelFrame(this.inertiaStatus.i);
                  this.inertiaStatus.active = false;
  
                  this.checkAndPreventDefault(event, target, this.element);
              }
          }