Problem: In a far away kingdom lives a very greedy king. To defend his land, he built n guard towers. Apart from the towers the kingdom has two armies, each headed by a tyrannical and narcissistic general. The generals can't stand each other, specifically, they will never let soldiers of two armies be present in one tower.

During defence operations to manage a guard tower a general has to send part of his army to that tower. Each general asks some fee from the king for managing towers. As they live in a really far away kingdom, each general evaluates his fee in the following weird manner: he finds two remotest (the most distant) towers, where the soldiers of his army are situated and asks for the fee equal to the distance. Each tower is represented by a point on the plane with coordinates (x, y), and the distance between two points with coordinates (x1, y1) and (x2, y2) is determined in this kingdom as |x1 - x2| + |y1 - y2|.

The greedy king was not exactly satisfied with such a requirement from the generals, that's why he only agreed to pay one fee for two generals, equal to the maximum of two demanded fees. However, the king is still green with greed, and among all the ways to arrange towers between armies, he wants to find the cheapest one. Each tower should be occupied by soldiers of exactly one army.

He hired you for that. You should find the minimum amount of money that will be enough to pay the fees. And as the king is also very scrupulous, you should also count the number of arrangements that will cost the same amount of money. As their number can be quite large, it is enough for the king to know it as a remainder from dividing by 109 + 7.

Two arrangements are distinct if the sets of towers occupied by soldiers of the first general are distinct.

Input

The first line contains an integer n (2 ≤ n ≤ 5000), n is the number of guard towers. Then follow n lines, each of which contains two integers x, y — the coordinates of the i-th tower (0 ≤ x, y ≤ 5000). No two towers are present at one point.

Pretest 6 is one of the maximal tests for this problem.

Output

Print on the first line the smallest possible amount of money that will be enough to pay fees to the generals. 

Print on the second line the number of arrangements that can be carried out using the smallest possible fee. This number should be calculated modulo 1000000007 (109 + 7).

Examples

Input

2
0 0
1 1


Output

0
2


Input

4
0 0
0 1
1 0
1 1


Output

1
4


Input

3
0 0
1000 1000
5000 5000


Output

2000
2

Note

In the first example there are only two towers, the distance between which is equal to 2. If we give both towers to one general, then we well have to pay 2 units of money. If each general receives a tower to manage, to fee will be equal to 0. That is the smallest possible fee. As you can easily see, we can obtain it in two ways.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int inf = 987654321;
const long long int INF = 123456789987654321;
const long long int mod = 1000000007;
vector<long long int> pw;
void get_pw() {
  pw.resize(10000);
  pw[0] = 1;
  for (int i = 1; i < 10000; i++) {
    pw[i] = pw[i - 1] * 2 % mod;
  }
}
int N;
vector<pair<int, int> > P;
pair<int, int> bottom_left;
int bottom_left_sum;
void get_bottom_left() {
  bottom_left = pair<int, int>(inf, inf);
  for (int i = 0; i < N; i++) {
    if (bottom_left.first + bottom_left.second > P[i].first + P[i].second) {
      bottom_left = P[i];
    }
  }
  bottom_left_sum = bottom_left.first + bottom_left.second;
}
vector<pair<int, int> > tmp;
int get_max_dist() {
  int ret = -inf;
  int maxi = -inf, mini = inf;
  for (int i = 0; i < tmp.size(); i++) {
    maxi = max(maxi, tmp[i].second + tmp[i].first);
    mini = min(mini, tmp[i].second + tmp[i].first);
  }
  ret = max(ret, maxi - mini);
  maxi = -inf, mini = inf;
  for (int i = 0; i < tmp.size(); i++) {
    maxi = max(maxi, tmp[i].second - tmp[i].first);
    mini = min(mini, tmp[i].second - tmp[i].first);
  }
  ret = max(ret, maxi - mini);
  return ret;
}
bool f(int x) {
  int maxi = -inf, mini = inf;
  for (int i = 0; i < N; i++) {
    if (P[i].second + P[i].first > bottom_left_sum + x) continue;
    maxi = max(maxi, P[i].second - P[i].first);
    mini = min(mini, P[i].second - P[i].first);
  }
  if (1) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + x ||
          P[i].second - P[i].first > mini + x) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= x) return true;
  }
  if (2) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + x ||
          P[i].second - P[i].first < maxi - x) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= x) return true;
  }
  return false;
}
int ans;
long long int ans_cnt;
vector<int> left1, right1, left2, right2;
void get_ans_cnt() {
  int maxi = -inf, mini = inf;
  for (int i = 0; i < N; i++) {
    if (P[i].second + P[i].first > bottom_left_sum + ans) continue;
    maxi = max(maxi, P[i].second - P[i].first);
    mini = min(mini, P[i].second - P[i].first);
  }
  if (1) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + ans ||
          P[i].second - P[i].first > mini + ans) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= ans) {
      int maxi2 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi2 = max(maxi2, tmp[i].second + tmp[i].first);
      }
      maxi2 = max(maxi2, bottom_left_sum + ans);
      int maxi3 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi3 = max(maxi3, tmp[i].second - tmp[i].first);
      }
      int mini2 = inf;
      for (int i = 0; i < tmp.size(); i++) {
        mini2 = min(mini2, tmp[i].second - tmp[i].first);
      }
      if (mini2 < mini) {
        maxi3 = mini2 + ans;
      } else {
        maxi3 = max(maxi3, mini + ans);
      }
      int cnt = 0;
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first <= bottom_left_sum + ans &&
            P[i].second - P[i].first <= mini + ans) {
          if (maxi2 >= P[i].second + P[i].first &&
              P[i].second + P[i].first >= maxi2 - ans) {
            if (maxi3 >= P[i].second - P[i].first &&
                P[i].second - P[i].first >= maxi3 - ans)
              cnt++;
          }
        }
      }
      ans_cnt += pw[cnt];
      ans_cnt %= mod;
      for (int i = 0; i < N; i++) {
        if (maxi2 >= P[i].second + P[i].first &&
            P[i].second + P[i].first >= maxi2 - ans) {
          if (maxi3 >= P[i].second - P[i].first &&
              P[i].second - P[i].first >= maxi3 - ans)
            continue;
        }
        left1.push_back(i);
      }
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first > bottom_left_sum + ans ||
            P[i].second - P[i].first > mini + ans) {
          right1.push_back(i);
        }
      }
    }
  }
  if (2) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + ans ||
          P[i].second - P[i].first < maxi - ans) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= ans) {
      int maxi2 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi2 = max(maxi2, tmp[i].second + tmp[i].first);
      }
      int mini2 = inf;
      for (int i = 0; i < tmp.size(); i++) {
        mini2 = min(mini2, tmp[i].second - tmp[i].first);
      }
      int maxi3 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi3 = max(maxi3, tmp[i].second - tmp[i].first);
      }
      if (maxi < maxi3) {
        mini2 = maxi3 - ans;
      } else {
        mini2 = min(mini2, maxi - ans);
      }
      int cnt = 0;
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first <= bottom_left_sum + ans &&
            P[i].second - P[i].first >= maxi - ans) {
          if (maxi2 >= P[i].second + P[i].first &&
              P[i].second + P[i].first >= maxi2 - ans) {
            if (mini2 <= P[i].second - P[i].first &&
                P[i].second - P[i].first <= mini2 + ans)
              cnt++;
          }
        }
      }
      for (int i = 0; i < N; i++) {
        if (maxi2 >= P[i].second + P[i].first &&
            P[i].second + P[i].first >= maxi2 - ans) {
          if (mini2 <= P[i].second - P[i].first &&
              P[i].second - P[i].first <= mini2 + ans)
            continue;
        }
        left2.push_back(i);
      }
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first > bottom_left_sum + ans ||
            P[i].second - P[i].first < maxi - ans) {
          right2.push_back(i);
        }
      }
      int ok = 1;
      if (left1.size() != left2.size() || right1.size() != right2.size())
        ok = 0;
      else {
        for (int i = 0; i < left1.size(); i++) {
          if (left1[i] != left2[i]) {
            ok = 0;
            break;
          }
        }
        for (int i = 0; i < right1.size(); i++) {
          if (right1[i] != right2[i]) {
            ok = 0;
            break;
          }
        }
      }
      if (ok) return;
      ans_cnt += pw[cnt];
      ans_cnt %= mod;
    }
  }
}
int main() {
  get_pw();
  scanf("%d", &N);
  P.resize(N);
  for (int i = 0; i < N; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    P[i] = pair<int, int>(x, y);
  }
  get_bottom_left();
  int s = 0, e = 10000;
  while (s <= e) {
    int m = (s + e) >> 1;
    if (f(m)) {
      ans = m;
      e = m - 1;
    } else
      s = m + 1;
  }
  printf("%d\n", ans);
  get_ans_cnt();
  printf("%I64d", ans_cnt * 2 % mod);
}