#include <bits/stdc++.h>
using namespace std;
void RI() {}
template <typename... T>
void RI(int &head, T &...tail) {
  scanf("%d", &head);
  RI(tail...);
}
const int MOD = 1e9 + 7;
inline int sgn(long long x) { return (x > 0) - (x < 0); }
struct P {
  long long x, y;
  void read() {
    cin >> x >> y;
    x *= 2;
    y *= 2;
  }
  double ang() { return atan2(y, x); }
} p[217];
P operator-(const P &a, const P &b) { return P{a.x - b.x, a.y - b.y}; }
long long operator*(const P &a, const P &b) { return a.x * b.y - b.x * a.y; }
long long X(const P &o, const P &a, const P &b) { return (a - o) * (b - o); }
int dir(const P &o, const P &a, const P &b) { return sgn(X(o, a, b)); }
bool is_jiao(long long a, long long b, long long c, long long d) {
  return max(a, b) >= min(c, d) && max(c, d) >= min(a, b);
}
bool is_jiao(const P &a, const P &b, const P &c, const P &d) {
  if (!is_jiao(a.x, b.x, c.x, d.x)) return 0;
  if (!is_jiao(a.y, b.y, c.y, d.y)) return 0;
  if (dir(a, b, c) * dir(a, b, d) > 0) return 0;
  if (dir(c, d, a) * dir(c, d, b) > 0) return 0;
  return 1;
}
const double pi = acos(-1);
double get_ang(const P &o, const P &a, const P &b) {
  double da = (a - o).ang();
  double db = (b - o).ang();
  double d = db - da;
  while (d < -pi) d += 2 * pi;
  while (d >= pi) d -= 2 * pi;
  return d;
}
int n;
bool good[217][217];
int dp[217][217];
bool vis[217][217];
int go(int l, int r) {
  if (l + 1 == r) return 1;
  if (vis[l][r]) return dp[l][r];
  vis[l][r] = 1;
  long long ret = 0;
  for (int i = (l + 1); i <= int(r - 1); i++)
    if (good[l][i] && good[r][i]) ret += 1LL * go(l, i) * go(i, r) % MOD;
  return dp[l][r] = ret % MOD;
}
int main() {
  RI(n);
  if (n == 3) return puts("1"), 0;
  for (int i = 0; i < int(n); i++) p[i].read();
  p[n] = p[0];
  for (int i = 0; i < int(n); i++)
    for (int j = (i + 2); j <= int(n - 1); j++) {
      good[i][j] = good[j][i] = 1;
      for (int k = 0; k < int(n); k++)
        if (k != i && k != j && is_jiao(p[i], p[j], p[k], p[k])) {
          good[i][j] = good[j][i] = 0;
          break;
        }
      if (!good[i][j]) continue;
      for (int k = 0; k < int(n); k++)
        if (k != i && (k + 1) % n != i && k != j && (k + 1) % n != j &&
            is_jiao(p[i], p[j], p[k], p[k + 1])) {
          good[i][j] = good[j][i] = 0;
          break;
        }
      if (!good[i][j]) continue;
      P mid{(p[i].x + p[j].x) / 2, (p[i].y + p[j].y) / 2};
      double s = 0;
      for (int k = 0; k < int(n); k++) s += get_ang(mid, p[k], p[k + 1]);
      if (fabs(s) < 1) good[i][j] = good[j][i] = 0;
    }
  for (int i = 0; i < int(n); i++)
    good[i][(i + 1) % n] = good[(i + 1) % n][i] = 1;
  int ans = go(0, n - 1);
  printf("%d\n", ans);
  return 0;
}
