#include <bits/stdc++.h>
using namespace std;
int use[8];
struct pdd {
  double first;
  double second;
  int numb;
};
pdd arr[8];
vector<pdd> v, a;
bool ans = false;
const double EPS = 1e-8;
double getDist(pdd a1, pdd a2) {
  return sqrt((a1.first - a2.first) * (a1.first - a2.first) +
              (a1.second - a2.second) * (a1.second - a2.second));
}
bool isRect(pdd a1, pdd a2, pdd a3) {
  double c = (a2.first - a1.first) * (a3.second - a2.second) -
             (a2.second - a1.second) * (a3.first - a2.first);
  double len1 = getDist(a1, a2);
  double len2 = getDist(a2, a3);
  if (fabs(fabs(c / (len1 * len2)) - 1.0) < EPS)
    return true;
  else
    return false;
}
void solve() {
  if (v.size() == 8 && ans == false) {
    bool isGood = true;
    for (int i = 0; i < 4; i++) {
      int v1 = i;
      int v2 = (i + 1) % 4;
      int v3 = (i + 2) % 4;
      if (!isRect(v[v1], v[v2], v[v3]) ||
          fabs(getDist(v[0], v[1]) - getDist(v[v1], v[v2])) > EPS)
        isGood = false;
    }
    for (int i = 0; i < 4; i++) {
      int v1 = i + 4;
      int v2 = (i + 1) % 4 + 4;
      int v3 = (i + 2) % 4 + 4;
      if (!isRect(v[v1], v[v2], v[v3])) isGood = false;
    }
    if (isGood) {
      ans = true;
      a = v;
    }
  }
  for (int i = 0; i < 8; i++)
    if (use[i] == 0) {
      use[i] = 1;
      v.push_back(arr[i]);
      solve();
      use[i] = 0;
      v.pop_back();
    }
}
int main() {
  for (int i = 0; i < 8; i++) {
    cin >> arr[i].first >> arr[i].second;
    arr[i].numb = i + 1;
  }
  solve();
  cout << (ans ? "YES" : "NO") << endl;
  if (ans) {
    for (int i = 0; i < 4; i++) cout << a[i].numb << " ";
    cout << endl;
    for (int i = 4; i < 8; i++) cout << a[i].numb << " ";
    cout << endl;
  }
  return 0;
}
