A binary string is a string that consists of characters 0 and 1.

Let \operatorname{MEX} of a binary string be the smallest digit among 0, 1, or 2 that does not occur in the string. For example, \operatorname{MEX} of 001011 is 2, because 0 and 1 occur in the string at least once, \operatorname{MEX} of 1111 is 0, because 0 and 2 do not occur in the string and 0 < 2.

A binary string s is given. You should cut it into any number of substrings such that each character is in exactly one substring. It is possible to cut the string into a single substring — the whole string.

A string a is a substring of a string b if a can be obtained from b by deletion of several (possibly, zero or all) characters from the beginning and several (possibly, zero or all) characters from the end.

What is the minimal sum of \operatorname{MEX} of all substrings pieces can be?

Input

The input consists of multiple test cases. The first line contains a single integer t (1 ≤ t ≤ 10^4) — the number of test cases. Description of the test cases follows.

Each test case contains a single binary string s (1 ≤ |s| ≤ 10^5).

It's guaranteed that the sum of lengths of s over all test cases does not exceed 10^5.

Output

For each test case print a single integer — the minimal sum of \operatorname{MEX} of all substrings that it is possible to get by cutting s optimally.

Example

Input


6
01
1111
01100
101
0000
01010


Output


1
0
2
1
1
2

Note

In the first test case the minimal sum is \operatorname{MEX}(0) + \operatorname{MEX}(1) = 1 + 0 = 1.

In the second test case the minimal sum is \operatorname{MEX}(1111) = 0.

In the third test case the minimal sum is \operatorname{MEX}(01100) = 2.
import static java.lang.Math.max;
import static java.lang.Math.min;
import static java.lang.Math.abs;
import static java.lang.System.out;
import java.util.* ;
import java.math.*;
import java.io.*;


 public class javaTemplate {
	
	public static final int M = 1000000007 ;
	static FastReader sc = new FastReader();
	static int N = 86028121 ;
	static boolean globB[] = new boolean[N+1] ;
	static int globA[] = new int[10000000] ;
	
	
	public static void main(String[] args) {
	    
	    
	    
int t = sc.nextInt() ;
		
		while(t --!= 0) {
			String s = sc.next() ;
			int one = 0 ;
			int zero = 0 ;
			for(int i = 0 ; i< s.length() ; i++) {
				if(s.charAt(i) == '1') one ++ ;
				else zero ++ ;
			}
			
			if(one == 0) {
				System.out.println("1");
			} else if(zero == 0) {
				System.out.println("0");
			} else if(zero > 2) {
				System.out.println("2");
			} else {
				System.out.println(1*zero);
			}
		}
		
		
	}
	
	
	
	



	/*
	 @ Observation is imp. for problem A and B
	 1->> Read the problem properly take time to read the problem 
	 if it is too lengthy.
	 2->> Draw the test cases of A and B 
	 3->> Don't over think the problem 
	 4->> Try to take sum variable as long
	 5->> Avoid Nested if else statement
	 6->> If it looks like a Greedy problem try to figure out the ans. 
	 for the smallest test case.
	 7->> If it is a binary String check no. of 0's and 1's. 
	 If it is a even try to pair it (may be not applicable for every questions).
	 8->> Always check the constrains and try BruteForce
	 @ Implement it quickly 
	 */
	

	
	
	


	
	
//_________________________//Template//_____________________________________________________________________
	
	
		//		FAST I/O
		static class FastReader {
	        BufferedReader br;
	        StringTokenizer st;
	        
	        public FastReader()
	        {
	            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;
	        }
		}
	
	
		
		
		
	// Sorting
			public static void sort(long[] arr) {
		        //because Arrays.sort() uses quicksort which is dumb
		        //Collections.sort() uses merge sort
		        ArrayList<Long> ls = new ArrayList<Long>();
		        for(long x: arr)
		            ls.add(x);
		        Collections.sort(ls);
		        for(int i=0; i < arr.length; i++)
		            arr[i] = ls.get(i);
		    }
			
		
		
		
		
		
		// Modulo
		static int mod(int a) {
		   return (a%M + M) % M;
		}
		
		
		
		
		
		
		
		//		Palindrom or Not
		static boolean isPalindrome(String str, int low, int high) {
					while (low < high) {
						if (str.charAt(low) != str.charAt(high)) return false;
					 	low++;
					 	high--;
					}
					return true;
				}
	
	

	
	
	
	
	
	
	
	
		// check if sorted or not	
		public static boolean isSorted(int[] a)
	    {
	        for (int i = 0; i < a.length - 1; i++)
	        {
	            if (a[i] > a[i + 1]) {
	                return false;
	            }
	        }
	        return true;
	    }
	
	
	
		
		
	
		// GCD
		public static int GCD(int a , int b) {
				if(b == 0) return a ;
				
				return GCD(b, a%b) ;
			}
	
		
		
		
		
		// sieve
		public static void sieve() {
			Arrays.fill(globB, true);
			globB[0] = false ;
			globB[1] = false ;
			for(int i = 2 ; i * i <= N ; i++) {
				if(globB[i]) {
				for(int j = i * i ; j<= N ; j+= i) {
					globB[j] = false ;
				 }
				}
			}
			
		}

		
		
		
		// fastPower
		public static long fastPowerModulo(long a, long b, long n) {
			long res = 1 ;
			while(b > 0) {
			if((b&1) != 0) {
				res = (res * a % n) % n ;
			}
			a = (a % n * a % n) % n ;
			b = b >> 1 ;
			}
			return res ;
		}
	
		
		
        // LCM
		static int LCM(int a, int b)
	    {
	        return (a / GCD(a, b)) * b;
	    }
		

}


 
 
 
 
 
 
