source_code: 
  //package que_a;
  
  import java.io.*;
  import java.util.*;
  import java.math.*;
  
  public class utkarsh {
  
      InputStream is;
      PrintWriter out;
      
      long mod = (long) (1e9 + 7);
      boolean SHOW_TIME;
      
      void solve() {
          //Enter code here utkarsh
          //SHOW_TIME = true;
          int n = ni();
          int d = ni();
          int a[] = na(n);
          Arrays.sort(a);
          int ans = 2;
          for(int i = 0; i < n-1; i++) {
              if(a[i+1] - a[i] == (2 * d))    ans++;
              else if(a[i+1] - a[i] > (2 * d))    ans += 2;
          }
          out.println(ans);
      }
  
      //---------- I/O Template ----------
      
      public static void main(String[] args) { new utkarsh().run(); }
      void run() { 
          is = System.in; 
          out = new PrintWriter(System.out);
          long start = System.currentTimeMillis(); 
          solve(); 
          long end = System.currentTimeMillis();
          if(SHOW_TIME) out.println("\n" + (end - start) + " ms");
          out.flush();
      }
      
      byte input[] = new byte[1024];
      int len = 0, ptr = 0;
      
      int readByte() { 
          if(ptr >= len) { ptr = 0; 
              try { len = is.read(input); } 
              catch(IOException e) { throw new InputMismatchException(); } 
              if(len <= 0) { return -1; } 
          } return input[ptr++];
      }
      boolean isSpaceChar(int c) { return !( c >= 33 && c <= 126 ); }
      int skip() { 
          int b = readByte(); 
          while(b != -1 && isSpaceChar(b)) { b = readByte(); } 
          return b;
      }
      
      char nc() { return (char)skip(); }
      String ns() { 
          int b = skip(); 
          StringBuilder sb = new StringBuilder(); 
          while(!isSpaceChar(b)) { sb.appendCodePoint(b); b = readByte(); } 
          return sb.toString();
      }
      String nLine() { 
          int b = skip(); 
          StringBuilder sb = new StringBuilder(); 
          while( !(isSpaceChar(b) && b != ' ') ) { sb.appendCodePoint(b); b = readByte(); } 
          return sb.toString();
      }
      int ni() { 
          int n = 0, b = readByte(); 
          boolean minus = false; 
          while(b != -1 && !( (b >= '0' && b <= '9') || b == '-')) { b = readByte(); } 
          if(b == '-') { minus = true; b = readByte(); } 
          if(b == -1) { return -1; }  //no input 
          while(b >= '0' && b <= '9') { n = n * 10 + (b - '0'); b = readByte(); } 
          return minus ? -n : n;
      }
      long nl() { 
          long n = 0L;    int b = readByte(); 
          boolean minus = false; 
          while(b != -1 && !( (b >= '0' && b <= '9') || b == '-')) { b = readByte(); } 
          if(b == '-') { minus = true; b = readByte(); } 
          while(b >= '0' && b <= '9') { n = n * 10 + (b - '0'); b = readByte(); } 
          return minus ? -n : n;
      }
  
      double nd() { return Double.parseDouble(ns()); }
      float nf() { return Float.parseFloat(ns()); }
      int[] na(int n) { 
          int a[] = new int[n]; 
          for(int i = 0; i < n; i++) { a[i] = ni(); } 
          return a;
      }
      char[] ns(int n) { 
          char c[] = new char[n]; 
          int i, b = skip(); 
          for(i = 0; i < n; i++) { 
              if(isSpaceChar(b)) { break; } 
              c[i] = (char)b; b = readByte(); 
          } return i == n ? c : Arrays.copyOf(c,i);
      }
  }