#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300010, INF = ~0U >> 2;
struct edge {
  int a, b, pre, next;
} E[MAXN << 1];
int n, n0, m, st[MAXN], stk[MAXN], res[MAXN];
bool vst[MAXN];
void init_d() {
  for (int i = 0; i < n0; i++) E[i].pre = E[i].next = i;
  m = n0;
}
void add_edge(int a, int b) {
  E[m].a = a;
  E[m].b = b;
  E[m].pre = E[a].pre;
  E[m].next = a;
  E[a].pre = m;
  E[E[m].pre].next = m++;
}
void init() { scanf("%d", &n); }
void prepare() {
  n0 = n >> 1;
  init_d();
  for (int i = 0; i < n; i++) add_edge(i >> 1, ((i << 1) % n) >> 1);
}
void solve() {
  for (int i = 0; i < n0; i++) st[i] = E[i].next;
  for (int i = 0; i < n; i++) vst[i + n0] = 1;
  int x, y, _n = n, tp = 0;
  bool FF;
  vst[stk[0] = E[0].next] = 0;
  while (tp >= 0) {
    x = stk[tp];
    FF = 0;
    for (int p = st[E[x].b]; p != E[x].b; p = E[p].next)
      if (vst[p]) {
        vst[p] = 0;
        stk[++tp] = p;
        st[E[x].b] = E[p].next;
        FF = 1;
        break;
      }
    if (!FF) {
      res[--_n] = x - n0;
      tp--;
    }
  }
}
void pri() {
  if (n & 1)
    puts("-1");
  else {
    for (int i = 0; i < n; i++) printf("%d ", res[i]);
    puts("0");
  }
}
int main() {
  init();
  if (!(n & 1)) {
    prepare();
    solve();
  }
  pri();
  return 0;
}
