#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const long long mxn = 2005;
const long long mxm = 1e5 + 5;
long long n, m, k, s;
long long fac[2 * mxm];
long long chia[25];
long long f[mxn][25];
long long toEnd[mxn];
long long dis[mxn][mxn];
pair<long long, long long> a[mxn];
void init() {
  fac[0] = 1, chia[0] = s;
  for (long long i = 1; i < mxm * 2; i++) fac[i] = (fac[i - 1] * i) % MOD;
  for (long long i = 1; i < 21; i++) chia[i] = (chia[i - 1] + 1) / 2;
}
long long mu(long long u, long long v) {
  long long res = 1;
  while (v > 0) {
    if (v % 2) res = res * u % MOD;
    v /= 2;
    u = u * u % MOD;
  }
  return res;
}
long long C(long long u, long long v) {
  long long ans = fac[v] * mu(fac[v - u] * fac[u] % MOD, MOD - 2) % MOD;
  return ans;
}
bool in(long long u, long long v) {
  return (a[u].first <= a[v].first && a[u].second <= a[v].second);
}
void cal_dis() {
  for (long long i = 0; i <= k + 1; i++)
    for (long long j = i; j <= k + 1; j++) {
      if (!in(i, j)) continue;
      long long u = a[j].first - a[i].first, v = a[j].second - a[i].second;
      dis[i][j] = dis[j][i] = C(u, u + v);
    }
}
void init2() {
  for (long long i = 1; i <= k; i++) toEnd[i] = dis[i][k + 1];
  for (long long i = k; i >= 1; i--)
    for (long long j = k; j > i; j--) {
      if (!in(i, j)) continue;
      if (in(i, j))
        toEnd[i] = (toEnd[i] - toEnd[j] * dis[i][j] % MOD + MOD * MOD) % MOD;
    }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> k >> s;
  for (long long i = 1; i <= k; i++) cin >> a[i].first >> a[i].second;
  sort(a + 1, a + 1 + k);
  a[0] = {1, 1};
  a[k + 1] = {n, m};
  init();
  cal_dis();
  init2();
  if (n == 1 || m == 1) {
    cout << chia[min(k, 20 * 1LL)];
    return 0;
  }
  for (long long i = 1; i <= k; i++) f[i][1] = dis[0][i];
  for (long long i = 1; i <= k; i++)
    for (long long j = 1; j < i; j++)
      if (in(j, i))
        f[i][1] = (f[i][1] - dis[j][i] * f[j][1] % MOD + MOD * MOD) % MOD;
  for (long long i = 1; i <= 20; i++) {
    for (long long first = 1; first <= k; first++)
      for (long long second = first + 1; second <= k; second++)
        if (in(first, second))
          f[second][i + 1] =
              (f[second][i + 1] + f[first][i] * dis[first][second] % MOD) % MOD;
    for (long long second = 1; second <= k; second++) {
      for (long long first = 1; first < second; first++) {
        if (in(first, second))
          f[second][i + 1] =
              (f[second][i + 1] - f[first][i + 1] * dis[first][second] % MOD +
               MOD * MOD) %
              MOD;
      }
    }
  }
  long long anom_route = 0;
  long long tru = 0;
  for (long long i = 1; i <= 20; i++) {
    for (long long first = 1; first <= k; first++) {
      if (i != 20)
        f[first][i] = f[first][i] * toEnd[first] % MOD;
      else
        f[first][i] = f[first][i] * dis[first][k + 1] % MOD;
      anom_route = (anom_route + f[first][i] * chia[i] % MOD) % MOD;
      tru = (tru + f[first][i]) % MOD;
    }
  }
  long long div = dis[0][k + 1];
  long long ans = (anom_route + s * (div - tru + MOD) % MOD) % MOD;
  cout << ans * mu(div, MOD - 2) % MOD;
}
