```go
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func pad4(s string) string {
if len(s) >= 4 {
return s
}
return strings.Repeat("0", 4-len(s)) + s
}
func restore(addr string) string {
if strings.Contains(addr, "::") {
parts := strings.SplitN(addr, "::", 2)
leftStr, rightStr := parts[0], parts[1]
var left, right []string
if leftStr != "" {
left = strings.Split(leftStr, ":")
}
if rightStr != "" {
right = strings.Split(rightStr, ":")
}
needZeros := 8 - (len(left) + len(right))
full := make([]string, 0, 8)
for _, x := range left {
full = append(full, pad4(x))
}
for i := 0; i < needZeros; i++ {
full = append(full, "0000")
}
for _, x := range right {
full = append(full, pad4(x))
}
return strings.Join(full, ":")
}
blocks := strings.Split(addr, ":")
for i := range blocks {
blocks[i] = pad4(blocks[i])
}
return strings.Join(blocks, ":")
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
for i := 0; i < n; i++ {
var s string
fmt.Fscan(in, &s)
fmt.Fprintln(out, restore(s))
}
}
```