#include <bits/stdc++.h>
using namespace std;
template <typename T>
T gcd(T a, T b) {
  while (b) {
    T c = a % b;
    a = b;
    b = c;
  }
  return a;
}
template <typename T>
T lcm(T a, T b) {
  assert(a / gcd(a, b) <= numeric_limits<T>::max() / b);
  return a * (b / gcd(a, b));
}
class out {
 public:
  template <typename T>
  out &operator()(const T &t) {
    cout << t << ' ';
    return *this;
  }
  template <typename T1, typename T2>
  out &operator()(const pair<T1, T2> &t) {
    cout << '(' << t.first << ',' << t.second << ')' << ' ';
    return *this;
  }
};
template <typename iter>
inline void print_(iter beg, iter end) {
  cout << endl;
  for_each(beg, end, out());
  cout << endl;
}
template <typename T>
inline void print_(const T &t) {
  cout << endl << t << endl;
}
inline void print_(const char *t) { cout << endl << t << endl; }
template <typename T, unsigned int M>
inline void print_(const T (&t)[M]) {
  cout << endl;
  for (unsigned int i = 0; i < M; ++i) {
    cout << t[i] << ' ';
  }
  cout << endl;
}
template <typename T, unsigned int M>
inline void print_(const T (&t)[M], unsigned int c) {
  cout << endl;
  for (unsigned int i = 0; i < c; ++i) {
    cout << t[i] << ' ';
  }
  cout << endl;
}
template <typename T, unsigned int M, unsigned int N>
inline void print_(const T (&t)[M][N]) {
  cout << endl;
  for (unsigned int i = 0; i < M; ++i) {
    for (unsigned int j = 0; j < N; ++j) {
      cout << t[i][j] << ' ';
    }
    cout << endl;
  }
}
template <typename T, unsigned int M, unsigned int N>
inline void print_(const T (&t)[M][N], unsigned int r, unsigned int c) {
  cout << endl;
  for (unsigned int i = 0; i < r; ++i) {
    for (unsigned int j = 0; j < c; ++j) {
      cout << t[i][j] << ' ';
    }
    cout << endl;
  }
}
template <class T>
size_t BKDRHash(const T *str) {
  register size_t hash = 0;
  while (size_t ch = (size_t)*str++) {
    hash = hash * 131 + ch;
  }
  return hash;
}
template <typename T>
T powxy(T x, int y) {
  T r;
  for (r = 1; y > 0; --y) r *= x;
  return r;
}
template <typename T>
T factorial(T n) {
  T r;
  for (r = 1; n > 0; --n) r *= n;
  return r;
}
int n;
int matrix[512][512];
void construct(int exp) {
  if (!exp) {
    matrix[0][0] = 1;
    return;
  } else {
    int sz = 1 << exp;
    construct(exp - 1);
    for (int i = 0; i < sz / 2; ++i) {
      copy(matrix[i], matrix[i] + sz / 2, matrix[i] + sz / 2);
      copy(matrix[i], matrix[i] + sz / 2, matrix[i + sz / 2]);
    }
    for (int i = 0; i < sz / 2; ++i) {
      for (int j = sz / 2; j < sz; ++j) {
        matrix[i + sz / 2][j] = 1 ^ matrix[i][j];
      }
    }
  }
}
void check() {
  int sz = 1 << n;
  for (int i = 0; i < sz; ++i) {
    for (int ii = i + 1; ii < sz; ++ii) {
      int t = 0;
      for (int j = 0; j < sz; ++j) {
        t += matrix[i][j] == matrix[ii][j] ? 1 : -1;
      }
      if (t) {
        int fault[] = {i, ii, t};
        (fault);
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  construct(n);
  (matrix, 1 << n, 1 << n);
  check();
  for (int i = 0; i < 1 << n; ++i) {
    for (int j = 0; j < 1 << n; ++j) {
      putchar(matrix[i][j] ? '+' : '*');
    }
    putchar('\n');
  }
  return 0;
}
