#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using LL = long long;

const int maxn = 3e3;
const int mod = 1e9 + 7;
const int maxdimsum = 2e5;
ll pw(ll x, ll y) {
  ll cur = x;
  ll ans = 1;
  while (y > 0) {
    if (y % 2 == 1) ans = (ans * cur) % mod;
    cur = (cur * cur) % mod;
    y /= 2;
  }
  return ans;
}
ll fact[maxdimsum + 10], invfact[maxdimsum + 10];
int h, w, n;
int r[maxn + 10], c[maxn + 10];
ll dp[maxn + 10];

ll mul(ll x, ll y) {
  return (x * y) % mod;
}
ll choose(int n, int k) {
  return mul(fact[n], mul(invfact[k], invfact[n - k]));
}
ll paths(int x, int y) {
  return choose(x + y, x);
}
ll find(int i) {
  if (dp[i] == -1) {
    dp[i] = paths(h - r[i], w - c[i]);
    for (int j = 1; j <= n; j++) {
      if (j == i) continue;
      if (r[i] <= r[j] && c[i] <= c[j]) {
        dp[i] = (dp[i] - mul(paths(r[j] - r[i], c[j] - c[i]), find(j)) + mod) % mod;
      }
    }
  }
  return dp[i];
}

int main() {
  ios::sync_with_stdio(false);
  // cin.tie(NULL);

  cin >> h >> w >> n;
  for (int i = 1; i <= n; i++) {
    cin >> r[i] >> c[i];
  }
  r[0] = c[0] = 1;
  invfact[0] = fact[0] = 1;
  for (int i = 1; i <= maxdimsum; i++) {
    fact[i] = mul(i, fact[i - 1]);
    invfact[i] = pw(fact[i], mod - 2);
  }
  memset(dp, -1, sizeof(dp));
  cout << find(0) << '\n';

  return 0;
}