```go
package main
import (
"bufio"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
if !scanner.Scan() {
return
}
k, _ := strconv.Atoi(scanner.Text())
const MAX_VAL = 1000000
counts := make([]int, MAX_VAL+1)
minVal := MAX_VAL + 1
maxInputVal := 0
for i := 0; i < n; i++ {
scanner.Scan()
val, _ := strconv.Atoi(scanner.Text())
counts[val]++
if val < minVal {
minVal = val
}
if val > maxInputVal {
maxInputVal = val
}
}
pref := make([]int, MAX_VAL+2)
for i := 1; i <= MAX_VAL+1; i++ {
pref[i] = pref[i-1] + counts[i-1]
}
ans := k + 1
if minVal < ans {
ans = minVal
}
for x := minVal; x > ans; x-- {
possible := true
for j := 1; j*x <= maxInputVal; j++ {
l := j*x + k + 1
r := (j+1)*x - 1
if r > MAX_VAL {
r = MAX_VAL
}
if l <= r {
if pref[r+1]-pref[l] > 0 {
possible = false
break
}
}
}
if possible {
ans = x
break
}
}
writer := bufio.NewWriter(os.Stdout)
writer.WriteString(strconv.Itoa(ans) + "\n")
writer.Flush()
}
```