You are given an array a of length 2n. Consider a partition of array a into two subsequences p and q of length n each (each element of array a should be in exactly one subsequence: either in p or in q).

Let's sort p in non-decreasing order, and q in non-increasing order, we can denote the sorted versions by x and y, respectively. Then the cost of a partition is defined as f(p, q) = ∑_{i = 1}^n |x_i - y_i|.

Find the sum of f(p, q) over all correct partitions of array a. Since the answer might be too big, print its remainder modulo 998244353.

Input

The first line contains a single integer n (1 ≤ n ≤ 150 000).

The second line contains 2n integers a_1, a_2, …, a_{2n} (1 ≤ a_i ≤ 10^9) — elements of array a.

Output

Print one integer — the answer to the problem, modulo 998244353.

Examples

Input


1
1 4


Output


6

Input


2
2 1 2 1


Output


12

Input


3
2 2 2 2 2 2


Output


0

Input


5
13 8 35 94 9284 34 54 69 123 846


Output


2588544

Note

Two partitions of an array are considered different if the sets of indices of elements included in the subsequence p are different.

In the first example, there are two correct partitions of the array a:

  1. p = [1], q = [4], then x = [1], y = [4], f(p, q) = |1 - 4| = 3; 
  2. p = [4], q = [1], then x = [4], y = [1], f(p, q) = |4 - 1| = 3. 



In the second example, there are six valid partitions of the array a: 

  1. p = [2, 1], q = [2, 1] (elements with indices 1 and 2 in the original array are selected in the subsequence p); 
  2. p = [2, 2], q = [1, 1]; 
  3. p = [2, 1], q = [1, 2] (elements with indices 1 and 4 are selected in the subsequence p); 
  4. p = [1, 2], q = [2, 1]; 
  5. p = [1, 1], q = [2, 2]; 
  6. p = [2, 1], q = [2, 1] (elements with indices 3 and 4 are selected in the subsequence p). 
import java.io.*;
import java.util.*;
import java.math.*;

public class B {
	static byte[] buf = new byte[1<<26];
    static int bp = -1;	
	
	public static void main(String[] args) throws IOException {

		/**/
		DataInputStream in = new DataInputStream(System.in);
		/*/
		DataInputStream in = new DataInputStream(new FileInputStream("src/b.in"));
		/**/
		
		in.read(buf, 0, 1<<26);
		int n = nni();
		int[] a = new int[2*n];
		for (int i = 0; i < 2*n; ++i)
			a[i] = nni();
		a = Arrays.stream(a).sorted().toArray(); // nope
		int MOD = 998244353;
		int mul = 0;
		for (int i = 0; i < n; ++i) {
			mul += a[i+n]-a[i];
			mul %= MOD;
		}
		long base = 1;
		long tin = 1;
		for (int i = 2; i<=n; ++i) {
			base *= i;
			base %= MOD;
		}
		tin = (base*base)%MOD;
		for (int i = n+1; i<=2*n; ++i) {
			base *= i;
			base %= MOD;
		}
		long inv = minv(tin,MOD);
		base *= inv;
		base %= MOD;
		base *= mul;
		base %= MOD;
		System.out.println(base);
	}
	
	public static long minv(long b, long m) {
		Xy xy = new Xy();
		long d = gcde(b,m,xy);
		if (d!=1)
			return -1;
		return (xy.x%m+m)%m;
	}
	
	public static long gcde(long a, long b, Xy xy) {
		long xx = 0;
		long yy = 1;
		xy.y = 0;
		xy.x = 1;
		while (b!=0) {
			long q = a/b;
			long t = b;
			b = a%b;
			a = t;
			t = xx;
			xx = xy.x-q*xx;
			xy.x = t;
			t = yy;
			yy = xy.y-q*yy;
			xy.y = t;
		}
		return a;
	}
	
	public static int nni() {
        int ret = 0;
        byte b = buf[++bp];
        while (true) {
            ret = ret*10+b-'0';
            b = buf[++bp];
            if (b<'0'||b>'9') {
            	while (buf[bp+1]=='\r'||buf[bp+1]=='\n'||buf[bp+1]==' ') {++bp;}
            	break;
            }
        }
        return ret;
    }
}

class Xy {
	public long x;
	public long y;
}