anchor.diff:    // finish point node
     Node := AllocateHeuristedNode(Params.Finish.X, Params.Finish.Y);
     Node.NodeInfo := FLAG_KNOWN_PATH or FLAG_ATTAINABLE;
  +  FinishNode := Node;
   
     // each start point find algorithm
     FoundPaths := Params.StartsCount;
     StartPoint := FActualInfo.Starts.Buffer.Memory;
  -  AttainableAlgorithm := (FoundPaths <> 0) or (Self.FCaching);
  +  AttainableAlgorithm := (FoundPaths > 1) or (Self.FCaching);
     FailureNode.SortValue := SORTVALUE_LIMIT;
     FailureNode.Path := SORTVALUE_LIMIT;
     Cardinal(FailureNode.Coordinates) := High(Cardinal);
  
positive.code:   FinishSector: Byte;
    AttainableAlgorithm: Boolean;
    FoundPaths: NativeUInt;
    StartPoint: PCPFStart;
    FailureNode: TCPFNode;
    Node: PCPFNode;
  begin
    // test start points coordinates
    MapWidth := Self.Width;
  
negative.code:     procedure ReleaseAttainableNodes;
      procedure ReleaseHeuristedNodes;
      procedure ReleaseAllocatedNodes(const CleanupCells: Boolean);
      procedure CacheAttainableNodes(const StartPoint: PCPFStart; const FinishNode: PCPFNode);
      procedure FillAttainablePath(const StartPoint: PCPFStart);
      procedure FillFoundPath(const StartPoint: PCPFStart; const FinishNode: PCPFNode);
    {$ifdef CPFLIB}
    public
      procedure Destroy;
  