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;
void error_exit(int error = 0) {
  switch (error) {
    case 0:
      exit(0);
      break;
    case 3:
      cout << "BRUM BRUM BRUM\n";
      break;
    case 1: {
      while (47) {
      };
    } break;
    case 2:
      exit(47);
      break;
  }
}
const long long INF = 1000 * 1000 * 1000;
const double EPS = 1e-9;
template <class Templ>
bool operator<(const complex<Templ> &a, const complex<Templ> &b) {
  if (real(a) != real(b))
    return real(a) < real(b);
  else
    return imag(a) < imag(b);
}
template <class Templ>
bool operator>(const complex<Templ> &a, const complex<Templ> &b) {
  if (real(a) != real(b))
    return real(a) > real(b);
  else
    return imag(a) > imag(b);
}
template <class Templ>
struct comp_complex {
  bool operator()(const complex<Templ> &a, const complex<Templ> &b) const {
    return a < b;
  }
};
template <typename T>
int sgn(T val) {
  return (T(0) < val) - (val < T(0));
}
long long cross(complex<long long> a, complex<long long> b,
                complex<long long> c) {
  complex<long long> x = b - a;
  complex<long long> y = c - a;
  return real(x) * imag(y) - real(y) * imag(x);
}
int main() {
  int N;
  cin >> N;
  vector<complex<long long> > a(N);
  for (long long i = 0; i < static_cast<long long>(N); ++i) {
    long long x, y;
    cin >> x >> y;
    a[i] = complex<long long>(x, y);
  }
  long long max_global = 0;
  for (long long i = 0; i < static_cast<long long>(N); ++i)
    for (long long j = 0; j < static_cast<long long>(N); ++j)
      if (i < j) {
        long long mins = 0, maxs = 0;
        for (long long k = 0; k < static_cast<long long>(N); ++k)
          if (k != i && k != j) {
            mins = min(mins,
                       static_cast<__typeof__(mins)>(cross(a[i], a[j], a[k])));
            maxs = max(maxs,
                       static_cast<__typeof__(maxs)>(cross(a[i], a[j], a[k])));
          }
        if (mins < 0 && maxs > 0)
          max_global = max(max_global,
                           static_cast<__typeof__(max_global)>(-mins + maxs));
      }
  if (max_global & 1)
    cout << max_global / 2 << ".5" << endl;
  else
    cout << max_global / 2 << endl;
}