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>
const int INF = 1 << 30;
using namespace std;
typedef struct {
  double x;
  double y;
} POINT;
POINT result[302];
POINT a[302];
int n, top;
double Distance(POINT p1, POINT p2) {
  return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
double Multiply(POINT p1, POINT p2, POINT p3) {
  return ((p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x));
}
int Compare(const void *p1, const void *p2) {
  POINT *p3, *p4;
  double m;
  p3 = (POINT *)p1;
  p4 = (POINT *)p2;
  m = Multiply(a[0], *p3, *p4);
  if (m < 0)
    return 1;
  else if (m == 0 && (Distance(a[0], *p3) < Distance(a[0], *p4)))
    return 1;
  else
    return -1;
}
void Tubao() {
  int i;
  result[0].x = a[0].x;
  result[0].y = a[0].y;
  result[1].x = a[1].x;
  result[1].y = a[1].y;
  result[2].x = a[2].x;
  result[2].y = a[2].y;
  top = 2;
  for (i = 3; i <= n; i++) {
    while (Multiply(result[top - 1], result[top], a[i]) <= 0 && top > 2) top--;
    result[top + 1].x = a[i].x;
    result[top + 1].y = a[i].y;
    top++;
  }
}
double area(POINT i, POINT j, POINT k, POINT l) {
  double a = Distance(i, j);
  double b = Distance(j, k);
  double c = Distance(k, l);
  double d = Distance(l, i);
  double e = Distance(i, k);
  double p1 = (a + b + e) / 2.0;
  double p2 = (c + d + e) / 2.0;
  double ret = sqrt(p1 * (p1 - a) * (p1 - b) * (p1 - e));
  ret += sqrt(p2 * (p2 - c) * (p2 - d) * (p2 - e));
  return ret;
}
int main() {
  int i, p;
  double px, py, len, temp, ans;
  while (scanf("%d", &n) != EOF) {
    ans = 0.0;
    for (i = 0; i < n; i++) scanf("%lf %lf", &a[i].x, &a[i].y);
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        double m1 = -INF, m2 = -INF;
        for (int k = 0; k < n; k++) {
          if (k != i && k != j) {
            double t = (a[j].x - a[i].x) * (a[k].y - a[i].y) -
                       (a[k].x - a[i].x) * (a[j].y - a[i].y);
            if (t < 0)
              m1 = max(m1, -t);
            else
              m2 = max(m2, t);
          }
        }
        ans = max(ans, m1 + m2);
      }
    }
    printf("%lf\n", ans / 2.0);
  }
  return 0;
}