#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=3e3+10;
const int M=1e5+10;
const int mod=1e9+7;
int n,m,t,fac[M<<1],inv[M<<1],dp[N];
struct node{
	int r,c;
	node(int rr=0,int cc=0){r=rr;c=cc;}
	bool operator <(const node&e)const{return c<e.c||(c==e.c&&r<e.r);}//woc你怎么又忘了元素相等时要特殊判断啊！ 
}w[N];
inline void Add(int &x,int y){x+=y;x-=x>=mod? mod:0;}
inline void Preprocess(){
	fac[0]=1;for(register int i=1;i<=n+m;i++)fac[i]=1ll*fac[i-1]*i%mod;
	inv[0]=inv[1]=1;for(register int i=2;i<=n+m;i++)inv[i]=(-1ll*mod/i*inv[mod%i]%mod+mod)%mod;
	for(register int i=2;i<=n+m;i++)inv[i]=1ll*inv[i-1]*inv[i]%mod;
}
inline int C(int n,int m){if(n<0||m<0||n<m)return 0;return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
int main(){
	scanf("%d%d%d",&n,&m,&t);
	for(register int i=1;i<=t;i++)
		scanf("%d%d",&w[i].r,&w[i].c);
	sort(w+1,w+t+1);w[++t]=node(n,m);Preprocess();
	for(register int i=1;i<=t;i++){
		dp[i]=C(w[i].r+w[i].c-2,w[i].r-1);
		for(register int j=1;j<i;j++)
			if(w[j].r<=w[i].r)Add(dp[i],mod-1ll*dp[j]*C(w[i].r-w[j].r+w[i].c-w[j].c,w[i].r-w[j].r)%mod);
	}
	printf("%d\n",dp[t]);
	return 0;
}