/*
TASK:sym
LANG:C
*/

#include <stdio.h>
#define MAX 10001
FILE *in; FILE *out;
int a[MAX][2];
int n;
int dist, diff;
double line;
int symm[MAX];


int cmpdbl(double d1, double d2)
{
double tmp;

tmp = d1 - d2;
if (tmp<0) tmp *= -1;

if (tmp<0.0000001) return 1;
else return 0;
}


double findarea(double x1, double y1, double x2, double y2, double x3, double y3)
{
double area;

area = 0;

area += x1 * y2;
area += x2 * y3;
area += x3 * y1;

area -= x1 * y3;
area -= x3 * y2;
area -= x2 * y1;

return area;
}



int sym(int p1, int p2, double x1, double y1, double x2, double y2)
{
int i, c;
double x3, y3;
double tmp1, tmp2;

x3 = a[p1][0]; y3 = a[p1][1];
tmp1 = findarea(x1, y1, x2, y2, x3, y3);

x3 = a[p2][0]; y3 = a[p2][1];
tmp2 = findarea(x1, y1, x2, y2, x3, y3);

tmp2 *= -1;

//fprintf(out, "For Points %d and %d, areas: %.2lf vs. %.2lf!\n", p1, p2, tmp1, tmp2);

if (cmpdbl(tmp1, tmp2)) return 1;

return 0;
}


double finddist(int p1, int p2)
{
double dist;
double A, B;

dist = 0;

A = (a[p1][0] - a[p2][0]); A *= A;
B = (a[p1][1] - a[p2][1]); B *= B;

dist = sqrt((double)(A+B));

return dist;
}



int dowork(int p1, int p2)
{
int i, c;
int flag = 0, ff;
double midx, midy;
double ffx, ffy;
double A, B, C;

midx = ((double)a[p2][0] + (double)a[p1][0])/2;
midy = ((double)a[p2][1] + (double)a[p1][1])/2;

//fprintf(out, "Midpoint: %.2lf %.2lf for points %d and %d\n", midx, midy, p1, p2);

if (a[p2][0] == a[p1][0])
   {
   flag = 1;
   ffx = midx + 1;
   ffy = midy;
   }

if (a[p2][1] == a[p1][1])
   {
   flag = 1;
   ffx = midx;
   ffy = midy + 1;
   }
if (!flag) 
   {
   A = a[p1][0] - a[p2][0]; if (A<0) A*=-1;
   B = finddist(p1, p2);
   C = (double)(B/2)*(double)(B/A);
   ffy = a[p1][1];
   if (a[p2][0] < a[p1][0])  ffx = a[p1][0] - C;
   else ffx = a[p1][0] + C;
   }

    {
    flag = 0; ff = n;
    
    for (i=0; i<=n; i++) symm[i] = -1;
    
//    fprintf(out, "For Points: %d %d:\n", p1, p2);
//    fprintf(out, "Midpoint: %.2lf %.2lf; Other point: %.2lf %.2lf.\n", midx, midy, ffx, ffy);
//    fprintf(out, "\n");
    
    for (i=0; i<n; i++) if (symm[i] == -1)
        {
        if (cmpdbl(findarea(midx, midy, ffx, ffy, a[i][0], a[i][1]), 0)) {ff--; symm[i] = i; continue;}
        for (c=i+1; c<n; c++)
            {
            flag = sym(i, c, midx, midy, ffx, ffy);
            if (flag) {ff-=2; symm[i] = c;  symm[c] = i; break;}
            }
        if (flag) continue;
        else {return 0;}
        }
    if (!ff) 
       {
       for (i=0; i<n-1; i++)
           {
           fprintf(out, "%d ", symm[i]+1);
           }
       fprintf(out, "%d\n", symm[n-1]+1);
       
       return 1;
       }
    }

return 0;
}



int main(void)
{
int i, c;
int flag;
double current;

//in = fopen("sym.in", "rt"); out = fopen("sym.out", "wt");
in = stdin; out = stdout;

fscanf(in, "%d", &n);
for (i=0; i<n; i++)
    {
    fscanf(in, "%d %d", &a[i][0], &a[i][1]);
    }

if (n == 1)
   {
   fprintf(out, "1\n");
   }
else
   {
   dist = a[1][0] - a[0][0];
   diff = a[1][1] - a[0][1];
   line = (double)diff / (double)dist;
//   fprintf(out, "%lf\n", line);
   
   flag = 1;
   for (i=2; i<n; i++)
       {
       dist = a[i][0] - a[0][0];
       diff = a[i][1] - a[0][1];
       current = (double)diff / (double)dist;
       flag = cmpdbl(current, line);
       if (!flag) break;
       }
   if (flag)
      {
      for (i=1; i<n; i++) fprintf(out, "%d ", i);
      fprintf(out, "%d\n", n);
      }
   else
      {      
      if (n<1024)
      {
      for (i=0; i<n-1; i++)
          for (c=i+1; c<n; c++)
              {
              flag = dowork(i, c);
              if (flag)
                 {
                 fclose(in); fclose(out);
                 return 0;
                 }
              }
      }
      fprintf(out, "0\n");
      }
   }

fclose(in); fclose(out);

return 0;
}
