Given a set of integers (it can contain equal elements).

You have to split it into two subsets A and B (both of them can contain equal elements or be empty). You have to maximize the value of mex(A)+mex(B).

Here mex of a set denotes the smallest non-negative integer that doesn't exist in the set. For example: 

  * mex(\{1,4,0,2,2,1\})=3 
  * mex(\{3,3,2,1,3,0,0\})=4 
  * mex(∅)=0 (mex for empty set) 



The set is splitted into two subsets A and B if for any integer number x the number of occurrences of x into this set is equal to the sum of the number of occurrences of x into A and the number of occurrences of x into B.

Input

The input consists of multiple test cases. The first line contains an integer t (1≤ t≤ 100) — the number of test cases. The description of the test cases follows.

The first line of each test case contains an integer n (1≤ n≤ 100) — the size of the set.

The second line of each testcase contains n integers a_1,a_2,... a_n (0≤ a_i≤ 100) — the numbers in the set.

Output

For each test case, print the maximum value of mex(A)+mex(B).

Example

Input


4
6
0 2 1 5 0 1
3
0 1 2
4
0 2 0 1
6
1 2 3 4 5 6


Output


5
3
4
0

Note

In the first test case, A=\left\{0,1,2\right\},B=\left\{0,1,5\right\} is a possible choice.

In the second test case, A=\left\{0,1,2\right\},B=∅ is a possible choice.

In the third test case, A=\left\{0,1,2\right\},B=\left\{0\right\} is a possible choice.

In the fourth test case, A=\left\{1,3,5\right\},B=\left\{2,4,6\right\} is a possible choice.
1
100
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
 15
1
0
1
1
2
0 0
2
0 1
2
1 1
2
0 2
2
1 2
3
0 0 0
3
0 1 0
3
0 1 2
4
0 1 2 3
4
1 1 2 3
4
0 1 0 1
4
0 0 0 1
5
0 0 0 0 0

100
 1
0
2
2
0
1
0
2
3
3
4
0
4
3
2


import java.awt.List;
import java.io.*;
import java.math.BigInteger;
import java.util.*;


/*
 * 
 * daiict
 *
 * 
 * 
 */

public class Solution {
	FastScanner in;
	PrintWriter out;

	static ArrayList[] adj;
	static ArrayList[] aadj;
	static int last;
	static int n;
	static int m;

	static long C[][];

	static int[] dp1;
	static int[] dp2;
	static int color[];
	static int visited[];
	static int[] arr;
	static long[] brr;
	static double ans;
	static int array[];
	static int start[];
	static int finish[];
	static int pref[];
	static int tree[];
	static int maxval = 32;
	
	static int fenwik[];

	static int ttt[];
	static int sum = 0;
	static String s;

	static int cc = 0;
	static long min = Long.MAX_VALUE;

	static ArrayList<Integer> segt[];

	// for dfs do not delete
	static int dir[][] = { { 1, 0 }, { 0, 1 }, { 0, -1 }, { -1, 0 } };

	static int[] seg;
	static long count = 1;
	static long mod = (long) 1e9 + 7;

	static int parent[];
	static int size[];

	static int[] l;
	static int[] r;
	static int[] next;
	static int[] cnt;
	static int[] block;

	static HashSet<String> set;
	static HashSet<String> set2;

	static int low[];
	static int disc[];
	static int time;
	static int acn[];

	static class Pair1 implements Comparable<Pair1> {
		int x;
		int y;

		Pair1(int l, int m) {

			this.x = l;
			this.y = m;

		}
		
		public void setX(int x){
			this.x = x;
		}
		public void setY(int y){
			this.y = y;
		}

		public int compareTo(Pair1 p) {

			if (this.y != p.y) {
				return (int) (this.x - p.x);
			}
			return 0;
		}

		public String toString() {
			return x + " " + y;
		}

		public boolean equals(Object o) {
			if (o instanceof Pair1) {
				Pair1 a = (Pair1) o;

				return this.x == a.x;
			}

			return false;
		}

		public int hashCode() {
			return new Long(x).hashCode() * 31 + new Long(y).hashCode();
		}

	}

	public static int gcd(int a, int b) {
		if (b == 0)
			return a;
		return gcd(b, a % b);
	}


	// public static void update(int x,int val){
	// while(x<=maxval){
	// tree[x] += val;
	// x = (x&-x);
	// }
	// }

	public static int read(int idx) {
		int sum = 0;

		while (idx >= 0) {
			sum += tree[idx];
			idx -= (idx & (-idx));
		}

		return sum;
	}

	public static int find(int i) {
		if (parent[i] != i) {
			return find(parent[i]);
		}

		return i;
	}

	public static void union(int a, int b) {
		int x = find(a);
		int y = find(b);

		if (x != y) {
			if (size[x] > size[y]) {
				size[x] += size[y];
				parent[y] = x;
			} else {
				size[y] += size[x];
				parent[x] = y;
			}
		}
	}
	
	void updateF(int pos, int v, int n){
		pos = pos + 1;
		while(pos < n) {
			fenwik[pos] += v;
			pos += ((pos)&(-pos));
		}
	}
	
	int getF(int pos, int n) {
		int sum = 0;
		pos++;
		while(pos>0) {
			sum += fenwik[pos];
			pos -= ((pos)&(-pos));
		}
		return sum;
	}
	
	int process(int sum, int n){
		int l = 0;
		int r = n;
		while(l+1<r){
			int mid = (l+r)/2;
			int got = getF(mid,1000010);
			if (got >= sum){
				r = mid;
			} else {
				l = mid;
			}
		}
		updateF(l,-1,1000010);
		return l;
	}
	
	void build(int n, int arr[]) { // build the tree
		for (int i = n - 1; i > 0; --i)
			arr[i] = arr[i << 1] + arr[i << 1 | 1];
	}

	public static void modify(int p, int val, int n, int arr[]) { // set value at position
														// p
		for (arr[p += n] = val; p > 1; p >>= 1)
			arr[p >> 1] = arr[p] + arr[p ^ 1];
	}

	int query(int l, int r, int n, int arr[]) { // sum on interval [l, r)
		int res = 0;
		for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
			if ((l & 1) == 1)
				res += arr[l++];
			if ((r & 1) == 1)
				res += arr[--r];
		}
		return res;
	}


	/* static */ void solve() throws NumberFormatException,InputMismatchException, IOException {
		    		    
		    		    	Scanner in = new Scanner(System.in);
		    		    	

		    		    	
		    		    	int t = in.nextInt();
		    		    	
		    		    	while(t-->0){
		    		    		int n = in.nextInt();
		    		    		HashMap<Integer,Integer> map = new HashMap();
		    		    		for (int i = 0;i<n;i++){
		    		    			int a = in.nextInt();
		    		    			Integer c = map.get(a);
		    		    			if (c == null){
		    		    				c = 0;
		    		    			}
		    		    			map.put(a, c+1);
		    		    		}
		    		    		int ans = 0;
		    		    		int f = 0;
		    		    		for (int i =0;i<=100;i++){
		    		    			Integer d = map.get(i);
		    		    			if (d == null && f == 0) {
		    		    				ans = 2*i;
		    		    				break;
		    		    			} else if (d == null){
		    		    				ans += i;
		    		    				break;
		    		    			}
		    		    			if (d == 1 && f == 0) {
		    		    				ans += i;
		    		    				f = 1;
		    		    			}
		    		    		}
		    		    		System.out.println(ans);
		    		    	}
		    		    	
		    		    }
	
	
	public int findSum(int i, int[] arr, int offset){
		
		int sum = 0;
		
		for(int j = 0;(1<<j)<=i;j++){
			//System.out.append(i + " " + j + " " + (i>>j));
			if (((i>>j)&1) == 1){
				//System.out.println(i + " " + j + " " + (i>>j));
				sum += arr[j+offset];
			}
		}
		
		return sum;
	}
	
	public static int c(int n){
		if(n == 1){
			return 1;
		}
		if(n == 2)
			return 5;
		
		return 4*(2*(n-2) - 1) + 4 + c(n-1);
		
	}

	public static long dfs(int i,ArrayList<Long> list,long n) {
		if (visited[i] == 1) {
			return 0;
		}

		visited[i] = 1;
		int count = 1;
		for (int j = 0; j < adj[i].size(); j++) {
			int next = (int) (adj[i].get(j));
			long nextC = dfs(next, list,n);
			if (nextC == 0) {
				continue;
			}
			long ans = (nextC * (n-nextC)%mod)%mod;
			list.add(ans);
			count += nextC;
		}
		return count;

	}

	public static void uu(int arr[], int i, int f) {
		if (i == 1) {
			return;
		}
		int next = i / 2;
		int x = 0;
		if (i % 2 == 0) {
			x = i + 1;
		} else {
			x = i - 1;
		}

		if (f == 1) {
			arr[next] = arr[i] ^ arr[x];
		} else {
			arr[next] = arr[i] | arr[x];
		}

		uu(arr, next, 1 - f);
	}

	public static void sbuild(int i, int l, int r) {
		// System.out.println(i + " ");
		if (l == r) {
			segt[i] = new ArrayList();
			segt[i].add(array[l - 1]);
			return;
		}

		int mid = (l + r) / 2;
		sbuild(2 * i, l, mid);
		sbuild(2 * i + 1, mid + 1, r);

		segt[i] = new ArrayList();
		merge(segt[2 * i], segt[2 * i + 1], segt[i]);
	}

	public static int squery(int i, int l, int r, int ql, int qr, int val) {

		if (l > qr || r < ql || l > r || ql > qr) {
			return 0;
		}

		if (l >= ql && r <= qr) {
			int x = lbw(segt[i], val);
			return x;
		}

		int mid = (l + r) / 2;

		return (squery(2 * i, l, mid, ql, qr, val) + squery(2 * i + 1, mid + 1, r, ql, qr, val));

	}

	public static int lbw(ArrayList<Integer> list, int value) {

		// System.out.println(list);
		// System.out.println(value + " ff ");

		int low = 0;
		int high = list.size();

		while (low != high) {
			int mid = (low + high) / 2;
			if (list.get(mid) <= value) {
				low = mid + 1;
			} else {
				high = mid;
			}
		}
		if (low == list.size()) {
			return list.size();
		}
		return low;
	}

	public static void merge(ArrayList<Integer> l1, ArrayList<Integer> l2, ArrayList<Integer> ans) {
		int i = 0;
		int j = 0;

		while (i < l1.size() && j < l2.size()) {
			if (l1.get(i) > l2.get(j)) {
				ans.add(l2.get(j));
				j++;
			} else {
				ans.add(l1.get(i));
				i++;
			}
		}

		while (i < l1.size()) {
			ans.add(l1.get(i));
			i++;
		}

		while (j < l2.size()) {
			ans.add(l2.get(j));
			j++;
		}
	}

	public static void dfs(int i, int p) {
		start[i] = time;
		array[time] = arr[i];
		time++;
		for (int j = 0; j < adj[i].size(); j++) {
			if ((int) adj[i].get(j) != p) {
				dfs((int) adj[i].get(j), i);
			}
		}

		finish[i] = time;

	}

	static void call(int i) {

		// System.out.println(i);

		visited[i] = 1;
		time++;
		disc[i] = time;
		low[i] = time;

		for (int j = 0; j < adj[i].size(); j++) {
			if (visited[(int) adj[i].get(j)] == 0) {
				acn[(int) adj[i].get(j)] = i;
				call((int) adj[i].get(j));

				low[i] = Math.min(low[i], low[(int) adj[i].get(j)]);

				if (low[(int) adj[i].get(j)] > disc[i]) {
					int temp = (int) adj[i].get(j);
					union(temp, i);
					System.out.println(temp + " " + i);
				}
			} else if ((int) adj[i].get(j) != acn[i]) {
				low[i] = Math.min(low[i], disc[(int) adj[i].get(j)]);
			}
		}

	}

	static void update(int idx, int b) {
		int j = block[idx];
		arr[idx] = b;

		for (int i = r[j]; i >= l[j]; i--) {
			int k = (int) (i + arr[i]);
			if (k >= n) {
				next[i] = i;
				cnt[i] = 1;
				continue;
			}
			if (block[k] > block[i]) {
				next[i] = k;
				cnt[i] = 1;
			} else {
				next[i] = next[k];
				cnt[i] = cnt[k] + 1;
			}
		}

	}

	static void get(int idx) {
		if (next[idx] == idx) {
			last = idx;
			ans = 1;
			return;
		}
		int c = 0;
		while (true) {
			int j = next[idx];
			if (block[j] == block[idx]) {
				c += cnt[idx];
				last = next[idx];
				break;
			} else {
				c += cnt[idx];
				idx = next[idx];
			}
		}

		ans = c;
	}

	static private String Frac(double x) {
		if (x < 0) {
			return "-" + Frac(-x);
		}
		double tolerance = 1.0E-18;
		double h1 = 1;
		double h2 = 0;
		double k1 = 0;
		double k2 = 1;
		double b = x;
		do {
			double a = Math.floor(b);
			double aux = h1;
			h1 = a * h1 + h2;
			h2 = aux;
			aux = k1;
			k1 = a * k1 + k2;
			k2 = aux;
			b = 1 / (b - a);
		} while (Math.abs(x - h1 / k1) > x * tolerance);

		return h1 + " " + k1;
	}

	public static long invcount(int arr[]) {
		if (arr.length < 2) {
			return 0;
		}

		int mid = (arr.length + 1) / 2;

		int left[] = Arrays.copyOfRange(arr, 0, mid);
		int right[] = Arrays.copyOfRange(arr, mid, arr.length);

		return invcount(left) + invcount(right) + merge(arr, left, right);

	}

	public static long merge(int arr[], int left[], int right[]) {
		long count = 0;

		int i = 0;
		int j = 0;

		while (i < left.length || j < right.length) {

			if (i == left.length) {
				arr[i + j] = right[j];
				j++;
			} else if (j == right.length) {
				arr[j + i] = left[i];
				i++;
			} else {
				if (left[i] <= right[j]) {
					arr[i + j] = left[i];
					i++;
				} else {
					arr[i + j] = right[j];
					j++;
					count += left.length - i;
				}
			}

		}

		return count;
	}

	/**
	 * 
	 * @param div
	 * @param left
	 * @param right
	 * @param value
	 * @return the smallest index i which a[i] >= value in range [left, right)
	 *         if exists, otherwise return -1
	 */
	int ff(int[] div, int left, int right, int value) {
		int low = left;
		int high = right;

		if (value > div[right - 1]) {
			return left;
		}

		while (low != high) {
			int mid = (low + high) / 2;
			if (div[mid] < value) {
				low = mid + 1;
			} else {
				high = mid;
			}
		}
		if (low == right) {
			return low;
		}
		return low;
	}

	/**
	 * 
	 * @param div
	 * @param left
	 * @param right
	 * @param value
	 * @return greatest index i which a[i] <= value in range [left, right) if
	 *         exists, otherwise return a number out of [left, right)
	 */
	int ffff(int[] div, int left, int right, int value) {

		if (value < div[left]) {
			return right - 1;
		}

		while (left != right) {
			int mid = (left + right) >> 1;
			if (div[mid] <= value) {
				left = mid + 1;
			} else {
				right = mid;
			}
		}
		if (left < 0) {
			left *= -1;
		}
		return --left;
	}

	public static String reverse(String s) {

		String ans = "";

		for (int i = s.length() - 1; i >= 0; i--) {
			ans += s.charAt(i);
		}

		return ans;

	}

	public static long sum(long x) {
		return x < 10 ? x : x % 10 + sum(x / 10);
	}

	public static long gcd(long x, long y) {
		if (x == 0)
			return y;
		else
			return gcd(y % x, x);
	}

	static long inv(long x, long mod) {
		long r, y;
		for (r = 1, y = mod - 2; y != 0; x = x * x % mod, y >>= 1) {
			if ((y & 1) == 1)
				r = r * x % mod;

		}
		return r;
	}

	public static long pow(long x, long y, long n) {
		if (y == 0)
			return 1 % n;
		if (y % 2 == 0) {
			long z = pow(x, y / 2, n);
			return (z * z) % n;
		}
		return ((x % n) * pow(x, y - 1, n)) % n;
	}

	public static boolean isPrime(long a) {
		// Corner cases
		if (a <= 1)
			return false;
		if (a <= 3)
			return true;

		// This is checked so that we can skip
		// middle five numbers in below loop
		if (a % 2 == 0 || a % 3 == 0)
			return false;

		for (long i = 5; i * i <= a; i = i + 6)
			if (a % i == 0 || a % (i + 2) == 0)
				return false;

		return true;
	}

	void run() throws NumberFormatException, InputMismatchException, IOException {
		in = new FastScanner();
		out = new PrintWriter(System.out);

		solve();

		out.close();
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;

		public FastScanner() {
			br = new BufferedReader(new InputStreamReader(System.in));
		}

		String next() {
			while (st == null || !st.hasMoreTokens()) {
				try {
					st = new StringTokenizer(in.br.readLine());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}

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

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

		double nextDouble() {
			return Double.parseDouble(next());
		}
	}

	public static void main(String[] args) throws NumberFormatException, InputMismatchException, IOException {
		// new Thread(null ,new Runnable(){
		// public void run(){
		// try{
		//
		// test();
		//
		// } catch(Exception e){
		// e.printStackTrace();
		// }
		// }
		// },"1",1<<26).start();
		// }
		// static StringBuilder sb;
		// public static void test() throws IOException{
		// sb=new StringBuilder();
		// int t=1;
		// while(t-->0){
		//
		// solve();
		//
		// }
		//

		new Solution().run();
	}

}

class Pair {
	int x;
	int y;

	public Pair(int i, int j) {
		this.x = i;
		this.y = j;

	}

}

class MyComp implements Comparator<String> {

	int c = 0;

	MyComp(int d) {
		c = d;
	}

	@Override
	public int compare(String a, String b) {

		// < == -1

		String arr[] = a.split(" ");
		String brr[] = b.split(" ");

		return arr[c].compareTo(brr[c]);

	}

}

class MyComp2 implements Comparator<Pair> {

	@Override
	public int compare(Pair a, Pair b) {

		// < == -1

		if (a.y != b.y) {
			return a.x - b.x;
		} else {
			return 0;
		}

	}

}
