old_contents: /*
   * L.Circle is a circle overlay (with a certain radius in meters).
   * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion)
   */
  
  L.Circle = L.CircleMarker.extend({
  
  	initialize: function (latlng, options) {
  		L.setOptions(this, options);
  		this._latlng = L.latLng(latlng);
  		this._mRadius = this.options.radius;
  	},
  
  	setRadius: function (radius) {
  		this._mRadius = radius;
  		return this.redraw();
  	},
  
  	getRadius: function () {
  		return this._mRadius;
  	},
  
  	getBounds: function () {
  		var half = [this._radius, this._radiusY || this._radius];
  
  		return new L.LatLngBounds(
  			this._map.layerPointToLatLng(this._point.subtract(half)),
  			this._map.layerPointToLatLng(this._point.add(half)));
  	},
  
  	setStyle: L.Path.prototype.setStyle,
  
  	_project: function () {
  
  		var lng = this._latlng.lng,
  		    lat = this._latlng.lat,
  		    map = this._map,
  		    crs = map.options.crs;
  
  		if (crs.distance === L.CRS.Earth.distance) {
  			var d = Math.PI / 180,
  			    latR = (this._mRadius / L.CRS.Earth.R) / d,
  			    top = map.project([lat + latR, lng]),
  			    bottom = map.project([lat - latR, lng]),
  			    p = top.add(bottom).divideBy(2),
  			    lat2 = map.unproject(p).lat,
  			    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /
  			            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;
  
  			if (isNaN(lngR) || lngR === 0) {
  				lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425
  			}
  
  			this._point = p.subtract(map.getPixelOrigin());
  			this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);
  			this._radiusY = Math.max(Math.round(p.y - top.y), 1);
  
  		} else {
  			var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));
  
  			this._point = map.latLngToLayerPoint(this._latlng);
  			this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;
  		}
  
  		this._updateBounds();
  	}
  });
  
  L.circle = function (latlng, options, legacyOptions) {
  	if (typeof options === 'number') {
  		// Backwards compatibility with 0.7.x factory (latlng, radius, options?)
  		options = L.extend({}, legacyOptions, {radius: options});
  	}
  	return new L.Circle(latlng, options);
  };
  
new_contents: /*
   * L.Circle is a circle overlay (with a certain radius in meters).
   * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion)
   */
  
  L.Circle = L.CircleMarker.extend({
  
  	initialize: function (latlng, options) {
  		L.setOptions(this, options);
  		this._latlng = L.latLng(latlng);
  
  		if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }
  
  		this._mRadius = this.options.radius;
  	},
  
  	setRadius: function (radius) {
  		this._mRadius = radius;
  		return this.redraw();
  	},
  
  	getRadius: function () {
  		return this._mRadius;
  	},
  
  	getBounds: function () {
  		var half = [this._radius, this._radiusY || this._radius];
  
  		return new L.LatLngBounds(
  			this._map.layerPointToLatLng(this._point.subtract(half)),
  			this._map.layerPointToLatLng(this._point.add(half)));
  	},
  
  	setStyle: L.Path.prototype.setStyle,
  
  	_project: function () {
  
  		var lng = this._latlng.lng,
  		    lat = this._latlng.lat,
  		    map = this._map,
  		    crs = map.options.crs;
  
  		if (crs.distance === L.CRS.Earth.distance) {
  			var d = Math.PI / 180,
  			    latR = (this._mRadius / L.CRS.Earth.R) / d,
  			    top = map.project([lat + latR, lng]),
  			    bottom = map.project([lat - latR, lng]),
  			    p = top.add(bottom).divideBy(2),
  			    lat2 = map.unproject(p).lat,
  			    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /
  			            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;
  
  			if (isNaN(lngR) || lngR === 0) {
  				lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425
  			}
  
  			this._point = p.subtract(map.getPixelOrigin());
  			this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);
  			this._radiusY = Math.max(Math.round(p.y - top.y), 1);
  
  		} else {
  			var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));
  
  			this._point = map.latLngToLayerPoint(this._latlng);
  			this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;
  		}
  
  		this._updateBounds();
  	}
  });
  
  L.circle = function (latlng, options, legacyOptions) {
  	if (typeof options === 'number') {
  		// Backwards compatibility with 0.7.x factory (latlng, radius, options?)
  		options = L.extend({}, legacyOptions, {radius: options});
  	}
  	return new L.Circle(latlng, options);
  };
  
subject: Throw error on NaN circle radius, #4235