#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const double pi = acos(-1.0);
inline int sgn(double x) {
  if (x < -1e-8) return -1;
  return x > 1e-8;
}
struct Vector {
  double x, y;
  Vector(double _x = 0, double _y = 0) {
    x = _x;
    y = _y;
  }
  Vector operator+(Vector a) const { return Vector(x + a.x, y + a.y); }
  Vector operator+=(Vector a) { return *this = *this + a; }
  Vector operator-(Vector a) const { return Vector(x - a.x, y - a.y); }
  Vector operator-=(Vector a) { return *this = *this - a; }
  Vector operator*(double p) const { return Vector(x * p, y * p); }
  Vector operator*=(double p) { return *this = *this * p; }
  bool operator<(const Vector a) const {
    if (x == a.x) return y < a.y;
    return x < a.x;
  }
  bool operator==(const Vector a) const {
    return sgn(x - a.x) == 0 && sgn(y - a.y) == 0;
  }
  double len() const { return sqrt(x * x + y * y); }
  double angle() const { return atan2(y, x); }
} po[205];
inline double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }
inline double scalar(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
inline bool parallel(Vector a, Vector b, Vector c, Vector d) {
  return sgn(cross(b - a, d - c)) == 0;
}
inline bool between(Vector a, Vector b, Vector c) {
  return sgn(a.x - min(b.x, c.x)) >= 0 && sgn(a.x - max(b.x, c.x)) <= 0 &&
         sgn(a.y - min(b.y, c.y)) >= 0 && sgn(a.y - max(b.y, c.y)) <= 0;
}
inline int segmentsegment(Vector a, Vector b, Vector c, Vector d) {
  double d1 = cross(a - c, a - d), d2 = cross(b - c, b - d),
         d3 = cross(c - a, c - b), d4 = cross(d - a, d - b);
  if (sgn(d1 * d2) < 0 && sgn(d3 * d4) < 0) return 4;
  if (sgn(d1) == 0 && sgn(d2) == 0 && sgn(d3) == 0 && sgn(d4) == 0) {
    if (a == c && !between(d, a, b)) return 2;
    if (a == d && !between(c, a, b)) return 2;
    if (b == c && !between(d, a, b)) return 2;
    if (b == d && !between(c, a, b)) return 2;
    if (between(c, a, b) || between(d, a, b)) return 1;
    if (between(a, c, d) || between(b, c, d)) return 1;
    return 0;
  }
  if (sgn(d1) == 0 && between(a, c, d)) return 3;
  if (sgn(d2) == 0 && between(b, c, d)) return 3;
  if (sgn(d3) == 0 && between(c, a, b)) return 3;
  if (sgn(d4) == 0 && between(d, a, b)) return 3;
  return -1;
}
int n;
inline bool in(Vector t) {
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    int a = i, b = (i + 1) % n;
    if (sgn(po[a].y - po[b].y) == -1) swap(a, b);
    int x = sgn(cross(po[a] - t, po[b] - t));
    if (!x) {
      if (between(t, po[a], po[b])) return 1;
    } else if (x < 0 && sgn(po[a].y - t.y) >= 0 && sgn(t.y - po[b].y) == 1)
      ++cnt;
  }
  return cnt & 1;
}
inline bool check(int l, int r) {
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    int st = segmentsegment(po[l], po[r], po[i], po[(i + 1) % n]);
    if (st == 4 || st == 1) return 0;
    if (st == 2 || st == 3) ++cnt;
  }
  if (cnt > 4) return 0;
  Vector t = (po[l] + po[r]) * 0.5;
  return in(t);
}
bool ok[205][205];
int dp[205][205];
int solve(int l, int r) {
  if (l + 1 == r) return 1;
  if (dp[l][r] != -1) return dp[l][r];
  int res = 0;
  for (int i = l + 1; i < r; ++i) {
    if ((l + 1 == i || ok[l][i]) && (i + 1 == r || ok[i][r]))
      res = (res + 1LL * solve(l, i) * solve(i, r)) % mod;
  }
  return dp[l][r] = res;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) scanf("%lf%lf", &po[i].x, &po[i].y);
  for (int i = 0; i < n; ++i)
    for (int j = i + 2; j < n; ++j) ok[i][j] = check(i, j);
  memset(dp, -1, sizeof(dp));
  printf("%d\n", solve(0, n - 1));
  return 0;
}
