```go
package main
import (
"bufio"
"fmt"
"os"
)
const MAX = 400010
var is_prime [MAX]bool
func main() {
for i := 2; i < MAX; i++ {
is_prime[i] = true
}
for i := 2; i*i < MAX; i++ {
if is_prime[i] {
for j := i * i; j < MAX; j += i {
is_prime[j] = false
}
}
}
in := bufio.NewReader(os.Stdin)
var t int
fmt.Fscan(in, &t)
for i := 0; i < t; i++ {
_ = i
var n int
fmt.Fscan(in, &n)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &a[i])
}
var odds []int
for _, ai := range a {
if ai%2 == 1 && is_prime[ai] {
odds = append(odds, ai)
}
}
nodds := len(odds)
if nodds > 1 {
fmt.Println(-1)
continue
}
if nodds == 0 {
fmt.Println(2)
continue
}
p := odds[0]
ok := true
for _, y := range a {
if !canGenerate(p, y) {
ok = false
break
}
}
if ok {
fmt.Println(p)
} else {
fmt.Println(-1)
}
}
}
func canGenerate(p int, y int) bool {
if y == p {
return true
}
tp := 2 * p
if y < tp {
return false
}
if y%2 == 0 {
return true
}
maxd := y - tp
if maxd < 3 {
return false
}
divs := []int{}
for i := 1; i*i <= y; i++ {
if y%i == 0 {
divs = append(divs, i)
if i != y/i {
divs = append(divs, y/i)
}
}
}
for _, d := range divs {
if d >= 3 && d <= maxd {
return true
}
}
return false
}
```