#include <bits/stdc++.h>
using namespace std;
const signed long long Infinity = 1000000001;
const long double Pi = 2.0L * asinl(1.0L);
const long double Epsilon = 0.000000001;
template <class T, class U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
  return os << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& V) {
  for (typeof(V.begin()) i = V.begin(); i != V.end(); ++i) os << *i << endl;
  return os;
}
template <class T>
ostream& operator<<(ostream& os, const set<T>& S) {
  for (typeof(S.begin()) i = S.begin(); i != S.end(); ++i) os << *i << endl;
  return os;
}
template <class T, class U>
ostream& operator<<(ostream& os, const map<T, U>& M) {
  for (typeof(M.begin()) i = M.begin(); i != M.end(); ++i) os << *i << endl;
  return os;
}
vector<pair<int, int> > A;
int n;
void readData() {
  for (int(i) = (1); (i) <= (8); (i)++) {
    int a, b;
    scanf("%d %d", &a, &b);
    A.push_back(make_pair(a, b));
  }
}
signed long long Distance(pair<int, int>& p, pair<int, int>& q) {
  return (q.first - p.first) * (q.first - p.first) +
         (q.second - p.second) * (q.second - p.second);
}
bool isSquare(vector<pair<int, int> > P) {
  sort(P.begin(), P.end());
  while (next_permutation(P.begin(), P.end())) {
    if (Distance(P[1], P[3]) == 0) continue;
    if (Distance(P[0], P[1]) == 0) continue;
    if (Distance(P[0], P[3]) == 0) continue;
    if (Distance(P[0], P[3]) != Distance(P[1], P[2])) continue;
    if (Distance(P[0], P[1]) != Distance(P[1], P[3])) continue;
    if (Distance(P[1], P[3]) != Distance(P[3], P[2])) continue;
    if (Distance(P[3], P[2]) != Distance(P[2], P[0])) continue;
    if (Distance(P[2], P[0]) != Distance(P[0], P[1])) continue;
    return true;
  }
  return false;
}
bool isProsto(vector<pair<int, int> > P) {
  sort(P.begin(), P.end());
  while (next_permutation(P.begin(), P.end())) {
    if (Distance(P[1], P[3]) == 0) continue;
    if (Distance(P[0], P[1]) == 0) continue;
    if (Distance(P[0], P[3]) == 0) continue;
    if (Distance(P[0], P[3]) != Distance(P[1], P[2])) continue;
    if (Distance(P[0], P[2]) != Distance(P[1], P[3])) continue;
    if (Distance(P[0], P[1]) != Distance(P[2], P[3])) continue;
    return true;
  }
  return false;
}
int main() {
  readData();
  for (int(i) = (1); (i) < (1 << 8); (i)++) {
    if (__builtin_popcount(i) == 4) {
      vector<pair<int, int> > P;
      vector<pair<int, int> > Q;
      vector<pair<int, int> > R;
      int t = i;
      int q = 0;
      for (int(j) = (1); (j) <= (8); (j)++) {
        if (t % 2 == 1) {
          P.push_back(A[q]);
          R.push_back(make_pair(q, 0));
        } else {
          Q.push_back(A[q]);
          R.push_back(make_pair(q, 1));
        }
        t /= 2;
        q++;
      }
      if (isSquare(P) and isProsto(Q)) {
        printf("YES\n");
        for (typeof(R.begin()) r = R.begin(); r != R.end(); ++r)
          if (r->second == 0) printf("%d ", r->first + 1);
        printf("\n");
        for (typeof(R.begin()) r = R.begin(); r != R.end(); ++r)
          if (r->second == 1) printf("%d ", r->first + 1);
        return 0;
      }
    }
  }
  printf("NO\n");
  return 0;
}
