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 com.sun.org.apache.xpath.internal.SourceTree;
import com.sun.org.apache.xpath.internal.functions.FuncFalse;
import javafx.util.Pair;

import java.io.*;
import java.util.*;

import static java.lang.Math.*;

public class Contest {
    public static class pair implements Comparable<pair> {
        long l;
        long r;


        public pair(long lef, long ri) {
            l = lef;
            r = ri;
        }

        @Override
        public int compareTo(pair p) {
            if (l == p.l)
                return Long.compare(r, p.r);
            return Long.compare(l, p.l);
        }
    }

    static int n, m;
    static ArrayList<Integer>[] adj;
    static int dist[];
    static int[] h;
    static int[] p;
    static int parent[];
    static long inf = (long) 1e18;
    static int INF = (int) 1e9;


    public static boolean isSimilar(char[] Arr, int s, int k) {
        for (int i = s; i < k - 1; i++) {
            if (Arr[i + 1] != Arr[i])
                return false;
        }
        return true;
    }

    public static int ciel(int d, int mod) {
        if (d % mod == 0)
            return d / mod;
        return (d / mod) + 1;
    }


    public static long gcd(long u, long v) {
        if (v == 0)
            return u;
        return gcd(v, u % v);
    }

    static int k, Arr[], lefAcc[], riAcc[];
    static PrintWriter pw;

    static long memo[][];
    static char[][] Matrix;
    static int[][] dp;
//    static int[] dx = new int[]{-1, 1, 0, 0};
//
//    static int[] dy = new int[]{0, 0, -1, 1};


    static boolean valid(int i, int j) {

        return i != -1 && j != -1 && i != n && j != m;

    }


    static boolean[][] vis, vis1, explored;
    static int x, y;

//    static void dfs2(int i, int j) {
//        vis[i][j] = true;
//        //mark as visited
//        for (int k = 0; k < 4; ++k) {
//            int x = i + dx[k], y = j + dy[k];
//            if (valid(x, y) && Matrix[x][y] != '#' && !vis[x][y])
//                dfs2(x, y);
//        }
//    }

    static boolean hasMore = false;

//    static void dfs1(int i, int j) {
//        vis1[i][j] = true;
//        //mark as visited
//        int ans = 0;
//        for (int k = 0; k < 4; ++k) {
//
//            int x = i + dx[k], y = j + dy[k];
//            if (valid(x, y) && Matrix[x][y] != '#') {
//                if (!vis1[x][y])
//                    dfs1(x, y);
//                if (vis[x][y]) ans++;
//            }
//        }
//        if (ans > 2) hasMore = true;
//    }

//    public static int getnum(int[][] matrix, int i, int j) {
//        int c = 0;
//
//        for (int k = 0; k < 4; ++k) {
//
//            int x = i + dx[k], y = j + dy[k];
//
//            if (valid(x, y))
//                c++;
//
//        }
//        return c;
//    }

    static char fir, sec;

    static long nCK3(int N, int K) {        // O(K)
       long temp= 1l*fac[N]*poww(fac[K], mod-2)%mod;
       temp%=mod;
       temp*=poww(fac[N-K],mod-2);
       temp%=mod;
        return temp % mod;
    }

    static long mod = 998244353;
    static double ax, bx, cx, dx, ay, by, cy, dy, angle1, angle2, d1, d2, cos1, sin1, cos2, sin2;

    public static double chDist(double mid) {
        double x1, y1, x2, y2;
        if (mid <= d1) {
            x1 = mid * cos1 + ax;
            y1 = mid * sin1 + ay;
        } else {
            x1 = bx;
            y1 = by;
        }
        if (mid <= d2) {
            x2 = mid * cos2 + cx;
            y2 = mid * sin2 + cy;
        } else {
            x2 = dx;
            y2 = dy;
        }
        return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
    }

    static double epc = 1e-8;

    static long poww(long a, long n) {
        long res = 1;
        while (n != 0) {
            if ((n & 1) == 1)
                res *= a%mod;
            res%=mod;
            a *= a%mod;
            a%=mod;
            n >>= 1;
        }
        return res%mod;
    }
    static long[] fac;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        pw = new PrintWriter(System.out);
        n = sc.nextInt();
        Long[] Arr = new Long[2 * n];
        long sum = 0;
        fac = new long[2 * n + 1];
        fac[0] = 1;
        for (int i = 1; i <= 2*n; i++) {
            fac[i] = (1l * fac[i - 1] * i) % mod;
        }
        for (int i = 0; i < 2 * n; i++) {
            Arr[i] = sc.nextLong();
        }
        Arrays.sort(Arr);
        for (int i = 0; i < 2 * n; i++) {
            if (i < n)
                sum -= Arr[i];
            else sum += Arr[i];
        }
        sum %= mod;
        long y = nCK3(2 * n, n);
        sum *= y;
        sum %= mod;
        pw.println(sum);

        pw.close();


    }

    static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException, IOException {
            return br.ready();
        }

    }
}

