
    Qf9z                         d dl Z d dlZ	 d dlZn# e$ r	 d dlmZ Y nw xY wd dlmZmZmZm	Z	m
Z
 d dlZd dlZd dlmZmZmZmZmZmZmZ  G d d          ZdS )    N)zoneinfo)AnyDictOptionalTupleUnion)
Depression	ElevationLocationInfoObserverSunDirectiondms_to_floattodayc                      e Zd ZdZd:dee         fdZdedefdZ	de
fdZedefd	            Zedefd
            Zede
fd            Zej        de
ddfd            Zede
fd            Zej        de
ddfd            Zedefd            Zej        deee
f         ddfd            Zedefd            Zej        deee
f         ddfd            Zede
fd            Zej        de
ddfd            Zedej        fd            ZeZedefd            Zej        deee
ef         ddfd            Zd;dedej        fdZ 	 	 	 d<d!eej                 ded"e!de"e
e#f         fd#Z$	 	 	 d<d!eej                 ded"e!dej        fd$Z%	 	 	 d<d!eej                 ded"e!dej        fd%Z&	 d=d!eej                 dedej        fd&Z'	 	 	 d<d!eej                 ded"e!dej        fd'Z(	 	 	 d<d!eej                 ded"e!dej        fd(Z)	 d=d!eej                 dedej        fd)Z*	 	 	 d<d!eej                 ded"e!de+ej        ej        f         fd*Z,	 	 	 d<d!eej                 ded"e!de+ej        ej        f         fd+Z-de.j/        dd fd!eej                 d,e.ded"e!fd-Z0	 	 d=d!eej                 dedeej                 fd.Z1	 	 d=d!eej                 dedeej                 fd/Z2de.j/        dfd0ed!eej                 d,e.dedej        f
d1Z3	 	 	 d<d!eej                 ded"e!de+ej        ej        f         fd2Z4e.j/        ddd fd,e.d!eej                 ded"e!de+ej        ej        f         f
d3Z5e.j/        ddd fd,e.d!eej                 ded"e!de+ej        ej        f         f
d4Z6	 	 d>d5eej                 d"e!defd6Z7	 	 d>d5eej                 d"e!defd7Z8	 	 d>d5eej                 d"e!defd8Z9d=d!eej                 defd9Z:dS )?Locationz3Provides access to information for single location.Ninfoc                 |    |  t           j        j        | _        |st	          ddddd          | _        dS || _        dS )a   Initializes the Location with a LocationInfo object.

        The tuple should contain items in the following order

        ================ =============
        Field            Default
        ================ =============
        name             Greenwich
        region           England
        time zone name   Europe/London
        latitude         51.4733
        longitude        -0.0008333
        ================ =============

        See the :attr:`timezone` property for a method of obtaining time zone
        names
        	GreenwichEnglandzEurope/Londong1*I@g~:NKN)r	   CIVILvalue_solar_depressionr   _location_info)selfr   s     N/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/astral/location.py__init__zLocation.__init__   sS    & 	)(2(8(> 	'".Y*# #D #'D    otherreturnc                 \    t          |          t          u r| j        |j        k    S t          S N)typer   r   NotImplemented)r   r   s     r   __eq__zLocation.__eq__8   s*    ;;(""&%*>>>r   c                 ~    | j         r| j        d| j         }n| j        }| d| j         d| j        dd| j        dS )N/z, tz=z, lat=z0.02fz, lon=)regionnametimezonelatitude	longitude)r   _reprs     r   __repr__zLocation.__repr__=   sm    ; 	#yyy$++6EEIE * *4= * *=** *>)* *	
r   c                 Z    t          | j        | j        | j        | j        | j                  S r!   )r   r(   r'   r)   r*   r+   r   s    r   r   zLocation.infoH   s-    IKMMN
 
 	
r   c                 8    t          | j        | j        d          S N        )r   r*   r+   r/   s    r   observerzLocation.observerR   s    t~s;;;r   c                     | j         j        S r!   )r   r(   r/   s    r   r(   zLocation.nameV   s    "''r   r(   c                 F    t          j        | j        |          | _        d S )N)r(   dataclassesreplacer   r   r(   s     r   r(   zLocation.nameZ   s#    )1$2EDQQQr   c                     | j         j        S r!   )r   r'   r/   s    r   r'   zLocation.region^   s    "))r   r'   c                 F    t          j        | j        |          | _        d S )N)r'   r6   )r   r'   s     r   r'   zLocation.regionb   s#    )1$2EfUUUr   c                     | j         j        S )u
  The location's latitude

        ``latitude`` can be set either as a string or as a number

        For strings they must be of the form

            degrees°minutes'[N|S] e.g. 51°31'N

        For numbers, positive numbers signify latitudes to the North.
        )r   r*   r/   s    r   r*   zLocation.latitudef   s     "++r   r*   c                 b    t          j        | j        t          |d                    | _        d S )N     V@)r*   r7   r8   r   r   )r   r*   s     r   r*   zLocation.latitudeu   s4    )1,x*F*F
 
 
r   c                     | j         j        S )u  The location's longitude.

        ``longitude`` can be set either as a string or as a number

        For strings they must be of the form

            degrees°minutes'[E|W] e.g. 51°31'W

        For numbers, positive numbers signify longitudes to the East.
        )r   r+   r/   s    r   r+   zLocation.longitude{   s     ",,r   r+   c                 b    t          j        | j        t          |d                    | _        d S )N     f@)r+   r?   )r   r+   s     r   r+   zLocation.longitude   s4    )1<	5+I+I
 
 
r   c                     | j         j        S )zThe name of the time zone for the location.

        A list of time zone names can be obtained from the zoneinfo module.
        For example.

        >>> import zoneinfo
        >>> assert "CET" in zoneinfo.available_timezones()
        )r   r)   r/   s    r   r)   zLocation.timezone   s     "++r   c                     |t          j                    vrt          d|z            t          j        | j        |          | _        d S )NzTimezone '%s' not recognized)r)   )r   available_timezones
ValueErrorr7   r8   r   r9   s     r   r)   zLocation.timezone   sL    x35555;dBCCC)1$2EPTUUUr   c                     	 t          j        | j        j                  }|S # t           j        $ r"}t          d| j        j        z            |d}~ww xY w)zTime zone information.zUnknown timezone '%s'N)r   ZoneInfor   r)   ZoneInfoNotFoundErrorrF   )r   tzexcs      r   tzinfozLocation.tzinfo   sg    	"4#6#?@@BI- 	 	 	'$*=*FF 	s   " AAAc                     | j         S )a  The number of degrees the sun must be below the horizon for the
        dawn/dusk calculation.

        Can either be set as a number of degrees below the horizon or as
        one of the following strings

        ============= =======
        String        Degrees
        ============= =======
        civil            6.0
        nautical        12.0
        astronomical    18.0
        ============= =======
        )r   r/   s    r   solar_depressionzLocation.solar_depression   s    " %%r   
depressionc                     t          |t                    r1	 dddd|         | _        d S # t          $ r t          d          w xY wt          |t                    r|j        | _        d S t          |          | _        d S )Ng      @g      (@g      2@)civilnauticalastronomicalzXsolar_depression must be either a number or one of 'civil', 'nautical' or 'astronomical')
isinstancestrr   KeyErrorr	   r   float)r   rO   s     r   rN   zLocation.solar_depression   s    j#&& 	7  $$(* * 	*&&&
    )   
J// 	7%/%5D"""%*:%6%6D"""s	   * ATlocalc                 J    |rt          | j                  S t                      S r!   )r   rL   )r   rX   s     r   r   zLocation.today   s#     	%%%77Nr   r2   dateobserver_elevationc                 >   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r,t          j                            ||| j        | j	                  S t          j                            ||| j                  S )a  Returns dawn, sunrise, noon, sunset and dusk as a dictionary.

        :param date: The date for which to calculate the times.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: Dictionary with keys ``dawn``, ``sunrise``, ``noon``,
            ``sunset`` and ``dusk`` whose values are the results of the
            corresponding methods.
        N6Local time requested but Location has no timezone set.)
r)   rF   r   r   r*   r+   astralsunrN   rL   r   rZ   rX   r[   r3   s        r   r_   zLocation.sun   s    .  	WT]*UVVV<::e$$DDM4>;MNN 	I:>>(D$2GUUU:>>(D$2GHHHr   c                 >   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r,t          j                            ||| j	        | j
                  S t          j                            ||| j	                  S )a  Calculates the time in the morning when the sun is a certain number
        of degrees below the horizon. By default this is 6 degrees but can be
        changed by setting the :attr:`Astral.solar_depression` property.

        :param date: The date for which to calculate the dawn time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: The date and time at which dawn occurs.
        Nr]   )r)   rF   r   r   r*   r+   r^   r_   dawnrN   rL   r`   s        r   rb   zLocation.dawn  s    .  	WT]*UVVV<::e$$DDM4>;MNN 	J:??8T43H$+VVV:??8T43HIIIr   c                 &   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Return sunrise time.

        Calculates the time in the morning when the sun is a 0.833 degrees
        below the horizon. This is to account for refraction.

        :param date: The date for which to calculate the sunrise time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: The date and time at which sunrise occurs.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   sunriserL   r`   s        r   rd   zLocation.sunrise)  s    0  	WT]*UVVV<::e$$DDM4>;MNN 	6:%%hdkBBB:%%h555r   c                 $   |r| j         t          d          ||                     |          }t          | j        | j                  }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Calculates the solar noon (the time when the sun is at its highest
        point.)

        :param date: The date for which to calculate the noon time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :returns: The date and time at which the solar noon occurs.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   noonrL   r   rZ   rX   r3   s       r   rf   zLocation.noonN  s       	WT]*UVVV<::e$$DDM4>:: 	3:??8T4;???:??8T222r   c                 &   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Calculates sunset time (the time in the evening when the sun is a
        0.833 degrees below the horizon. This is to account for refraction.)

        :param date: The date for which to calculate the sunset time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: The date and time at which sunset occurs.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   sunsetrL   r`   s        r   ri   zLocation.sunsetj  s    ,  	WT]*UVVV<::e$$DDM4>;MNN 	5:$$XtT[AAA:$$Xt444r   c                 >   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r,t          j                            ||| j	        | j
                  S t          j                            ||| j	                  S )a  Calculates the dusk time (the time in the evening when the sun is a
        certain number of degrees below the horizon. By default this is 6
        degrees but can be changed by setting the
        :attr:`solar_depression` property.)

        :param date: The date for which to calculate the dusk time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: The date and time at which dusk occurs.
        Nr]   )r)   rF   r   r   r*   r+   r^   r_   duskrN   rL   r`   s        r   rk   zLocation.dusk  s    0  	WT]*UVVV<::e$$DDM4>;MNN 	J:??8T43H$+VVV:??8T43HIIIr   c                 $   |r| j         t          d          ||                     |          }t          | j        | j                  }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Calculates the solar midnight (the time when the sun is at its lowest
        point.)

        :param date: The date for which to calculate the midnight time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :returns: The date and time at which the solar midnight occurs.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   midnightrL   rg   s       r   rm   zLocation.midnight  s       	WT]*UVVV<::e$$DDM4>:: 	7:&&xt{CCC:&&x666r   c                 &   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r&t          j                            ||| j	                  S t          j                            ||          S )as  Calculates the daylight time (the time between sunrise and sunset)

        :param date: The date for which to calculate daylight.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: A tuple containing the start and end times
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   daylightrL   r`   s        r   ro   zLocation.daylight  s    *  	WT]*UVVV<::e$$DDM4>;MNN 	7:&&xt{CCC:&&x666r   c                 &   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Calculates the night time (the time between astronomical dusk and
        astronomical dawn of the next day)

        :param date: The date for which to calculate the start of the night time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :returns: A tuple containing the start and end times
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   nightrL   r`   s        r   rq   zLocation.night  s    ,  	WT]*UVVV<::e$$DDM4>;MNN 	4:##HdDK@@@:##Hd333r   	directionc                 *   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r't          j                            |||| j	                  S t          j                            |||          S )a  Returns the start and end times of Twilight in the UTC timezone when
        the sun is traversing in the specified direction.

        This method defines twilight as being between the time
        when the sun is at -6 degrees and sunrise/sunset.

        :param direction:  Determines whether the time is for the sun rising or setting.
                           Use ``astral.SUN_RISING`` or ``astral.SunDirection.SETTING``.

        :param date: The date for which to calculate the times.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :return: A tuple of the UTC date and time at which twilight starts and ends.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   twilightrL   )r   rZ   rr   rX   r[   r3   s         r   rt   zLocation.twilight  s    8  	WT]*UVVV<::e$$DDM4>;MNN 	B:&&xy$+NNN:&&xyAAAr   c                 &   |r| j         t          d          ||                     |          }t          | j        | j        d          }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Calculates the time when the moon rises.

        :param date: The date for which to calculate the moonrise time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :returns: The date and time at which moonrise occurs.
        Nr]   r   )
r)   rF   r   r   r*   r+   r^   moonmoonriserL   rg   s       r   rw   zLocation.moonrise=  s    "  	WT]*UVVV<::e$$DDM4>1== 	8;''$DDD;''$777r   c                 &   |r| j         t          d          ||                     |          }t          | j        | j        d          }|r&t          j                            ||| j	                  S t          j                            ||          S )a  Calculates the time when the moon sets.

        :param date: The date for which to calculate the moonset time.
                     If no date is specified then the current date will be used.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :returns: The date and time at which moonset occurs.
        Nr]   r   )
r)   rF   r   r   r*   r+   r^   rv   moonsetrL   rg   s       r   ry   zLocation.moonset[  s    "  	WT]*UVVV<::e$$DDM4>1== 	7;&&xt{CCC;&&x666r   	elevationc                 \   |r| j         t          d          ||                     |          }|dk    rd|z
  }t          j        }t          | j        | j        d          }|r(t          j	        
                    ||||| j                  S t          j	        
                    ||||          S )a%  Calculate the time when the sun is at the specified elevation.

        Note:
            This method uses positive elevations for those above the horizon.

            Elevations greater than 90 degrees are converted to a setting sun
            i.e. an elevation of 110 will calculate a setting sun at 70 degrees.

        :param elevation:  Elevation in degrees above the horizon to calculate for.

        :param date: The date for which to calculate the elevation time.
                     If no date is specified then the current date will be used.

        :param direction:  Determines whether the time is for the sun rising or setting.
                           Use ``SunDirection.RISING`` or ``SunDirection.SETTING``.
                           Default is rising.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.
                      If not specified then the time will be returned in local time

        :returns: The date and time at which dusk occurs.
        Nr]   r>   rB   r2   )r)   rF   r   r   SETTINGr   r*   r+   r^   r_   time_at_elevationrL   )r   rz   rZ   rr   rX   r3   s         r   r}   zLocation.time_at_elevationy  s    >  	WT]*UVVV<::e$$Dt	)I$,IDM4>3?? 	V://)T9dk   ://)T9UUUr   c                 (   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r't          j                            ||| j	                  S t          j                            ||          S )a
  Calculates the period of rahukaalam.

        :param date: The date for which to calculate the rahukaalam period.
                     A value of ``None`` uses the current date.

        :param local: True  = Time to be returned in location's time zone;
                      False = Time to be returned in UTC.

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :return: Tuple containing the start and end times for Rahukaalam.
        Nr]   rL   )
r)   rF   r   r   r*   r+   r^   r_   
rahukaalamrL   r`   s        r   r   zLocation.rahukaalam  s    (  	WT]*UVVV<::e$$DDM4>;MNN 	9:((4(LLL:((4888r   c                 *   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r't          j                            |||| j	                  S t          j                            |||          S )a  Returns the start and end times of the Golden Hour when the sun is traversing
        in the specified direction.

        This method uses the definition from PhotoPills i.e. the
        golden hour is when the sun is between 4 degrees below the horizon
        and 6 degrees above.

        :param direction:  Determines whether the time is for the sun rising or setting.
                           Use ``SunDirection.RISING`` or ``SunDirection.SETTING``.
                           Default is rising.

        :param date: The date for which to calculate the times.

        :param local: True  = Times to be returned in location's time zone;
                      False = Times to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :return: A tuple of the date and time at which the Golden Hour starts and ends.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   golden_hourrL   r   rr   rZ   rX   r[   r3   s         r   r   zLocation.golden_hour  s    <  	WT]*UVVV<::e$$DDM4>;MNN 	E:))(D)T[QQQ:))(D)DDDr   c                 *   |r| j         t          d          ||                     |          }t          | j        | j        |          }|r't          j                            |||| j	                  S t          j                            |||          S )a*  Returns the start and end times of the Blue Hour when the sun is traversing
        in the specified direction.

        This method uses the definition from PhotoPills i.e. the
        blue hour is when the sun is between 6 and 4 degrees below the horizon.

        :param direction:  Determines whether the time is for the sun rising or setting.
                           Use ``SunDirection.RISING`` or ``SunDirection.SETTING``.
                           Default is rising.

        :param date: The date for which to calculate the times.
                     If no date is specified then the current date will be used.

        :param local: True  = Times to be returned in location's time zone;
                      False = Times to be returned in UTC.
                      If not specified then the time will be returned in local time

        :param observer_elevation: Elevation of the observer in metres above
                                   the location.

        :return: A tuple of the date and time at which the Blue Hour starts and ends.
        Nr]   )
r)   rF   r   r   r*   r+   r^   r_   	blue_hourrL   r   s         r   r   zLocation.blue_hour  s    <  	WT]*UVVV<::e$$DDM4>;MNN 	C:''$	4;OOO:''$	BBBr   dateandtimec                 R   |%t           j                            | j                  }n"|j        s|                    | j                  }t          | j        | j        |          }|                    t          j
        j                  }t           j                            ||          S )zCalculates the solar azimuth angle for a specific date/time.

        :param dateandtime: The date and time for which to calculate the angle.
        :returns: The azimuth angle in degrees clockwise from North.
        Nr   )r^   r_   nowrL   r8   r   r*   r+   
astimezonedatetimer)   utcazimuthr   r   r[   r3   s       r   solar_azimuthzLocation.solar_azimuth"  s      *..55KK# 	B%--T[-AAKDM4>;MNN!,,X->-BCCz!!(K888r   c                 R   |%t           j                            | j                  }n"|j        s|                    | j                  }t          | j        | j        |          }|                    t          j
        j                  }t           j                            ||          S )zCalculates the solar elevation angle for a specific time.

        :param dateandtime: The date and time for which to calculate the angle.

        :returns: The elevation angle in degrees above the horizon.
        Nr   )r^   r_   r   rL   r8   r   r*   r+   r   r   r)   r   rz   r   s       r   solar_elevationzLocation.solar_elevation7  s      *..55KK# 	B%--T[-AAKDM4>;MNN!,,X->-BCCz##Hk:::r   c                 4    d|                      ||          z
  S )zCalculates the solar zenith angle for a specific time.

        :param dateandtime: The date and time for which to calculate the angle.
        :returns: The zenith angle in degrees from vertical.
        r>   )r   )r   r   r[   s      r   solar_zenithzLocation.solar_zenithM  s      d**;8JKKKKr   c                 n    ||                      |          }t          j                            |          S )a  Calculates the moon phase for a specific date.

        :param date:    The date to calculate the phase for. If ommitted the
                        current date is used.

        :returns:
            A number designating the phase

            ============  ==============
            0 .. 6.99     New moon
            7 .. 13.99    First quarter
            14 .. 20.99   Full moon
            21 .. 27.99   Last quarter
            ============  ==============
        )r   r^   rv   phase)r   rZ   rX   s      r   
moon_phasezLocation.moon_phaseZ  s0    " <::e$$D{  &&&r   r!   )T)NTr2   )NTr1   );__name__
__module____qualname____doc__r   r   r   objectboolr$   rU   r-   propertyr   r   r3   r(   setterr'   rW   r*   r   r+   r)   r   rH   rL   rJ   rN   r	   r   rZ   r   r
   r   r   r_   rb   rd   rf   ri   rk   rm   r   ro   rq   r   RISINGrt   rw   ry   r}   r   r   r   r   r   r   r    r   r   r   r      s7
       ==' 'Xl3 ' ' ' ':F t    
	
# 	
 	
 	
 	
 
l 
 
 
 X
 <( < < < X< (c ( ( ( X( 
[R R R R R [R * * * * X* ]VS VT V V V ]V ,% , , , X, _
ucz!2 
t 
 
 
 _

 -5 - - - X- 
5#4 
 
 
 
 

 
,# 
, 
, 
, X
, _VS VT V V V _V 	) 	 	 	 X	 
B&% & & & X&$ 75Z1G+H 7T 7 7 7 7* 4 8=     )-(+	"I "Ix}%"I "I &	"I
 
c3h"I "I "I "IL )-(+	"J "Jx}%"J "J &	"J
 
	"J "J "J "JL )-(+	#6 #6x}%#6 #6 &	#6
 
	#6 #6 #6 #6L CG3 3X]+3;?3		3 3 3 3< )-(+	!5 !5x}%!5 !5 &	!5
 
	!5 !5 !5 !5J )-(+	#J #Jx}%#J #J &	#J
 
	#J #J #J #JL CG7 7X]+7;?7		7 7 7 7> )-(+	 7  7x}% 7  7 &	 7
 
x ("33	4 7  7  7  7H )-(+	!4 !4x}%!4 !4 &	!4
 
x ("33	4!4 !4 !4 !4J )-"."5(+'B 'Bx}%'B  'B 	'B
 &'B 'B 'B 'BV )-8 8x}%8 8 
(#	$	8 8 8 8@ )-7 7x}%7 7 
(#	$	7 7 7 7B )-"."50V 0V0V x}%0V  	0V
 0V 
	0V 0V 0V 0Vh )-(+	9 9x}%9 9 &	9
 
x ("33	49 9 9 9F #/"5(,(+)E )E)E x}%)E 	)E
 &)E 
x ("33	4)E )E )E )EZ #/"5(,(+)C )C)C x}%)C 	)C
 &)C 
x ("33	4)C )C )C )CZ 48(+9 9h/09 &9 
	9 9 9 9. 48(+; ;h/0; &; 
	; ; ; ;0 48(+L Lh/0L &L 
	L L L L' 'x6 'd ' ' ' ' ' 'r   r   )r7   r   r   ImportError	backportstypingr   r   r   r   r   astral.moonr^   
astral.sunr	   r
   r   r   r   r   r   r   r   r   r   <module>r      s7       #OOOO # # #""""""""# 5 4 4 4 4 4 4 4 4 4 4 4 4 4                         V' V' V' V' V' V' V' V' V' V's    