#include <bits/stdc++.h>
using namespace std;
#define int long long
#define p (int)(1e9 + 7)

int MOD(int a){
	return (a %= p) >= 0 ? a : a + p;
}

int power(int a, int N){
	if(N == 0){
		return 1;
	}
	else if(N % 2 == 0){
		return power(MOD(a * a), N / 2);
	}
	else{
		return MOD(a * power(a, N - 1));
	}
}

int inverse(int a){
	return power(a, p - 2);
}

#define inf (int)(1e9)

struct edge{
	int to;
	int cost;

	edge(int to, int cost) : to(to), cost(cost){}
};

vector<int> dijkstra(vector<vector<edge> > &g, int s){
	vector<int> ans(g.size(), inf);
	priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;//(距離, 頂点番号)
	q.push(pair<int, int>(0, s));
	while(q.size() > 0){
		int dis = q.top().first, v = q.top().second;
		q.pop();
		if(dis < ans[v]){
			ans[v] = dis;
			for(int i = 0; i < g[v].size(); i++){
				q.push(pair<int, int>(dis + g[v][i].cost, g[v][i].to));
			}
		}
	}
	return ans;
}

int h, w;
int inv2, inv6;

int align(int i, int j){
	return i * w + j;
}

int calc(int dis, int x1, int dx1, int x2, int dx2, int y1, int dy1, int y2, int dy2){
//	printf("calc(%lld, %lld, %lld, %lld, %lld, %lld, %lld, %lld, %lld)\n", dis, x1, dx1, x2, dx2, y1, dy1, y2, dy2);
	if(x2 < x1){
		return calc(dis, x2, dx2, x1, dx1, y2, dy2, y1, dy1);
	}
	else if(y2 < y1){
		return calc(dis + dx2 - dx1, x1, dx2, x2 + dx2 - dx1, dx1, y2, dy2, y1, dy1);
	}
	else if(x1 == x2){
		return calc(dis, y1, dy1, y2, dy2, x1, dx1, x2, dx2);
	}
	if(y1 == y2){
		if(dy1 == 1){
//			printf("test1\n");
			return MOD(inv2 * MOD(MOD(dx1 * dx2) * (2 * dis + (dx2 - dx1))));
		}
		else{
//			printf("test2\n");
			return MOD(inv6 * MOD(MOD(MOD(dx1 * dx2) * dy1) * (MOD(3 * dy1 * (2 * (x2 - x1) + (dx2 - dx1))) + MOD(2 * (dy1 - 1) * (dy1 + 1)))));
		}
	}
	else{
//		printf("test3\n");
		return MOD(inv2 * MOD(MOD(MOD(dx1 * dx2) * MOD(dy1 * dy2)) * MOD(2 * dis + (dx2 - dx1) + (dy2 - dy1))));
	}
}

signed main(){
	int H, W, N, i, j, k, l;
	scanf("%lld%lld", &H, &W);
	scanf("%lld", &N);
	vector<int> x_sub(N), y_sub(N), x(0), y(0);
	for(i = 0; i < N; i++){
		scanf("%lld%lld", &x_sub[i], &y_sub[i]);
		x.push_back(x_sub[i]);
		x.push_back(x_sub[i] + 1);
		x.push_back(max(0ll, x_sub[i] - 1));
		y.push_back(y_sub[i]);
		y.push_back(y_sub[i] + 1);
		y.push_back(max(0ll, y_sub[i] - 1));
	}
	x.push_back(0);
	x.push_back(H);
	y.push_back(0);
	y.push_back(W);
	sort(x.begin(), x.end());
	sort(y.begin(), y.end());
	for(i = 1, j = 1; j < x.size(); j++){
		if(x[j - 1] < x[j]){
			x[i] = x[j];
			i++;
		}
	}
	h = i - 1;
	for(i = 1, j = 1; j < y.size(); j++){
		if(y[j - 1] < y[j]){
			y[i] = y[j];
			i++;
		}
	}
	w = i - 1;
	vector<int> dx(h), dy(w);
	for(i = 0; i < h; i++){
		dx[i] = x[i + 1] - x[i];
	}
	for(i = 0; i < w; i++){
		dy[i] = y[i + 1] - y[i];
	}
/*	printf("x:\n");
	for(i = 0; i < h; i++){
		printf("%lld ", x[i]);
	}
	printf("\n");
	printf("dx:\n");
	for(i = 0; i < h; i++){
		printf("%lld ", dx[i]);
	}
	printf("\n");
	printf("y:\n");
	for(j = 0; j < w; j++){
		printf("%lld ", y[j]);
	}
	printf("\n");
	printf("dy:\n");
	for(i = 0; i < w; i++){
		printf("%lld ", dy[i]);
	}
	printf("\n");
*/	vector<vector<char>> A(h, vector<char>(w, '.'));
	for(i = 0; i < h; i++){
		for(j = 0; j < w; j++){
			for(k = 0; k < N; k++){
				if(x[i] == x_sub[k] && y[j] == y_sub[k]){
					A[i][j] = '#';
				}
			}
		}
	}
/*	printf("A:\n");
	for(i = 0; i < h; i++){
		for(j = 0; j < w; j++){
			printf("%c", A[i][j]);
		}
		printf("\n");
	}
	printf("\n");
*/
/*	vector<vector<edge>> g(h * w, vector<edge>());
	for(i = 0; i < h; i++){
		for(j = 1; j < w; j++){
			if(A[i][j - 1] == '.' && A[i][j] == '.'){
				g[align(i, j - 1)].push_back(edge(align(i, j), y[j] - y[j - 1]));
				g[align(i, j)].push_back(edge(align(i, j - 1), y[j] - y[j - 1]));
			}
		}
	}
	for(i = 1; i < h; i++){
		for(j = 0; j < w; j++){
			if(A[i - 1][j] == '.' && A[i][j] == '.'){
				g[align(i - 1, j)].push_back(edge(align(i, j), x[i] - x[i - 1]));
				g[align(i, j)].push_back(edge(align(i - 1, j), x[i] - x[i - 1]));
			}
		}
	}
*/	vector<vector<int>> dis(h, vector<int>(w, inf));
	int ans = 0;
	inv2 = inverse(2);
	inv6 = inverse(6);
	for(i = 0; i < h; i++){
		for(j = 0; j < w; j++){
			if(A[i][j] == '#'){
				continue;
			}
//			printf("(i, j) = (%lld, %lld)\n", i, j);
			int sub = MOD(inv6 * MOD(MOD(dx[i] * dy[j]) * MOD((dx[i] + dy[j]) * MOD(dx[i] * dy[j] - 1))));
//			printf("ans += 2 * %lld\n", sub);
			ans = MOD(ans + sub);
			int old_dis = dis[i][j];
			for(k = 0; k < h; k++){
				for(l = 0; l < w; l++){
					dis[k][l] += old_dis;
				}
			}
			queue<pair<pair<int, int>, int>> q;
			q.push(pair<pair<int, int>, int>(pair<int, int>(i, j), 0));
			while(q.size() > 0){
				k = q.front().first.first;
				l = q.front().first.second;
				int d = q.front().second;
				q.pop();
				if(A[k][l] == '#' || dis[k][l] <= d){
					continue;
				}
				dis[k][l] = d;
				if(l < w - 1){
					q.push(pair<pair<int, int>, int>(pair<int, int>(k + 0, l + 1), d + dy[l]));
				}
				if(k < h - 1){
					q.push(pair<pair<int, int>, int>(pair<int, int>(k + 1, l + 0), d + dx[k]));
				}
				if(l > 0){
					q.push(pair<pair<int, int>, int>(pair<int, int>(k + 0, l - 1), d + dy[l - 1]));
				}
				if(k > 0){
					q.push(pair<pair<int, int>, int>(pair<int, int>(k - 1, l + 0), d + dx[k - 1]));
				}
			}
//			vector<int> dis = dijkstra(g, align(i, j));
			for(k = 0; k < h; k++){
				for(l = 0; l < w; l++){
					if(k < i || (i == k && l <= j) || A[k][l] == '#'){
						continue;
					}
//					printf("(k, l) = (%lld, %lld)\n", k, l);
					int res = calc(dis[k][l], x[i], dx[i], x[k], dx[k], y[j], dy[j], y[l], dy[l]);
//					printf("ans += %lld\n", res);
					ans = MOD(ans + res);
				}
			}
//			printf("\n");
		}
	}
//	ans = MOD(ans * inv2);
	printf("%lld\n", ans);
	return 0;
}

Measured memory_bytes: 384