#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int maxn = 2e5 + 5;
int a[30], fac[maxn], ine[maxn], g[maxn][30];
struct node {
  int x, y;
} e[3000];
bool cmp(node a, node b) { return a.x == b.x ? a.y < b.y : a.x < b.x; }
int C(int x, int y) { return 1ll * fac[x] * ine[y] % mod * ine[x - y] % mod; }
int qpow(int x, int y) {
  int cnt = 1;
  while (y) {
    if (y & 1) cnt = 1ll * cnt * x % mod;
    y >>= 1;
    x = 1ll * x * x % mod;
  }
  return cnt;
}
int main() {
  int n, m, k, s;
  cin >> n >> m >> k >> s;
  fac[0] = 1;
  for (int i = 1; i <= n + m; ++i) fac[i] = 1ll * fac[i - 1] * i % mod;
  ine[n + m] = qpow(fac[n + m], mod - 2);
  for (int i = n + m; i >= 1; --i) ine[i - 1] = 1ll * ine[i] * (i) % mod;
  int len = 0;
  a[0] = s;
  for (len = 1; s != 1; len++) a[len] = s = (s + 1) / 2;
  len--;
  for (int i = 1; i <= k; ++i) cin >> e[i].x >> e[i].y;
  sort(e + 1, e + k + 1, cmp);
  e[0].x = e[0].y = 1;
  for (int i = k; i >= 0; --i) {
    for (int j = 0; j < len; ++j) {
      g[i][j] = C(n - e[i].x + m - e[i].y, n - e[i].x);
      for (int l = k; l > i; --l) {
        if (e[i].y <= e[l].y) {
          g[i][j] = (g[i][j] - 1ll * g[l][j] *
                                   C(e[l].x - e[i].x + e[l].y - e[i].y,
                                     e[l].x - e[i].x)) %
                    mod;
        }
      }
    }
    g[i][len] = C(n - e[i].x + m - e[i].y, n - e[i].x);
    for (int j = len; j >= 1; --j) g[i][j] = (g[i][j] - g[i][j - 1]) % mod;
  }
  int ans = 0;
  for (int i = 0; i <= len; ++i)
    ans = (ans + 1ll * (g[0][i] + mod) * a[i]) % mod;
  ans = 1ll * ans * qpow(C(n + m - 2, n - 1), mod - 2) % mod;
  cout << ans << endl;
}
