# Path: mapbox/errors.py
# class ValidationError(ValueError):
# class InvalidCountryCodeError(ValidationError):
# class InvalidPlaceTypeError(ValidationError):
# class InvalidProfileError(ValidationError):
# class InvalidFeatureError(ValidationError):
# class HTTPError(ValidationError):
# class InvalidCoordError(ValidationError):
# class InputSizeError(ValidationError):
# class ImageSizeError(ValidationError):
# class TokenError(ValidationError):
# class InvalidParameterError(ValidationError):
# class InvalidFileError(ValidationError):
# class InvalidResourceTypeError(ValidationError):
# class InvalidPeriodError(ValidationError):
# class InvalidUsernameError(ValidationError):
# class InvalidId(ValidationError):
# class MapboxDeprecationWarning(UserWarning):
# class InvalidZoomError(ValidationError):
# class InvalidColumnError(ValidationError):
# class InvalidRowError(ValidationError):
# class InvalidFileFormatError(ValidationError):
# class InvalidFeatureFormatError(ValidationError):
# class InvalidMarkerNameError(ValidationError):
# class InvalidLabelError(ValidationError):
# class InvalidColorError(ValidationError):
# 
# Path: mapbox/services/base.py
# class Service(object):
#     """Service base class
# 
#     Attributes
#     ----------
#     default_host : str
#         Default service hostname: api.mapbox.com.
#     api_name : str
#         Mapbox API name.
#     api_version : str
#         API version string such as "v1" or "v5".
#     baseuri
#     username
# 
#     Methods
#     -------
#     handle_http_errors(response, custom_messages=None, raise_for_status=False)
#         Converts service errors to Python exceptions.
#     """
# 
#     default_host = 'api.mapbox.com'
#     api_name = 'hors service'
#     api_version = 'v0'
# 
#     def __init__(self, access_token=None, host=None, cache=None):
#         """Constructs a Service object
# 
#         This method should be overridden by subclasses.
# 
#         Parameters
#         ----------
#         access_token : str
#             Mapbox access token string.
#         host : str, optional
#             Mapbox API host (advanced usage only).
#         cache : CacheControl cache instance (Dict or FileCache), optional
#             Optional caching, not generally needed.
# 
#         Returns
#         -------
#         Service
#         """
#         self.session = Session(access_token)
#         self.host = host or os.environ.get('MAPBOX_HOST', self.default_host)
#         if cache:
#             self.session = CacheControl(self.session, cache=cache)
# 
#     @property
#     def baseuri(self):
#         """The service's base URI
# 
#         Returns
#         -------
#         str
#         """
#         return 'https://{0}/{1}/{2}'.format(
#             self.host, self.api_name, self.api_version)
# 
#     @property
#     def username(self):
#         """The username in the service's access token
# 
#         Returns
#         -------
#         str
#         """
#         token = self.session.params.get('access_token')
#         if not token:
#             raise errors.TokenError(
#                 "session does not have a valid access_token param")
#         data = token.split('.')[1]
#         # replace url chars and add padding
#         # (https://gist.github.com/perrygeo/ee7c65bb1541ff6ac770)
#         data = data.replace('-', '+').replace('_', '/') + "==="
#         try:
#             return json.loads(base64.b64decode(data).decode('utf-8'))['u']
#         except (ValueError, KeyError):
#             raise errors.TokenError(
#                 "access_token does not contain username")
# 
#     def handle_http_error(self, response, custom_messages=None,
#                           raise_for_status=False):
#         """Converts service errors to Python exceptions
# 
#         Parameters
#         ----------
#         response : requests.Response
#             A service response.
#         custom_messages : dict, optional
#             A mapping of custom exception messages to HTTP status codes.
#         raise_for_status : bool, optional
#             If True, the requests library provides Python exceptions.
# 
#         Returns
#         -------
#         None
#         """
#         if not custom_messages:
#             custom_messages = {}
#         if response.status_code in custom_messages.keys():
#             raise errors.HTTPError(custom_messages[response.status_code])
#         if raise_for_status:
#             response.raise_for_status()
# 
# Path: mapbox/utils.py
# def normalize_geojson_featurecollection(obj):
#     """Takes a geojson-like mapping representing
#     geometry, Feature or FeatureCollection (or a sequence of such objects)
#     and returns a FeatureCollection-like dict
#     """
#     if not isinstance(obj, Sequence):
#         obj = [obj]
# 
#     features = []
#     for x in obj:
#         if not isinstance(x, Mapping) or 'type' not in x:
#             raise ValueError(
#                 "Expecting a geojson-like mapping or sequence of them")
# 
#         if 'features' in x:
#             features.extend(x['features'])
#         elif 'geometry' in x:
#             features.append(x)
#         elif 'coordinates' in x:
#             feat = {'type': 'Feature',
#                     'properties': {},
#                     'geometry': x}
#             features.append(feat)
#         else:
#             raise ValueError(
#                 "Expecting a geojson-like mapping or sequence of them")
# 
#     return {'type': 'FeatureCollection', 'features': features}


import json
from uritemplate import URITemplate
from mapbox import errors
from mapbox.services.base import Service
from mapbox.utils import normalize_geojson_featurecollection




class Static(Service):
    """Access to the Static Map API V4"""

    api_name = None
    api_version = 'v4'

    @property
    def baseuri(self):
        return 'https://{0}/{1}'.format(self.host, self.api_version)

    def _validate_lat(self, val):
        if val < -85.0511 or val > 85.0511:

# Path: mapbox/errors.py
# class ValidationError(ValueError):
# class InvalidCountryCodeError(ValidationError):
# class InvalidPlaceTypeError(ValidationError):
# class InvalidProfileError(ValidationError):
# class InvalidFeatureError(ValidationError):
# class HTTPError(ValidationError):
# class InvalidCoordError(ValidationError):
# class InputSizeError(ValidationError):
# class ImageSizeError(ValidationError):
# class TokenError(ValidationError):
# class InvalidParameterError(ValidationError):
# class InvalidFileError(ValidationError):
# class InvalidResourceTypeError(ValidationError):
# class InvalidPeriodError(ValidationError):
# class InvalidUsernameError(ValidationError):
# class InvalidId(ValidationError):
# class MapboxDeprecationWarning(UserWarning):
# class InvalidZoomError(ValidationError):
# class InvalidColumnError(ValidationError):
# class InvalidRowError(ValidationError):
# class InvalidFileFormatError(ValidationError):
# class InvalidFeatureFormatError(ValidationError):
# class InvalidMarkerNameError(ValidationError):
# class InvalidLabelError(ValidationError):
# class InvalidColorError(ValidationError):
# 
# Path: mapbox/services/base.py
# class Service(object):
#     """Service base class
# 
#     Attributes
#     ----------
#     default_host : str
#         Default service hostname: api.mapbox.com.
#     api_name : str
#         Mapbox API name.
#     api_version : str
#         API version string such as "v1" or "v5".
#     baseuri
#     username
# 
#     Methods
#     -------
#     handle_http_errors(response, custom_messages=None, raise_for_status=False)
#         Converts service errors to Python exceptions.
#     """
# 
#     default_host = 'api.mapbox.com'
#     api_name = 'hors service'
#     api_version = 'v0'
# 
#     def __init__(self, access_token=None, host=None, cache=None):
#         """Constructs a Service object
# 
#         This method should be overridden by subclasses.
# 
#         Parameters
#         ----------
#         access_token : str
#             Mapbox access token string.
#         host : str, optional
#             Mapbox API host (advanced usage only).
#         cache : CacheControl cache instance (Dict or FileCache), optional
#             Optional caching, not generally needed.
# 
#         Returns
#         -------
#         Service
#         """
#         self.session = Session(access_token)
#         self.host = host or os.environ.get('MAPBOX_HOST', self.default_host)
#         if cache:
#             self.session = CacheControl(self.session, cache=cache)
# 
#     @property
#     def baseuri(self):
#         """The service's base URI
# 
#         Returns
#         -------
#         str
#         """
#         return 'https://{0}/{1}/{2}'.format(
#             self.host, self.api_name, self.api_version)
# 
#     @property
#     def username(self):
#         """The username in the service's access token
# 
#         Returns
#         -------
#         str
#         """
#         token = self.session.params.get('access_token')
#         if not token:
#             raise errors.TokenError(
#                 "session does not have a valid access_token param")
#         data = token.split('.')[1]
#         # replace url chars and add padding
#         # (https://gist.github.com/perrygeo/ee7c65bb1541ff6ac770)
#         data = data.replace('-', '+').replace('_', '/') + "==="
#         try:
#             return json.loads(base64.b64decode(data).decode('utf-8'))['u']
#         except (ValueError, KeyError):
#             raise errors.TokenError(
#                 "access_token does not contain username")
# 
#     def handle_http_error(self, response, custom_messages=None,
#                           raise_for_status=False):
#         """Converts service errors to Python exceptions
# 
#         Parameters
#         ----------
#         response : requests.Response
#             A service response.
#         custom_messages : dict, optional
#             A mapping of custom exception messages to HTTP status codes.
#         raise_for_status : bool, optional
#             If True, the requests library provides Python exceptions.
# 
#         Returns
#         -------
#         None
#         """
#         if not custom_messages:
#             custom_messages = {}
#         if response.status_code in custom_messages.keys():
#             raise errors.HTTPError(custom_messages[response.status_code])
#         if raise_for_status:
#             response.raise_for_status()
# 
# Path: mapbox/utils.py
# def normalize_geojson_featurecollection(obj):
#     """Takes a geojson-like mapping representing
#     geometry, Feature or FeatureCollection (or a sequence of such objects)
#     and returns a FeatureCollection-like dict
#     """
#     if not isinstance(obj, Sequence):
#         obj = [obj]
# 
#     features = []
#     for x in obj:
#         if not isinstance(x, Mapping) or 'type' not in x:
#             raise ValueError(
#                 "Expecting a geojson-like mapping or sequence of them")
# 
#         if 'features' in x:
#             features.extend(x['features'])
#         elif 'geometry' in x:
#             features.append(x)
#         elif 'coordinates' in x:
#             feat = {'type': 'Feature',
#                     'properties': {},
#                     'geometry': x}
#             features.append(feat)
#         else:
#             raise ValueError(
#                 "Expecting a geojson-like mapping or sequence of them")
# 
#     return {'type': 'FeatureCollection', 'features': features}


# Path: mapbox/services/static.py
import json
from uritemplate import URITemplate
from mapbox import errors
from mapbox.services.base import Service
from mapbox.utils import normalize_geojson_featurecollection





class Static(Service):
    """Access to the Static Map API V4"""

    api_name = None
    api_version = 'v4'

    @property
    def baseuri(self):
        return 'https://{0}/{1}'.format(self.host, self.api_version)

    def _validate_lat(self, val):
        if val < -85.0511 or val > 85.0511:

            raise errors.InvalidCoordError(