#include <bits/stdc++.h>
#include <regex>
#ifdef _DEBUG
#include "debug.h"
#endif
//#define int ll
#define FOR(i, s, e) for (int i = int(s); i < int(e); ++i)
#define REP(i, e) FOR(i, 0, e)
#define all(v) (v).begin(),(v).end()
#define mkpr make_pair
#define mktp make_tuple
#define tv(tp, i) get<(i)>(tp)
#define CLEAR(obj) obj = decltype(obj)()
#define var auto
#define OUT(type) type &
#define IN(type) const type &
#define self (*this)
#define in :
#define True true
#define False false
using namespace std; using int32 = int32_t; using str = string; using cstr = const str;
using ll = long long; using ull = unsigned long long; using cint = const int; using cll = const ll;
using vi = vector<int>; using vvi = vector<vi>; using vl = vector<ll>; using vvl = vector<vl>;
using vb = vector<bool>; using vvb = vector<vb>; using vd = vector<double>; using vvd = vector<vd>;
using vc = vector<char>; using vvc = vector<vc>; using vs = vector<string>;
using pii = pair<int, int>; using pll = pair<ll, ll>; using pdd = pair<double, double>; using psl = pair<string, ll>;
using tiii = tuple<int, int, int>; using tlll = tuple<ll, ll, ll>;
static const int MGN = 10; static const int ARYSZ_MAX = (int)1e7;
static const ll LINF = LLONG_MAX/2;
#ifdef int
static const int INF = LINF;
#else
static const int INF = INT_MAX/2;
#endif
static double EPS = 1e-9;
#define FASTCIN() cin.tie(0);ios::sync_with_stdio(false);
#ifdef IMPORT_SAMPLE
#define DEBUG_IMPORT(file) vs args(argv, argv+argc);str sample = make_sample(args, file);ifstream ifs(sample); cin.rdbuf(ifs.rdbuf());
#else
#define DEBUG_IMPORT(file)
#endif
static inline bool DBLEQ(double a, double b) {return abs(a - b) < EPS;}
static inline void EPR(str msg) {cerr << msg << endl;}
static inline void AST(bool exp, str msg) {if(!exp){EPR(msg);} assert(exp);}
static inline void TAST(bool exp, str msg) {if(!exp){EPR(msg);} while(!exp){}}

struct llm {
    ll MOD;
    ll val;
    llm(ll val = 0, ll MOD = (ll)1e9+7) {
        self.MOD = MOD;
        self.val = (val % MOD + MOD) % MOD;
    }
    bool operator==(IN(llm) other) const {
        return self.val % MOD == other.val % MOD;
    }
    llm operator-() const {
        return llm(-val);
    }
    llm &operator+=(const llm other) {
        if ((val += other.val) >= MOD) val -= MOD;
        return self;
    }
    llm &operator-=(const llm other) {
        if ((val += MOD - other.val) >= MOD) val -= MOD;
        return self;
    }
    llm &operator*=(const llm other) {
        (val *= other.val) %= MOD;
        return self;
    }
    llm operator+(const llm other) const {
        return llm(*this) += other;
    }
    llm operator-(const llm other) const {
        return llm(self) -= other;
    }
    llm operator*(const llm other) const {
        return llm(self) *= other;
    }
    llm pow(ll n) const {
        if (n == 0)
            return 1;
        llm x = self.pow(n / 2);
        x *= x;
        if (n % 2 == 1)
            x *= self;
        return x;
    }
    llm inv() const {
        return pow(MOD - 2);
    }
    llm &operator/=(const llm other) {
        return self *= other.inv();
    }
    llm operator/(const llm other) const {
        return llm(self) /= other;
    }
};
istream& operator>>(istream& isr, const llm& x) {
    return isr >> x.val;
}
ostream& operator<<(ostream& osr, const llm& x) {
    return osr << x.val;
}

struct NckTblLlm{
    ll MOD;
    vector<llm> fact;
    vector<llm> ifact;
    NckTblLlm(ll N, ll MOD) {
        self.MOD = MOD;
        self.fact = vector<llm>(N+1);
        self.ifact = vector<llm>(N+1);
        self.fact[0] = llm(1, MOD);
        for (ll i = 1; i <= N; i++)
            self.fact[i] = self.fact[i-1] * i;
        self.ifact[N] = self.fact[N].inv();
        for (ll i = N; i >0; i--)
            self.ifact[i-1] = self.ifact[i] * i;
    }
    llm nck_mod(ll n, ll k) {
        if (k < 0 or n < k)
            return llm(0, MOD);
        return self.fact[n] * self.ifact[k] * self.ifact[n-k];
    }
};


int32 main(int32 argc, char* argv[]) {
    FASTCIN();
    DEBUG_IMPORT("sample-3");


    ll MOD = 1e9 +7;
    ll H,W,A,B; cin>>H>>W>>A>>B;

    var tbl = NckTblLlm(H + W, MOD);

    llm ans = 0;
    int i = H-A-1, j = B;
    while (i>=0 and j < W) {
        ans += tbl.nck_mod(i+j, i) * tbl.nck_mod(H-1-i+W-1-j, H-1-i);
        i--; j++;
    }

    cout << ans << endl;


    return 0;
}


Measured memory_bytes: 6528