#ifndef ENV_AC
    #define ENV_AC
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <iomanip>
    #include <algorithm>
    #include <bitset>
    #include <array>
    #include <vector>
    #include <queue>
    #include <set>
    #include <cmath> // 変数名にy1が使えなくなるかも…。
    #include <map>
    #include <unordered_map>
    #include <unordered_set>
    #include <limits>
    #include <functional>
    #include <string>
    #include <ext/rope>

    using int128_t = __int128_t;
    std::istream &operator>>(std::istream& input, int128_t& value) { // int128_tの入力。入力が64bitに収まる前提。
        int64_t tmp; input >> tmp; value = tmp;
        return input;
    }
    std::ostream &operator<<(std::ostream& output, const int128_t value) { // int128_tの出力。出力が64bitに収まる前提。
        output << (int64_t)value;
        return output;
    }

    namespace std {
        template<> class hash<int128_t>{
            public:
            size_t operator () ( const int128_t &x ) const {
                int64_t INF64 = std::numeric_limits<int64_t>::max();
                int64_t y1 = x / INF64;
                int64_t y2 = x % INF64;
                return hash<int64_t>()(y1) ^ hash<int64_t>()(y2);
            }
        };
    }

    int128_t imax(const int128_t a, const int128_t b) { return std::max(a, b); } // std::max, std::min は型が違うとエラーになるため、ラッパーを作る。
    int128_t imin(const int128_t a, const int128_t b) { return std::min(a, b); }
    int128_t iabs(const int128_t x) { return 0 <= x ? x : -x; }
    int128_t ipow(const int128_t x, const int128_t n) { int128_t ret = 1; for (int i = 0; i < n; i++) { ret *= x; } return ret; }

    #define rep(i, begin, end) for(int64_t i = ((int64_t)begin); i <= ((int64_t)end); i++) // (int64_t)end としておくと、end = v.size() - 2 みたいな入力で、v.size()が1でも正常(end = -1になる）に挙動する。
    #define rev(i, begin, end) for(int64_t i = ((int64_t)begin); ((int64_t)end) <= i; i--) // int128_tにすると、3重ループでコンパイルエラーになったのでint64_tにしておく。

    #define input1(begin, end, v1) v1.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i]; }
    #define input2(begin, end, v1, v2) v1.resize((end)+1); v2.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i] >> v2[i]; } 
    #define input3(begin, end, v1, v2, v3) v1.resize((end)+1); v2.resize((end)+1); v3.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i] >> v2[i] >> v3[i]; }
    #define input4(begin, end, v1, v2, v3, v4) v1.resize((end)+1); v2.resize((end)+1); v3.resize((end)+1); v4.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i] >> v2[i] >> v3[i] >> v4[i]; } 
    #define input5(begin, end, v1, v2, v3, v4, v5) v1.resize((end)+1); v2.resize((end)+1); v3.resize((end)+1); v4.resize((end)+1); v5.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i] >> v2[i] >> v3[i] >> v4[i] >> v5[i]; }  
    // input_arrayはbegin = 0のときのみ動作確認。Aの要素の型をテンプレートにして関数にしたほうが丁寧かもしれない。
    #define input_array(begin, N, M, A) A.resize((begin)+(N)); for (int i = 0; i < (begin)+(N); i++) { A[i].resize((begin)+(M)); } for (int i = begin; i < (begin)+(N); i++) { for (int j = begin; j < (begin)+(M); j++) { std::cin >> A[i][j]; }}

    std::vector<int> irange(const int begin, const int end) {
        std::vector<int> ret; for (int i = begin; i <= end; i++) { ret.push_back(i); }
        return ret;
    }

    template <typename T>
    std::vector<T> accumulate_vec(const std::vector<T>& vec, const bool reverse = false) {
        std::vector<T> ret; ret.resize(vec.size());
        if (reverse == false) {
            ret[0] = vec[0];
            for (int i = 1; i < ret.size(); i++) {
                ret[i] = ret[i-1] + vec[i];
            }
        } else {
            ret[ret.size()-1] = vec[ret.size()-1];
            for (int i = ret.size() - 2; 0 <= i; i--) {
                ret[i] = ret[i+1] + vec[i];
            }
        }
        return ret;
    }

    template <typename T>
    void printvec(const std::vector<T>& vec) {
        for (int i = 0; i < vec.size(); i++) { std::cout << vec[i] << " "; } std::cout << std::endl;
    }
#endif

template <int128_t mod> class Mod_Int {
    public:
    int128_t val;

    void calc() {
        if (val < 0) { val += ((iabs(val) + mod) / mod) * mod; }
        val %= mod;
    }
    Mod_Int(const int128_t _val = 0) { val = _val; calc(); }
    int128_t INT() { return val; } // 使用は非想定
    int128_t MOD() { return mod; } // 使用は非想定
    Mod_Int operator-() const { return Mod_Int(-val); }
    Mod_Int operator+(const Mod_Int &r) const { return Mod_Int(val + r.val); }
    Mod_Int operator-(const Mod_Int &r) const { return Mod_Int(val - r.val); }
    Mod_Int operator*(const Mod_Int &r) const { return Mod_Int(val * r.val); }
    //Mod_Int operator/(const Mod_Int &r) const { return ; } // ユークリッド互除法を使うべきだが保留。
    Mod_Int& operator+=(const Mod_Int &r) { val += r.val; calc(); return *this; }
    Mod_Int& operator-=(const Mod_Int &r) { val -= r.val; calc(); return *this; }
    Mod_Int& operator*=(const Mod_Int &r) { val *= r.val; calc(); return *this; }
    Mod_Int& operator++() { return (*this) += 1; }
    Mod_Int& operator--() { return (*this) -= 1; }
    Mod_Int operator++(int) { Mod_Int tmp = *this; ++*this; return tmp; }
    Mod_Int operator--(int) { Mod_Int tmp = *this; --*this; return tmp; }
    bool operator==(const Mod_Int &r) const { return val == r.val; }
    bool operator!=(const Mod_Int &r) const { return val != r.val; }

    friend std::istream &operator>>(std::istream& input, Mod_Int& r) { 
        int128_t tmp; input >> tmp;
        r = Mod_Int(tmp);
        return input;
    }
    friend std::ostream &operator<<(std::ostream& output, const Mod_Int& r) { 
        output << r.val;
        return output;
    }
};

int128_t cal_mod(const int128_t n, const int128_t mod) {
    // n % modを計算する。ただしmod <= 0 ならば何もしない。nが負の場合、正にして補正する。
    if (mod <= 0) {
        return n;
    } else if (0 <= n) {
        return n % mod;
    } else {
        int128_t tmp = (-n) / mod + 1;
        return (n + tmp * mod) % mod;
    }
}

int128_t pow_mod(int128_t x, int128_t n, const int128_t mod) {
    // 累乗の計算。mod <= 0ならば余りの計算は行わない。
    int128_t ret = 1;
    while (n > 0) {
        if (n & 1) { ret = cal_mod(ret * x, mod); }
        x = cal_mod(x * x, mod);
        n = (n >> 1);
    }
    return ret;
}

class Combi_Num {
    // 「組み合わせ数 % 素数」を、前処理を行ったうえでO(1)で求める。modは32bitに収まることが前提。
    public:
    int128_t mod;
    std::vector<int128_t> factorial, factorial_inv, inv;
    Combi_Num() {}
    Combi_Num(const int n, const int128_t mod_in) {
        mod = mod_in;
        factorial.resize(n+1, 0);
        factorial_inv.resize(n+1, 0);
        inv.resize(n+1, 0);
        factorial[0] = 1;
        factorial_inv[0] = 1;
        inv[0] = 1;
        for (int i = 1; i <= n; i++) {
            factorial[i] = (factorial[i-1] * i) % mod;
            inv[i] = pow_mod(i, mod - 2, mod);
            factorial_inv[i] = (factorial_inv[i-1] * inv[i]) % mod;
        }
    }

    int128_t combi(const int n, const int r) const {
        return (factorial[n] * ((factorial_inv[r] * factorial_inv[n-r]) % mod)) % mod;
    }

    int128_t perm(const int n, const int r) const {
        return (factorial[n] * factorial_inv[n-r]) % mod;
    }

    // n個の要素をr個のグループに分ける場合の数。ただし各グループに最低でもm個の要素を入れる。
    // mとしては主に0か1を想定している。
    // 0個の要素を0個のグループに分ける場合の数は1とし、正の個数の要素を0個のグループに分ける場合の数は0とする。
    int128_t separate(const int n, const int r, const int m) const {
        if (n < r * m) { return 0; }
        if (0 < m) { return separate(n - r*m, r, 0); }
        if (n == 0) { return 1; }
        if (r == 0) { return 0; }
        return combi(n + r - 1, r - 1);
    }
};

//--code begin--

int128_t H, W, N;
std::vector<int128_t> r, c;
//std::vector<std::vector<int128_t>> a;
//std::string K;
//std::vector<std::string> a;
//double X;
//std::vector<double> p;

const int128_t MAX_N = 3e3 + 10;
const int128_t MOD = 1e9 + 7;
//const int128_t INF = std::numeric_limits<int64_t>::max();
//const double EPS = 1.0e-15;
using mnt = Mod_Int<MOD>;

mnt dp[MAX_N][2] = {};
Combi_Num cn(2e5 + 10, MOD);

int main(int argc, char **argv) {
    std::cin.tie(0);
   	std::ios::sync_with_stdio(false);
    std::cout << std::fixed << std::setprecision(15);

    std::cin >> H >> W >> N;
    input2(1, N, r, c);

    r[0] = 1;
    c[0] = 1;
    r.push_back(H);
    c.push_back(W);

    assert(r.size() == N + 2);
    assert(c.size() == N + 2);

    auto vec = irange(0, N + 1);
    std::sort(vec.begin(), vec.end(), [&](int128_t i, int128_t j){
        if (r[i] != r[j]) {
            return r[i] < r[j];
        }
        return c[i] < c[j];
    });

    auto rcp = r;
    auto ccp = c;

    rep (i, 0, N + 1) {
        r[i] = rcp[vec[i]];
        c[i] = ccp[vec[i]];
    }
    assert(r[N+1] == H);
    assert(c[N+1] == W);

    dp[0][0] = 1;

    rep (i, 0, N) {
        rep (j, i + 1, N + 1) {
            if (r[i] <= r[j] && c[i] <= c[j]) {
                dp[j][1] += dp[i][0] * cn.combi(c[j] - c[i] + r[j] - r[i], c[j] - c[i]);
                dp[j][0] += dp[i][1] * cn.combi(c[j] - c[i] + r[j] - r[i], c[j] - c[i]);
            }
        }
    }

    std::cout << dp[N+1][1] - dp[N+1][0] << std::endl;


    return 0;
}

Measured memory_bytes: 12032