#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string& s, const string& delim = " ") {
  vector<string> res;
  string t;
  for (int i = 0; i != s.size(); i++) {
    if (delim.find(s[i]) != string::npos) {
      if (!t.empty()) {
        res.push_back(t);
        t = "";
      }
    } else {
      t += s[i];
    }
  }
  if (!t.empty()) {
    res.push_back(t);
  }
  return res;
}
vector<int> splitInt(const string& s, const string& delim = " ") {
  vector<string> tok = split(s, delim);
  vector<int> res;
  for (int i = 0; i != tok.size(); i++) res.push_back(atoi(tok[i].c_str()));
  return res;
}
template <typename T>
void print(T a) {
  cerr << a;
}
static void print(long long a) { cerr << a << "L"; }
static void print(string a) { cerr << '"' << a << '"'; }
template <typename T>
void print(vector<T> a) {
  cerr << "{";
  for (int i = 0; i != a.size(); i++) {
    if (i != 0) cerr << ", ";
    print(a[i]);
  }
  cerr << "}" << endl;
}
typedef struct {
  int x, y;
} point;
bool orthogonal(point a, point b, point c) {
  int dx1 = b.x - a.x;
  int dx2 = c.x - a.x;
  int dy1 = b.y - a.y;
  int dy2 = c.y - a.y;
  return (dx1 * dx2 + dy1 * dy2) == 0;
}
int di(point a, point b) {
  int dx = a.x - b.x;
  int dy = a.y - b.y;
  return dx * dx + dy * dy;
}
int issquare(vector<point> p) {
  int ar[] = {0, 1, 2, 3};
  do {
    map<int, int> dii;
    int temp;
    bool all = true;
    for (int i = 0, _n = (4); i < _n; i++) {
      int pre = (i - 1 + 4) % 4;
      int next = (i + 1) % 4;
      temp = di(p[ar[i]], p[ar[next]]);
      if (temp == 0 || !orthogonal(p[ar[i]], p[ar[pre]], p[ar[next]])) break;
      dii[temp]++;
      if (dii.size() > 2) break;
    }
    int count = 0;
    map<int, int>::iterator iii;
    for (iii = dii.begin(); iii != dii.end(); iii++) {
      count += iii->second;
    }
    if (dii.size() == 1 && count == 4) return true;
  } while (next_permutation(ar, ar + 4));
  return false;
}
int isrect(vector<point> p) {
  int ar[] = {0, 1, 2, 3};
  do {
    map<int, int> dii;
    for (int i = 0, _n = (4); i < _n; i++) {
      int pre = (i - 1 + 4) % 4;
      int next = (i + 1) % 4;
      int temp = di(p[ar[i]], p[ar[next]]);
      if (temp == 0 || !orthogonal(p[ar[i]], p[ar[pre]], p[ar[next]])) break;
      dii[temp]++;
      if (dii.size() > 2) break;
    }
    int count = 0, a;
    map<int, int>::iterator iii;
    for (iii = dii.begin(); iii != dii.end(); iii++) {
      count += iii->second;
    }
    if ((dii.size() == 1 || dii.size() == 2) && count == 4) {
      return true;
    }
  } while (next_permutation(ar, ar + 4));
  return false;
}
int main() {
  point p[10];
  int aa, bb;
  while (scanf("%d %d", &aa, &bb) != EOF) {
    p[0] = (point){aa, bb};
    for (int i = (1), _n = (7); i <= _n; i++) scanf("%d %d", &p[i].x, &p[i].y);
    bool can = false;
    int arr[8] = {0, 0, 0, 0, 1, 1, 1, 1};
    vector<point> square;
    do {
      vector<point> left, right;
      for (int i = 0, _n = (8); i < _n; i++) {
        if (arr[i])
          left.push_back(p[i]);
        else
          right.push_back(p[i]);
      }
      if (isrect(right) && issquare(left)) {
        puts("YES");
        int count = 0;
        for (int i = 0, _n = (8); i < _n; i++)
          if (arr[i] == 1) {
            printf("%d", i + 1);
            count++;
            if (count < 4) printf(" ");
          }
        puts("");
        count = 0;
        for (int i = 0, _n = (8); i < _n; i++)
          if (arr[i] == 0) {
            printf("%d", i + 1);
            count++;
            if (count < 4) printf(" ");
          }
        puts("");
        can = true;
      }
    } while (next_permutation(arr, arr + 8) && !can);
    if (!can) puts("NO");
  }
  return 0;
}
