← Home
package main

import (
	"io"
	"os"
	"strconv"
)

const MOD int64 = 1000000007

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') && data[p] != '-' {
			p++
		}
		sign := 1
		if data[p] == '-' {
			sign = -1
			p++
		}
		val := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			val = val*10 + int(data[p]-'0')
			p++
		}
		return sign * val
	}

	t := nextInt()
	out := make([]byte, 0, t*3)

	abs := func(x int) int {
		if x < 0 {
			return -x
		}
		return x
	}

	for ; t > 0; t-- {
		n := nextInt()
		m := nextInt()
		k := nextInt()

		nm := n * m
		xs := make([]int, k+1)
		ys := make([]int, k+1)
		odd := make([]bool, nm)

		for i := 0; i <= k; i++ {
			x := nextInt() - 1
			y := nextInt() - 1
			xs[i] = x
			ys[i] = y
			odd[x*m+y] = true
		}

		c1 := make([]int, k)
		c2 := make([]int, k)
		sz := make([]int, k)
		vid := make([]int, nm)
		vc := 0
		totalInc := 0
		ok := true

		getV := func(id int) int {
			if vid[id] == 0 {
				vc++
				vid[id] = vc
			}
			return vid[id] - 1
		}

		for i := 0; i < k; i++ {
			x1, y1 := xs[i], ys[i]
			x2, y2 := xs[i+1], ys[i+1]
			adx := abs(x2 - x1)
			ady := abs(y2 - y1)

			if adx == 2 && y1 == y2 {
				id := ((x1 + x2) / 2 * m) + y1
				if !odd[id] {
					c1[i] = getV(id)
					c2[i] = -1
					sz[i] = 1
					totalInc++
				}
			} else if x1 == x2 && ady == 2 {
				id := x1*m + (y1+y2)/2
				if !odd[id] {
					c1[i] = getV(id)
					c2[i] = -1
					sz[i] = 1
					totalInc++
				}
			} else if adx == 1 && ady == 1 {
				cnt := 0
				id1 := x1*m + y2
				if !odd[id1] {
					c1[i] = getV(id1)
					cnt++
					totalInc++
				}
				id2 := x2*m + y1
				if !odd[id2] {
					v := getV(id2)
					if cnt == 0 {
						c1[i] = v
					} else {
						c2[i] = v
					}
					cnt++
					totalInc++
				}
				sz[i] = cnt
				if cnt < 2 {
					c2[i] = -1
				}
			} else {
				sz[i] = 0
				c2[i] = -1
			}

			if sz[i] == 0 {
				ok = false
			}
		}

		if !ok {
			out = strconv.AppendInt(out, 0, 10)
			out = append(out, '\n')
			continue
		}

		head := make([]int, vc)
		for i := 0; i < vc; i++ {
			head[i] = -1
		}
		to := make([]int, totalInc)
		next := make([]int, totalInc)
		ptr := 0

		add := func(v, idx int) {
			to[ptr] = idx
			next[ptr] = head[v]
			head[v] = ptr
			ptr++
		}

		for i := 0; i < k; i++ {
			if sz[i] >= 1 {
				add(c1[i], i)
			}
			if sz[i] == 2 {
				add(c2[i], i)
			}
		}

		queue := make([]int, 0)
		for i := 0; i < k; i++ {
			if sz[i] == 1 {
				queue = append(queue, i)
			}
		}

		occupied := make([]bool, vc)

		for qh := 0; qh < len(queue) && ok; qh++ {
			i := queue[qh]
			if sz[i] != 1 {
				continue
			}
			v := c1[i]
			sz[i] = 0

			if occupied[v] {
				ok = false
				break
			}
			occupied[v] = true

			for e := head[v]; e != -1; e = next[e] {
				j := to[e]
				if sz[j] == 0 {
					continue
				}
				if c1[j] == v {
					if sz[j] == 1 {
						ok = false
						break
					}
					c1[j] = c2[j]
					c2[j] = -1
					sz[j] = 1
					queue = append(queue, j)
				} else if sz[j] == 2 && c2[j] == v {
					c2[j] = -1
					sz[j] = 1
					queue = append(queue, j)
				}
			}
		}

		if !ok {
			out = strconv.AppendInt(out, 0, 10)
			out = append(out, '\n')
			continue
		}

		visV := make([]bool, vc)
		visE := make([]bool, k)
		stack := make([]int, 0)
		ans := int64(1)

		for i := 0; i < k && ok; i++ {
			if sz[i] != 2 || visE[i] {
				continue
			}

			compV, compE := 0, 1
			visE[i] = true
			stack = stack[:0]
			stack = append(stack, c1[i], c2[i])

			for len(stack) > 0 {
				v := stack[len(stack)-1]
				stack = stack[:len(stack)-1]
				if visV[v] {
					continue
				}
				visV[v] = true
				compV++

				for e := head[v]; e != -1; e = next[e] {
					j := to[e]
					if sz[j] != 2 {
						continue
					}
					if c1[j] != v && c2[j] != v {
						continue
					}
					if !visE[j] {
						visE[j] = true
						compE++
						stack = append(stack, c1[j], c2[j])
					}
				}
			}

			if compE > compV {
				ok = false
			} else if compE == compV-1 {
				ans = ans * int64(compV) % MOD
			} else if compE == compV {
				ans = ans * 2 % MOD
			} else {
				ok = false
			}
		}

		if !ok {
			out = strconv.AppendInt(out, 0, 10)
		} else {
			out = strconv.AppendInt(out, ans, 10)
		}
		out = append(out, '\n')
	}

	os.Stdout.Write(out)
}