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 JAVA):

Solution:
import java.util.*;

public class ChickenPen {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		vector[] a = new vector[n];
		for (int i = 0; i < n; i++)
			a[i] = new vector(in.nextInt(), in.nextInt());
		double ans = 0;
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				double maxu = 0;
				double maxd = 0;
				for (int k = 0; k < n; k++) {
					vector x = a[i].sub(a[j]);
					vector y = a[i].sub(a[k]);
					double d = x.cross(y);
					double r = area(a[i], a[j], a[k]);
					if (d < 0)
						maxd = Math.max(maxd, r);
					if (d > 0)
						maxu = Math.max(maxu, r);
				}
				if(maxd > 0 && maxu > 0)
					ans = Math.max(maxd + maxu, ans);
			}
		}
		System.out.println(ans);
	}

	static double area(vector a, vector b, vector c) {
		return Math.abs((double)(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y))/2);
	}

	public static class vector {
		double x;
		double y;

		public vector(double xv, double yv) {
			x = xv;
			y = yv;
		}

		// Returns distance between 2 points or magnitude of the //difference of
		// 2 vectors.
		public double dist(vector b) {
			double dist = Math.sqrt((x - b.x) * (x - b.x) + (y - b.y) * (y - b.y));
			return dist;
		}

		// Rotates a vector clockwise by theta radians.
		public vector rotate(double theta) {
			double nx = x * Math.cos(theta) - y * Math.sin(theta);
			double ny = x * Math.sin(theta) + y * Math.cos(theta);
			return new vector(nx, ny);
		}

		// Returns cross product of 2 vectors. Can be used to tell //whether a
		// point is to the left or the right of a vector //(positive means it’s
		// to the left and negative means it’s //to the right).
		public double cross(vector b) {
			return x * b.y - y * b.x;
		}

		// Adds two vectors.
		public vector add(vector b) {
			return new vector(x + b.x, y + b.y);
		}

		// Subtracts two vectors or turns 2 points into a vector.
		public vector sub(vector b) {
			return new vector(x - b.x, y - b.y);
		}

		// Finds angle between two vectors in radians(-pi to pi).
		double angle(vector p) {
			double cos = dot(p) / (mag() * p.mag());
			return Math.acos(cos);
		}

		// Finds dot product of a vector
		double dot(vector p) {
			return x * p.x + y * p.y;
		}

		// Returns magnitude of a vector.
		double mag() {
			return Math.sqrt(x * x + y * y);
		}

		// scales a vector
		vector scale(double s) {
			return new vector(x * s, y * s);
		}

		// gives vector a magnitude of 1
		vector unit() {
			return new vector(x / mag(), y / mag());
		}

		// toString method for debugging purposes
		public String toString() {
			return "|" + x + ", " + y + "|";
		}
	}
}