#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cstdlib>
#include<queue>
#include<set>
#include<cstdio>
#include<map>
#include<cassert>

using namespace std;

#define ll long long
#define reps(i, a, b) for(int i = a; i < b; i++)
#define rreps(i, a, b) for(int i = a-1; i >= b; i--)
#define rep(i, n) reps(i, 0, n)
#define rrep(i, n) rreps(i, n, 0)
#define P pair<int, int>
#define vec vector<int>
#define mat vector<vec>

const ll mod = 1000000007;
const int INF = 1001001001;

int main(){
    int n;
    cin >> n;
    vector<double> x(n), y(n);
    rep(i, n) cin >> x[i] >> y[i];
    vector<vector<double> > dist(n+2, vector<double>(n+2));
    rep(i, n){
        rep(j, n){
            double dx = x[i] - x[j];
            double dy = y[i] - y[j];
            dist[i][j] = dx * dx + dy * dy;
        }
    }
    rep(i, n) {
        int dy = 100 - y[i];
        dist[n][i] = dy * dy;
        dist[i][n] = dy * dy;
    }
    rep(i, n) {
        int dy = -100 - y[i];
        dist[n+1][i] = dy * dy;
        dist[i][n+1] = dy * dy;
    }
    dist[n][n+1] = 40000;
    dist[n+1][n] = 40000;

    // rep(i, n+2){
    //     rep(j, n+2){
    //         cout << dist[i][j] << " ";
    //     }cout << endl;
    // }

    double l = 0, r = 200;
    rep(s, 100){
        double mid = (l+r) / 2;
        mat g(n+2);
        rep(i, n+2){
            rep(j, n+2){
                if((double)dist[i][j] <= mid*mid){
                    g[i].push_back(j);
                }
            }
        }
        // rep(i, n+2){
        //     rep(j, g[i].size()){
        //         cout << g[i][j] << " "; 
        //     }cout << endl;
        // }


        vec pos(n+2);
        queue<int> que;
        que.push(n);
        pos[n] = 1;
        while(que.size() > 0){
            int u = que.front();
            que.pop();
            rep(i, g[u].size()){
                int v = g[u][i];
                if(pos[v] == 1) continue;
                pos[v] = 1;
                que.push(v);
            }
        }
        if(pos[n+1]) r = mid;
        else l = mid;
        // cout << l << " " << r << endl;
    } 
    double ans = r / 2;
    printf("%.16lf\n", ans);
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define re register
#define ls (o<<1)
#define rs (o<<1|1)
//#define m (l+r)/2
#define pb push_back
typedef pair<int,int> pii;
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
double eps = 1e-7;
int n;
double x[110],y[110];
double dis(double x1,double y1,double x2,double y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int fa[210];
int gt(int x){
	if(x==fa[x])return x;
	return fa[x]=gt(fa[x]); 
}
bool ck(double r){
	for(int i=1;i<=n+2;i++)fa[i]=i;	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(dis(x[i],y[i],x[j],y[j])+eps<=2*r)
				fa[gt(i)]=gt(j);
		}
		if(100-y[i] + eps<=2*r)fa[gt(i)]=gt(n+1);
		if(y[i]+100 + eps<=2*r)fa[gt(i)]=gt(n+2);
	}
	if(gt(n+1)==gt(n+2))return false;
	return true;
}
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	cin>>n;
  	for(int i=1;i<=n;i++){
  		cin>>x[i]>>y[i];
	}
	double l=0,r=100,ans=0;
	while(l+eps<=r){
		double mid=(l+r)/2;
		if(ck(mid))l=mid,ans=mid;
		else r=mid;
	}
	cout<<ans<<endl;
	return 0;
}