#include <bits/stdc++.h>
 
using namespace std;
 
//#define PRAGMA 448
#ifdef PRAGMA
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#endif
 
#ifdef LUCARIO
#define deb(...) fprintf(stderr,__VA_ARGS__)
#define deb1(x) cerr << #x << " = " << x << endl
#else
#define deb(...) 0
#define deb1(x) 0
#endif
 
typedef pair<long long,long long> pll;
typedef pair<int,int> pii;

#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define ld long double
#define int long long
#define pb push_back
#define bs binary_search
#define up upper_bound
#define lb lower_bound
#define f first 
#define s second 
#define ff first.first
#define fs first.second
#define sf second.first
#define ss second.second
#define mp make_pair    
#define endl "\n"
 
#define fore(i,a,b) for(ll i = a; i < b; i++)
#define rfore(i, a, b) for(ll i = b - 1; i >= a; i--)
#define forev(a,b) fore(i,0,b)cout<<a[i]<<" "; 
#define ing(g,u,v)  g[u].pb(v); g[v].pb(u);
#define ingp(g,u,v,c) (g[u].pb({v,c});g[v].pb({u,c});)
#define mm(a,b) memset(a , b , sizeof a) 
#define trans(a,b) trasform(a.begin(),a.end(),a.begin(),b)
#define np(a) next_permutation(a.begin(), a.end())
#define ALL(a) a.begin(),a.end() 
#define SZ(n) ((ll) (n).size())
#define sfind(s,t) (s.find(t) != string::npos)
 
#define infll (ll)1e18+3
#define infi  (int)(1e9+1)
#define PI 3.14159265359 
#define mod (ll)(1e9+7)
#define eps  1e-10

ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b,a%b); } 
ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); }

#define MAXN 300005
const long long M = 1e9 + 7;
long long fact[MAXN];

long long modexp(long long a, long long b){
    long long res = 1;
    while(b){
        if(b & 1)
            res = (res * a) % M;
        b >>= 1;
        a = (a*a) % M;
    }
    return res;
}

void init_fact(){
    fact[0]= 1;
    for(int i = 1; i < MAXN; i++){
        fact[i] = (fact[i-1] * i) % M;
    }
}

int F(pll x, pll y){
    //f(x.f == y.f ||x.s == y.s)return 1;
    int xx = y.f-x.f,yy = y.s-x.s;
    int a1 = fact[xx+yy];
    int a2 = fact[xx];
    int a3 = fact[yy];
    int a4 = modexp(a2,M-2)%M;
    int a5 = modexp(a3,M-2)%M;
    return (((a1*a4)%M)*a5)%mod;
}

int32_t main(int32_t argc, char const *argv[]){
    FIN;
    init_fact();
    int x,y;
    int n;cin>>x>>y>>n;
    n++;
    pll a[n];
    a[n-1]={x,y};
    fore(i,0,n-1)cin>>a[i].f>>a[i].s;
    sort(a,a+n);

    int ans[n];
    fore(i,0,n)ans[i] = F({1,1},a[i]);
    fore(i,0,n-1){
        fore(j,i+1,n){
            if(a[j].f < a[i].f || a[j].s < a[i].s)continue;
            ans[j] = (ans[j] - (ans[i]*F(a[i],a[j])%mod) +mod)%mod;
        }
    }

    cout<<ans[n-1];


    return 0;
}





/*
Para las DP:

Los arreglos donde estén los valores en lo posible se declaran como INT
siempre hacer int &r = dp...
int res y trabajas todo con res
luego haces return r = res
cuando se trabaja se hace solve(...)+a[x];


Fórmulas:

priority_queue < int,vector<int>,greater<int> > q; calse contenedor y comparacion

cero = r/k  - (l/k + (l%k!=0)) +1; cantidad de números divisibles por k en el intervalo [l, r]
cantidad de inmeros en un rango lower_bound(r) -lowerbound(l-1)
upper_bound primer elemento mayor estricto
lower_bound primer elemento mayor o igual
Al hacer BFS con distancia recordar simpre antes de visitar preguntar si ya llegue antes con
un peso menor 
setprecision(15)
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
getline(cin,s); donde s es un string
si luego se van a haces unuevos cins hacer cin.ignore



TCL
 
tuple tuple<tipo> nombre
    se accede con get<pos>(nombre)

*/




Measured memory_bytes: 2816