#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
std::ostream &operator<<(std::ostream &os, const std::pair<T1, T2> &v) {
  os << "(" << v.first << "," << v.second << ")";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) {
  for (auto && (x) : (v)) {
    os << x << ",";
  }
  return os;
}
long long mod = 1000000007;
const long double pi = 3.14159265358979323846264338327950288419716939937510;
inline void fm(long long &a, long long &m = mod) {
  a %= m;
  if (a < 0) a += m;
}
inline long long po(long long a, long long b, long long &m = mod) {
  long long res = 1 % m;
  fm(a, m);
  for (; b; b >>= 1) {
    if (b & (1LL)) res = res * a % m;
    a = a * a % m;
  }
  return res;
}
inline long long inv(long long a, long long &m = mod) {
  fm(a, m);
  return po(a, m - 2, m);
}
const long double eps = 1e-10;
const int oo = 1000000009;
const long long ooo = 2e18 + 5;
long long sl() {
  int c = getchar();
  while ((c < '0' || c > '9') && c != '-') {
    c = getchar();
  }
  bool sign = 0;
  if (c == '-') {
    sign = 1;
    c = getchar();
  }
  long long ret = 0;
  while (c >= '0' && c <= '9') {
    ret = 10 * ret + c - 48;
    c = getchar();
  }
  if (sign) return -ret;
  return ret;
}
int ss(char *s) {
  int n = 0;
  int c = getchar();
  while (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) c = getchar();
  while (((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
    s[n] = (char)(c);
    n++;
    c = getchar();
  }
  return n;
}
pair<int, int> a[2005];
long long dp[2005][2];
long long f[200005];
long long fi[200005];
inline long long choose(int x, int y) {
  long long ans = (f[x] * fi[y]) % mod;
  ans = (ans * fi[x - y]) % mod;
  return ans;
}
int main() {
  srand((unsigned int)time(0));
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  f[0] = 1;
  for (int i = 1; i < 200005; i++) {
    f[i] = (f[i - 1] * i) % mod;
  }
  for (int i = 0; i < 200005; i++) {
    fi[i] = inv(f[i]);
  }
  int h, w;
  cin >> h >> w;
  int n;
  cin >> n;
  a[0].first = 1;
  a[0].second = 1;
  dp[0][1] = 1;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].first >> a[i].second;
  }
  sort(a + 1, a + n + 1);
  a[n + 1].first = h;
  a[n + 1].second = w;
  for (int i = 1; i <= n + 1; i++) {
    for (int j = 0; j < i; j++) {
      if (a[i].first < a[j].first || a[i].second < a[j].second) continue;
      dp[i][0] += choose(a[i].first + a[i].second - a[j].first - a[j].second,
                         a[i].first - a[j].first) *
                  dp[j][1];
      dp[i][0] %= mod;
      dp[i][1] += choose(a[i].first + a[i].second - a[j].first - a[j].second,
                         a[i].first - a[j].first) *
                  dp[j][0];
      dp[i][1] %= mod;
    }
  }
  long long ans = dp[n + 1][0] - dp[n + 1][1];
  if (ans < 0) ans += mod;
  cout << ans << '\n';
  return 0;
}
