#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>

#define FOR(a,b,c) for(int a=b;a<=c;a++)
#define REP(a,c) for(int a=0;a<c;a++)
#define ROF(a,b,c) for(int a=b;a>=c;a--)
#define WT while(1)
#define GETI(a) scanf("%d", &a)
#define BZ(a) memset(a,0,sizeof(a))
#define FILL(a,b) fill(a,a+(sizeof(a)/sizeof(a[0])),b)
#define FOREACH(a,b) for(__typeof((b).begin()) a=(b).begin(); a!=(b).end();a++)
#define D(args...) //printf(args)

using namespace std;

int X[10100];
int Y[10100];
int result=0;
int N, R;

struct para {
	double first;
	int second;

	inline bool operator<(const para & other) const {
		return first < other.first;
	}
};

para intv[8010];

#define put_pair(nintv,a,b) \
	intv[nintv].first=a,intv[nintv].second=b,nintv++
void workfrom(int cpoint)
{
	int nintv=0;
	//vector<pair<double, int> > intv;

	REP(i, N) {
		double dx = X[i] - X[cpoint];
		double dy = Y[i] - Y[cpoint];

		double center = atan2(dy, dx);
		double dist = sqrt(dx*dx+dy*dy);

		if(dist <= 2*R) {
			double delta = acos(dist / (2*(double)R + 0.0005));
			double lo = center - delta, hi = center + delta;

			D("%d %d %f %f\n", cpoint, i, (float)delta, (float)dist);

			put_pair(nintv, lo, -1);
			put_pair(nintv, hi, 1);
			put_pair(nintv, lo+2*M_PI, -1);
			put_pair(nintv, hi+2*M_PI, 1);
		//	intv.push_back(make_pair(lo, -1));
		//	intv.push_back(make_pair(hi, 1));
		//	intv.push_back(make_pair(lo + 2*M_PI, -1));
		//	intv.push_back(make_pair(hi + 2*M_PI, 1));
		}
	}
	
	sort(intv,intv+nintv);
	//sort(intv.begin(), intv.end());

	int s=0;
	REP(i, nintv) {
		para * it = &intv[i];
	//FOREACH(it, intv) {
		D("C %d %f %d %d\n", cpoint, (float)it->first, it->second, s);
		s -= it->second;
		
		if(s > result)
			result=s;
	}
}

int main()
{
	WT {
		GETI(N);
		GETI(R);

		if(!N)
			break;
	
		REP(i, N) {
			GETI(X[i]);
			GETI(Y[i]);
		}

		result=0;

		REP(i, N) 
			workfrom(i);

		printf("It is possible to cover %d points.\n", result);
	}
	return 0;
}
