Problem: While walking down the street Vanya saw a label "Hide&Seek". Because he is a programmer, he used & as a bitwise AND for these two words represented as a integers in base 64 and got new word. Now Vanya thinks of some string s and wants to know the number of pairs of words of length |s| (length of s), such that their bitwise AND is equal to s. As this number can be large, output it modulo 109 + 7.

To represent the string as a number in numeral system with base 64 Vanya uses the following rules:

  * digits from '0' to '9' correspond to integers from 0 to 9; 
  * letters from 'A' to 'Z' correspond to integers from 10 to 35; 
  * letters from 'a' to 'z' correspond to integers from 36 to 61; 
  * letter '-' correspond to integer 62; 
  * letter '_' correspond to integer 63. 

Input

The only line of the input contains a single word s (1 ≤ |s| ≤ 100 000), consisting of digits, lowercase and uppercase English letters, characters '-' and '_'.

Output

Print a single integer — the number of possible pairs of words, such that their bitwise AND is equal to string s modulo 109 + 7.

Examples

Input

z


Output

3


Input

V_V


Output

9


Input

Codeforces


Output

130653412

Note

For a detailed definition of bitwise AND we recommend to take a look in the corresponding article in Wikipedia.

In the first sample, there are 3 possible solutions: 

  1. z&_ = 61&63 = 61 = z
  2. _&z = 63&61 = 61 = z
  3. z&z = 61&61 = 61 = z

Solution (in JAVA):

Solution:
import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class vanya_label 
{
	
	
	public static void main(String args[])throws IOException
	{
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		StringBuilder str = new StringBuilder ();
		int cint = 0;
		int count = 0;
		
		
		
		for (int i = 0; i< s.length(); i++)
		{
			char c = s.charAt(i);
			if (Character.isDigit(c))
			{
				 cint = Character.getNumericValue(c);
				 cint = cint - Character.getNumericValue('0');
				
			}
			if (Character.isLetter(c))
			{
				if ((c >= 'A') && (c <= 'Z'))
				{
					 cint  = 10 + Character.getNumericValue(c) - Character.getNumericValue('A');
				}
				if ((c >= 'a') && (c <= 'z'))
				{
					 cint  = 36 + Character.getNumericValue(c) - Character.getNumericValue('a');
				}
			}
			if (c == '-')
				 cint = 62;
			if (c == '_')
				 cint  = 63;
			
			String bin = Integer.toBinaryString(cint);
			//System.out.print(cint+" ");
			for (int j = 0; j < 6; j++) 
			{
				//System.out.println((cint >>> j ) & 1);
                if (((cint >>> j) & 1) == 0) {
                    count++;
                }
            }
			
			/*if (bin.length()<6)
			{
				for (int j = 0; j< 6-bin.length(); j++)
					bin = "0"+bin;
			}
				
					
			for (int j = 0; j< bin.length(); j++)
			{
				if (bin.charAt(j)=='0')
					count++;
			}*/
		}
		
		//System.out.println(Integer.toBinaryString(31)+" "+Integer.toBinaryString(63));
		//System.out.println(Character.getNumericValue('9'));
		int res = 0;
		//long m = (long)Math.pow(3, count);
		BigInteger mod = BigInteger.valueOf((int) (1e9+7)); 
		//long rem = m%(mod);
		BigInteger a = BigInteger.valueOf(3).pow(count);
		System.out.println(a.mod(mod));
		
		//System.out.println();
		//System.out.println(count);
		
	}
	

}