package main
import (
"fmt"
)
func main() {
var str string
var desired bool
for {
n, _ := fmt.Scan(&str, &desired)
if n == 0 {
break
} else {
if isValid(str) {
fmt.Println(process(str, desired))
} else {
fmt.Println(0)
}
}
}
}
func isValid(str string) bool {
if len(str)&1 == 0 {
return false
}
for i := 0; i < len(str); i += 2 {
if !(str[i] == '0' || str[i] == '1') {
return false
}
}
for i := 1; i < len(str); i += 2 {
if !(str[i] == '&' || str[i] == '|' || str[i] == '^') {
return false
}
}
return true
}
func process(str string, desired bool) int {
// base case 所在位置,不可能压中逻辑符号, 只能为0,1
truedp := make([][]int, len(str))
falsedp := make([][]int, len(str))
n := len(str)
for i := 0; i < n; i++ {
truedp[i] = make([]int, n)
falsedp[i] = make([]int, n)
}
for i := 0; i < n; i += 2 {
if str[i] == '1' {
truedp[i][i] = 1
} else {
falsedp[i][i] = 1
}
}
mod := int(1e9+7)
for row := n - 3; row >= 0; row = row - 2 {
for col := row + 2; col < n; col = col + 2 {
for i := row + 1; i < col; i += 2 {
if str[i] == '&' {
truedp[row][col] += (truedp[row][i-1] * truedp[i+1][col])%mod
} else if str[i] == '|' {
truedp[row][col] += (truedp[row][i-1] * truedp[i+1][col])%mod
truedp[row][col] += (truedp[row][i-1] * falsedp[i+1][col])%mod
truedp[row][col] += (falsedp[row][i-1] * truedp[i+1][col])%mod
} else if str[i] == '^' {
truedp[row][col] += (truedp[row][i-1] * falsedp[i+1][col])%mod
truedp[row][col] += (falsedp[row][i-1] * truedp[i+1][col])%mod
}
truedp[row][col] = (truedp[row][col])%mod
if str[i] == '&' {
falsedp[row][col] += (truedp[row][i-1] * falsedp[i+1][col])%mod
falsedp[row][col] += (falsedp[row][i-1] * truedp[i+1][col])%mod
falsedp[row][col] += (falsedp[row][i-1] * falsedp[i+1][col])%mod
} else if str[i] == '|' {
falsedp[row][col] += (falsedp[row][i-1] * falsedp[i+1][col])%mod
} else if str[i] == '^' {
falsedp[row][col] += (truedp[row][i-1] * truedp[i+1][col])%mod
falsedp[row][col] += (falsedp[row][i-1] * falsedp[i+1][col])%mod
}
falsedp[row][col] = (falsedp[row][col])%mod
}
}
}
if desired {
return truedp[0][n-1]
} else {
return falsedp[0][n-1]
}
}
// 1^0|0|1
// func process(str string, desired bool, l, r int) int {
// // base case 所在位置,不可能压中逻辑符号, 只能为0,1
// if l == r {
// if str[l] == '1' {
// if desired {
// return 1
// }
// return 0
// } else {
// if desired {
// return 0
// }
// return 1
// }
// }
// ans := 0
// if desired {
// for i := l + 1; i < r; i += 2 {
// if str[i] == '&' {
// ans += process(str, true, l, i-1) * process(str, true, i+1, r)
// } else if str[i] == '|' {
// ans += process(str, true, l, i-1) * process(str, true, i+1, r)
// ans += process(str, true, l, i-1) * process(str, false, i+1, r)
// ans += process(str, false, l, i-1) * process(str, true, i+1, r)
// } else if str[i] == '^' {
// ans += process(str, true, l, i-1) * process(str, false, i+1, r)
// ans += process(str, false, l, i-1) * process(str, true, i+1, r)
// }
// }
// } else {
// for i := l + 1; i < r; i += 2 {
// if str[i] == '&' {
// ans += process(str, true, l, i-1) * process(str, false, i+1, r)
// ans += process(str, false, l, i-1) * process(str, true, i+1, r)
// ans += process(str, false, l, i-1) * process(str, false, i+1, r)
// } else if str[i] == '|' {
// ans += process(str, false, l, i-1) * process(str, false, i+1, r)
// } else if str[i] == '^' {
// ans += process(str, true, l, i-1) * process(str, true, i+1, r)
// ans += process(str, false, l, i-1) * process(str, false, i+1, r)
// }
// }
// }
// return ans
// }