#include <bits/stdc++.h>
using namespace std;
const int inf = ~0U >> 1;
const long long INF = ~0ULL >> 1;
template <class T>
inline void read(T &n) {
  char c;
  for (c = getchar(); !(c >= '0' && c <= '9'); c = getchar())
    ;
  n = c - '0';
  for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0';
}
int Pow(int base, int n, int mo) {
  if (n == 0) return 1;
  if (n == 1) return base % mo;
  int tmp = Pow(base, n >> 1, mo);
  tmp = (long long)tmp * tmp % mo;
  if (n & 1) tmp = (long long)tmp * base % mo;
  return tmp;
}
const int maxn = 200000;
int f[maxn], v[maxn], nxt[maxn], n, cnt, go[maxn][2], back[maxn][2];
vector<int> ans;
int find(int x) { return (f[x] == x) ? x : (f[x] = find(f[x])); }
void dfs(int u) {
  printf("%d ", u);
  if (u == 0) exit(0);
  dfs(nxt[u]);
}
int main() {
  scanf("%d", &n);
  if (n & 1) {
    puts("-1");
    return 0;
  }
  int N = n / 2;
  for (int i = (0); i <= (N - 1); ++i) {
    nxt[i] = i * 2;
    nxt[i + N] = i * 2 + 1;
  }
  for (int i = (0); i <= (n - 1); ++i) f[i] = i;
  for (int i = (0); i <= (n - 1); ++i) f[find(i)] = find(nxt[i]);
  for (int i = (0); i <= (N - 1); ++i)
    if (find(i) != find(i + N)) {
      swap(nxt[i], nxt[i + N]);
      f[find(i)] = find(i + N);
    }
  for (int i = (0); i <= (n - 1); ++i) f[i] = find(f[i]);
  printf("0 ");
  dfs(nxt[0]);
  return 0;
}
