Problem: Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral. 

Input

The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide. 

Output

Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.

Examples

Input

5
0 0
0 4
4 0
4 4
2 3


Output

16.000000

Note

In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <typename so>
void r(so &x) {
  x = 0;
  char c;
  long long dem = 0;
  for (c = getchar(); c < '0' || c > '9'; c = getchar()) {
    dem++;
    if (dem == 100) return;
  }
  for (; c >= '0' && c <= '9'; c = getchar()) {
    x = x * 10 + c - '0';
  }
}
const int MaxN = 301;
int n;
struct Poll {
  int x;
  int y;
};
Poll a[MaxN];
int dt[MaxN][MaxN][MaxN];
vector<Poll> gg(4);
void tinh(int &s, Poll A, Poll B, Poll C) {
  gg[0] = gg[3] = A;
  gg[1] = B;
  gg[2] = C;
  for (int i = 0; i < 3; i++) {
    s += (gg[i + 1].x - gg[i].x) * (gg[i].y + gg[i + 1].y);
  }
  s = abs(s);
}
struct Line {
  long long a;
  long long b;
  long long c;
};
vector<int> Side[MaxN][MaxN][2];
Line K;
void makeline(Poll A, Poll B) {
  K.a = A.y - B.y;
  K.b = B.x - A.x;
  K.c = 0 - (K.a * A.x + K.b * A.y);
}
int check(Poll A, Poll B, Line F) {
  long long ans = (F.a * A.x + F.b * A.y + F.c) * (F.a * B.x + F.b * B.y + F.c);
  if (ans == 0) {
    return -1;
  }
  if (ans > 0) {
    return 1;
  } else
    return 0;
}
void input() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i].x >> a[i].y;
  }
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (j == k || k == i) continue;
        tinh(dt[i][j][k], a[i], a[j], a[k]);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      int id = 0;
      for (int k = 0; k < n; k++) {
        if (k != i && k != j) {
          id = k;
          Side[i][j][0].push_back(k);
          break;
        }
      }
      makeline(a[i], a[j]);
      for (int k = id + 1; k < n; k++) {
        if (i == k || j == k) continue;
        int ca = check(a[id], a[k], K);
        if (ca == 1) {
          Side[i][j][0].push_back(k);
        } else if (ca == 0) {
          Side[i][j][1].push_back(k);
        }
      }
    }
  }
  int gtln = 0;
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      int gtln1 = 0;
      int gtln2 = 0;
      if (Side[i][j][0].size() == 0 || Side[i][j][1].size() == 0) continue;
      for (auto x : Side[i][j][0]) {
        gtln1 = max(gtln1, dt[i][j][x]);
      }
      for (auto x : Side[i][j][1]) {
        gtln2 = max(gtln2, dt[i][j][x]);
      }
      gtln = max(gtln, gtln1 + gtln2);
    }
  }
  cout << setprecision(6) << fixed << double(gtln) / double(2) << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  input();
}