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.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	static Map<Character,Integer> map = new HashMap<Character,Integer>();
	public static void initMap(){
		int i = 0;
		for(char c='0';c<='9';c++,i++){
			map.put(c, i);
		}
		for(char c='A';c<='Z';c++,i++){
			map.put(c, i);
		}
		for(char c='a';c<='z';c++,i++){
			map.put(c, i);
		}
		map.put('-', 62);
		map.put('_', 63);
	}
	
	public static long calcOnes(char c){
		int num = map.get(c);
		long count = 0;
		while(num != 0){
			if(num % 2 == 1){
				count++;
			}
			num /= 2;
		}
		return count;
	}
	public static long calcZeros(int n, char c){
		int x = 0;
		int num = map.get(c);
		while(num != 0){
			x++;
			num /= 2;
		}
		//x += 1;
		return ((6 * (n-1)) + x);
	}
	public static long pow(long base, long exp){
		long ans = 1;
		for(int i=0;i<exp;i++){
			ans = (ans * base) % 1000000007;
		}
		return ans;
	}
	public static void main(String[] args){
		initMap();
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		long ones = 0;
		for(int i=0;i<s.length();i++){
			ones += calcOnes(s.charAt(i));
		}
		long all = calcZeros(s.length(),s.charAt(s.length() - 1));
		long zeros = (6*s.length()) - ones;
		System.out.println(pow(3, zeros));
	}
}