Problem: Ksusha is a vigorous mathematician. She is keen on absolutely incredible mathematical riddles. 

Today Ksusha came across a convex polygon of non-zero area. She is now wondering: if she chooses a pair of distinct points uniformly among all integer points (points with integer coordinates) inside or on the border of the polygon and then draws a square with two opposite vertices lying in the chosen points, what will the expectation of this square's area be?

A pair of distinct points is chosen uniformly among all pairs of distinct points, located inside or on the border of the polygon. Pairs of points p, q (p ≠ q) and q, p are considered the same.

Help Ksusha! Count the required expectation.

Input

The first line contains integer n (3 ≤ n ≤ 105) — the number of vertices of Ksusha's convex polygon. Next n lines contain the coordinates of the polygon vertices in clockwise or counterclockwise order. The i-th line contains integers xi, yi (|xi|, |yi| ≤ 106) — the coordinates of the vertex that goes i-th in that order.

Output

Print a single real number — the required expected area. 

The answer will be considered correct if its absolute and relative error doesn't exceed 10 - 6.

Examples

Input

3
0 0
5 5
5 0


Output

4.6666666667


Input

4
-1 3
4 5
6 2
3 -5


Output

8.1583333333


Input

3
17 136
859 937
16 641


Output

66811.3704155169

Solution (in JAVA):

Solution:
import java.util.*;

public class D {
	private static Scanner in;

	public void run() {
		int n = in.nextInt();
		int s = 0;
		int[] x = new int[n + 1];
		int[] y = new int[n + 1];
		int xmin = Integer.MAX_VALUE;
		int xmax = Integer.MIN_VALUE;
		for (int i = 0; i < n; i++) {
			x[i] = in.nextInt() + s;
			y[i] = in.nextInt() + s;
			xmin = Math.min(xmin, x[i]);
			xmax = Math.max(xmax, x[i]);
		}
		x[n] = x[0];
		y[n] = y[0];
		double sx = 0;
		double sx2 = 0;
		double sy = 0;
		double sy2 = 0;
		double cnt = 0;
		int i = 0;
		while (x[i] != xmin) {
			i++;
		}
		int j = i;
		if (j == 0) j = n;
		double slope1 = (y[i + 1] - y[i]) * 1.0 / (x[i + 1] - x[i]);
		double slope2 = (y[j - 1] - y[j]) * 1.0 / (x[j - 1] - x[j]);
		for (int t = xmin; t <= xmax; t++) {
			if (t < xmax) {
				while (x[i + 1] <= t) {
					i++;
					if (i == n) {
						i = 0;
					}
					slope1 = (y[i + 1] - y[i]) * 1.0 / (x[i + 1] - x[i]);
				}
				while (x[j - 1] <= t) {
					j--;
					if (j == 0) {
						j = n;
					}
					slope2 = (y[j - 1] - y[j]) * 1.0 / (x[j - 1] - x[j]);
				}
			}
			double y1 = y[i] + (t - x[i]) * slope1;
			double y2 = y[j] + (t - x[j]) * slope2;
			if (y1 > y2) {
				double p = y1; y1 = y2; y2 = p;
			}
			double yFrom = Math.ceil(y1);
			double yTo = Math.floor(y2) + 1;
//			System.out.println(t + ": " + yFrom + ".." + yTo);
			double m = yTo - yFrom;
			cnt += m;
			sx += m * 1.0 * t;
			sx2 += m * 1.0 * t * t;
			sy += m * 0.5 * (yFrom + yTo - 1);
			sy2 += ((yTo - 1) * 1.0 * (yTo) * (2 * yTo - 1) - (yFrom - 1) * 1.0 * (yFrom) * (2 * yFrom - 1)) / 6;
		}
		double ans = (sx2 * cnt - sx * sx + sy2 * cnt - sy * sy) / cnt / (cnt - 1);
		System.out.println(ans);
	}

	public static void main(String[] args) {
		Locale.setDefault(Locale.US);
		in = new Scanner(System.in);
		new D().run();
		in.close();
	}
}