#include <bits/stdc++.h>
using namespace std;
int INF = 100000000;
struct vect {
  int x, y, index;
  vect() { x = y = 0; }
  vect(int _x, int _y) { x = _x, y = _y; }
  vect to(vect u) { return vect(u.x - x, u.y - y); }
  vect rot90() { return vect(-y, x); }
  int dotprod(vect u) { return x * u.x + y * u.y; }
  int crsprod(vect u) { return x * u.y - y * u.x; }
  int len2() { return x * x + y * y; }
  bool tangent_to(vect y) { return dotprod(y) == 0; }
} P[9], Sol[9];
bool solved;
vect edge(int x, int y) { return Sol[x].to(Sol[y]); }
bool check1234() {
  if (edge(1, 2).tangent_to(edge(2, 3)))
    if (edge(2, 3).tangent_to(edge(3, 4)))
      if (edge(3, 4).tangent_to(edge(4, 1)))
        if (edge(4, 1).tangent_to(edge(1, 2)))
          if (edge(1, 2).len2() == edge(2, 3).len2()) return true;
  return false;
}
bool check5678() {
  if (edge(5, 6).tangent_to(edge(6, 7)))
    if (edge(6, 7).tangent_to(edge(7, 8)))
      if (edge(7, 8).tangent_to(edge(8, 5)))
        if (edge(8, 5).tangent_to(edge(5, 6))) return true;
  return false;
}
void check() {
  if (solved) return;
  if (check1234())
    if (check5678()) {
      solved = true;
      cout << "YES" << endl;
      for (int i = 1; i <= 4; i++)
        cout << Sol[i].index << (i == 4 ? "\n" : " ");
      for (int i = 5; i <= 8; i++)
        cout << Sol[i].index << (i == 8 ? "\n" : " ");
    }
}
void dfs(int cur, int mask) {
  if (cur == 9)
    check();
  else {
    for (int i = 1; i <= 8; i++)
      if ((mask & (1 << i)) == 0) {
        Sol[cur] = P[i];
        dfs(cur + 1, mask + (1 << i));
      }
  }
}
int main() {
  while (cin >> P[1].x >> P[1].y) {
    for (int i = 2; i <= 8; i++) cin >> P[i].x >> P[i].y;
    for (int i = 1; i <= 8; i++) P[i].index = i;
    solved = false;
    dfs(1, 0);
    if (!solved) cout << "NO" << endl;
  }
  return 0;
}
