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.*;
import java.awt.geom.Line2D;
import java.io.*;
import java.lang.*;
import java.math.*;


public class B {

	public double sqr(int x1, int y1, int x2, int y2, int x3, int y3) {
		
		double res = (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1); 
		return Math.abs(res)/2.0;
	}
	
	public void run() {
		int n = nextInt();
		
		int[] xs = new int[n];
		int[] ys = new int[n];
		for (int i = 0; i < n; ++i) {
			xs[i] = nextInt();
			ys[i] = nextInt();
		}
		
		double ans = 0;
		for (int i = 0; i < n; ++i) {
			for (int j = i+1; j < n; ++j) {
				double sq1 = -1e9;
				double sq2 = -1e9;
				
				for (int k = 0; k < n; ++k) {
					if (i != k && j != k) {
						double sq = sqr(xs[i], ys[i], xs[j], ys[j], xs[k], ys[k]);
						if (Line2D.relativeCCW(xs[i], ys[i], xs[j], ys[j], xs[k], ys[k]) < 0) {
							if (sq > sq1) {
								sq1 = sq;
							}
						}
						else {
							if (sq > sq2) {
								sq2 = sq;
							}
						}
					}
				}
				
				if (sq1 + sq2 > ans && sq1 > 0 && sq2 > 0) {
					ans = sq1 + sq2;
				}
			}
		}
		out.printf(Locale.ENGLISH, "%.9f\n", ans);
		out.flush();
	}
	
	private static BufferedReader br = null;
	private static StringTokenizer stk = null;
	private static PrintWriter out = null;
	
	public static void main(String[] args) throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		out = new PrintWriter(System.out);
		(new B()).run();
	}
	
	private void loadLine() {
		try {
			stk = new StringTokenizer(br.readLine());
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private int nextInt() {
		while (stk==null || !stk.hasMoreElements()) loadLine();
		return Integer.parseInt(stk.nextToken());
	}
	
	private long nextLong() {
		while (stk==null || !stk.hasMoreElements()) loadLine();
		return Long.parseLong(stk.nextToken());
	}
	
	private double nextDouble() {
		while (stk==null || !stk.hasMoreElements()) loadLine();
		return Double.parseDouble(stk.nextToken());
	}
	
	private String nextWord() {
		while (stk==null || !stk.hasMoreElements()) loadLine();
		return (stk.nextToken());
	}
	


}