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.lang.*;
import java.io.*;

	public class FastIO{
			
		BufferedReader br;
		StringTokenizer st;
		
		public FastIO(){ // constructor
			
			br = new BufferedReader(new InputStreamReader(System.in));
		}
		
		String next(){
			
			while (st == null || !st.hasMoreElements()){
				try{
					st = new StringTokenizer(br.readLine());
				}
				
				catch (IOException e){
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}
		
		int nextInt(){
			
			return Integer.parseInt(next());
		}
		
		long nextLong(){
			
			return Long.parseLong(next());
		}
		
		double nextDouble(){
			return Double.parseDouble(next());
		}

		String nextLine(){
			
			String str = "";
			try{
				
				str = br.readLine();
			}
			catch (IOException e){
				
				e.printStackTrace();
			}
			return str;
		}
		
		static void sort(int[] arr){
			
	        int n = arr.length;
	        
	        Random rnd = new Random();
	        
	        for(int i = 0; i < n; ++i){
	        	
	            int tmp = arr[i];
	            int randomPos = i + rnd.nextInt(n - i);
	            arr[i] = arr[randomPos];
	            arr[randomPos] = tmp;
	        }
	        
	        Arrays.sort(arr);
	   }

	public static void main(String[] args) throws Exception{
		
		FastIO in = new FastIO();
		PrintWriter out = new PrintWriter(System.out);
		
		int n = in.nextInt();
		Points[] point = new Points[n];
		
		for(int i = 0; i < n; i++) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			point[i] = new Points(x, y);
		}
		
		double max = 0;
		
		for(int i = 0; i < n; i++) {
			for(int j = i + 1; j < n; j++) {
				
				Points a = point[i];
				Points b = point[j];
				
				double neg = 0, pos = 0;
				for(int k = 0; k < n; k++) {
					if(k != i && k != j) {
						
						Points c = point[k];
						
						neg = Math.min(neg, crossProduct(a, b, c));
						pos = Math.max(pos, crossProduct(a, b, c));
					}
				}
				if(neg < 0 && pos > 0) {
					max = Math.max(max, pos - neg);
				}
			}
		}
		
		out.println(max);
		
		out.flush();
		out.close();
	}
	
	static class Points{
		int x, y;
		Points(int x, int y){
			this.x = x;
			this.y = y;
		}
	}
	
	static double crossProduct(Points a, Points b, Points c) {
		return ((a.x * b.y - b.x * a.y) + (b.x * c.y - c.x * b.y) + (c.x * a.y - c.y * a.x)) / 2.0;
	}
}