#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-10;
bool operator<(const complex<double>& a, const complex<double>& b) {
  return abs(a) < abs(b);
}
struct Circle {
  complex<double> p;
  double r;
  Circle(complex<double> p, double r) : p(p), r(r) {}
};
bool dbgte(double a, double b) { return a - b >= -EPS; }
bool dbgt(double a, double b) { return a - b > -EPS; }
int x, y, rm, rM;
int main() {
  vector<Circle> cir;
  cin >> x >> y >> rm >> rM;
  cir.push_back(Circle(complex<double>(x, y), rm));
  cir.push_back(Circle(complex<double>(x, y), rM));
  cin >> x >> y >> rm >> rM;
  cir.push_back(Circle(complex<double>(x, y), rm));
  cir.push_back(Circle(complex<double>(x, y), rM));
  int num = 0;
  if ((dbgte(abs(cir[0].r - cir[2].r), abs(cir[0].p - cir[2].p)) &&
       cir[2].r >= cir[0].r) ||
      (dbgte(abs(cir[0].r - cir[3].r), abs(cir[0].p - cir[3].p)) &&
       cir[3].r <= cir[0].r) ||
      (dbgte(abs(cir[0].p - cir[3].p), abs(cir[0].r + cir[3].r)))) {
    num++;
  }
  if ((dbgte(abs(cir[1].r - cir[2].r), abs(cir[1].p - cir[2].p)) &&
       cir[2].r >= cir[1].r) ||
      (dbgte(abs(cir[1].r - cir[3].r), abs(cir[1].p - cir[3].p)) &&
       cir[3].r <= cir[1].r) ||
      (dbgte(abs(cir[1].p - cir[3].p), abs(cir[1].r + cir[3].r)))) {
    num++;
  }
  swap(cir[0], cir[2]);
  swap(cir[1], cir[3]);
  if ((dbgte(abs(cir[0].r - cir[2].r), abs(cir[0].p - cir[2].p)) &&
       cir[2].r >= cir[0].r) ||
      (dbgte(abs(cir[0].r - cir[3].r), abs(cir[0].p - cir[3].p)) &&
       cir[3].r <= cir[0].r) ||
      (dbgte(abs(cir[0].p - cir[3].p), abs(cir[0].r + cir[3].r)))) {
    num++;
  }
  if ((dbgte(abs(cir[1].r - cir[2].r), abs(cir[1].p - cir[2].p)) &&
       cir[2].r >= cir[1].r) ||
      (dbgte(abs(cir[1].r - cir[3].r), abs(cir[1].p - cir[3].p)) &&
       cir[3].r <= cir[1].r) ||
      (dbgte(abs(cir[1].p - cir[3].p), abs(cir[1].r + cir[3].r)))) {
    num++;
  }
  cout << num << endl;
}
