#include <bits/stdc++.h>
using namespace std;
typedef struct Point {
  long long x, y;
  Point() {}
  Point(long long x, long long y) : x(x), y(y) {}
  void read() { scanf("%I64d%I64d\n", &x, &y); }
  void out() { printf("%I64d %I64d\n", x, y); }
  Point operator-(Point b) { return Point(x - b.x, y - b.y); }
  bool operator==(const Point& b) const { return x == b.x && y == b.y; }
  bool operator!=(const Point& b) const { return !(*this == b); }
};
bool cmp(const Point& a, const Point& b) {
  return a.y < b.y || (a.y == b.y && a.x < b.x);
}
long long Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
int ConvexHull(Point* data, int n, Point* ch) {
  sort(data, data + n, cmp);
  int m = 0;
  for (int i = 0; i < n; i++) {
    while (m > 1 && Cross(data[i] - ch[m - 2], ch[m - 1] - ch[m - 2]) >= 0) m--;
    ch[m++] = data[i];
  }
  int k = m;
  for (int i = n - 2; i >= 0; i--) {
    while (m > k && Cross(data[i] - ch[m - 2], ch[m - 1] - ch[m - 2]) >= 0) m--;
    ch[m++] = data[i];
  }
  if (n >= 2) m--;
  return m;
}
long long ans = 0;
void getArea(Point a, Point b, Point c, Point d) {
  long long t;
  t = Cross(b - a, c - a) + Cross(c - a, d - a);
  ans = max(ans, t);
}
const int maxn = 10100;
Point data[maxn], ch[maxn];
int n, m;
void solve() {
  if (m == 3) {
    for (int i = 0; i < n; i++)
      if (data[i] != ch[0] && data[i] != ch[1] && data[i] != ch[2]) {
        getArea(ch[0], ch[1], ch[2], data[i]);
        getArea(ch[0], ch[1], data[i], ch[2]);
        getArea(ch[0], data[i], ch[1], ch[2]);
        getArea(data[i], ch[0], ch[1], ch[2]);
      }
  } else {
    for (int i = 0; i < m; i++)
      for (int j = i + 1; j < m; j++)
        for (int k = j + 1; k < m; k++)
          for (int q = k + 1; q < m; q++) getArea(ch[i], ch[j], ch[k], ch[q]);
  }
  printf("%.6lf\n", ans / 2.0);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) data[i].read();
  m = ConvexHull(data, n, ch);
  solve();
  return 0;
}
