#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  int dist(point t1) {
    return (x - t1.x) * (x - t1.x) + (y - t1.y) * (y - t1.y);
  }
};
const int N = 8;
point a[N];
int idx[N];
point p[N];
void scan() {
  for (int i = 0; i < N; ++i) scanf("%d %d", &a[i].x, &a[i].y);
}
bool line(point t1, point t2, point t3) {
  return (t1.x - t2.x) * (t1.y - t3.y) - (t1.x - t3.x) * (t1.y - t2.y) == 0;
}
point perp(point t1, point t2) {
  t2.x -= t1.x;
  t2.y -= t1.y;
  point res;
  res.x = t1.x - t2.y;
  res.y = t1.y + t2.x;
  return res;
}
bool ok() {
  if (p[0].dist(p[1]) != p[1].dist(p[2])) return 0;
  if (p[1].dist(p[2]) != p[2].dist(p[3])) return 0;
  if (p[2].dist(p[3]) != p[3].dist(p[0])) return 0;
  if (p[3].dist(p[0]) != p[0].dist(p[1])) return 0;
  if (p[4].dist(p[5]) != p[6].dist(p[7])) return 0;
  if (p[5].dist(p[6]) != p[7].dist(p[4])) return 0;
  if (!line(p[0], perp(p[0], p[1]), p[3])) return 0;
  if (!line(p[1], perp(p[1], p[2]), p[0])) return 0;
  if (!line(p[2], perp(p[2], p[3]), p[1])) return 0;
  if (!line(p[3], perp(p[3], p[0]), p[2])) return 0;
  if (!line(p[4], perp(p[4], p[5]), p[7])) return 0;
  if (!line(p[5], perp(p[5], p[6]), p[4])) return 0;
  if (!line(p[6], perp(p[6], p[7]), p[5])) return 0;
  if (!line(p[7], perp(p[7], p[4]), p[6])) return 0;
  return 1;
}
void solve() {
  for (int i = 0; i < N; ++i) idx[i] = i;
  do {
    for (int i = 0; i < N; ++i) p[i] = a[idx[i]];
    if (ok()) {
      printf("YES\n");
      for (int i = 0; i < 4; ++i) printf("%d ", idx[i] + 1);
      printf("\n");
      for (int i = 0; i < 4; ++i) printf("%d ", idx[i + 4] + 1);
      printf("\n");
      return;
    }
  } while (next_permutation(idx, idx + N));
  printf("NO\n");
}
int main() {
  scan();
  solve();
}
