ephessos 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ephessos/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ """
2
+ EPHESSOS: Ephemeris for Solar System Objects with JPL/Horizons
3
+
4
+ Alejandro S. Borlaff
5
+ NASA Ames Research Center, Moffett Field, 94035, California, USA.
6
+ a.s.borlaff@nasa.gov
7
+ """
8
+ import ephessos.core
ephessos/core.py ADDED
@@ -0,0 +1,198 @@
1
+ from astropy.time import Time
2
+ from astropy.table import vstack
3
+ import astropy.units as u
4
+ import numpy as np
5
+ import pandas as pd
6
+
7
+ def sso_query_to_horizons(designation, epoch=None, eccentricity=None, node=None, arg_perihelion=None, inclination=None, mean_anomaly=None, semimajor_axis=None, mean_motion=None, mjd_start=58849.0, mjd_end=61042.0, step_size="1d", verbose=False):
8
+ # Example of a HTTP API Request to Horizons:
9
+ request_url = "https://ssd.jpl.nasa.gov/api/horizons.api?format=text&"
10
+ # request_url = "https://ssd.jpl.nasa.gov/api/horizons.api?"
11
+ # 00433 10.38 0.15 K25BL 310.55432 178.92978 304.27008 10.82847 0.2228360 0.55977529 1.4581210 0 E2025-YE5 16519 59 1893-2025 0.52 M-v 3Ek MPCORBFIT 1804 (433) Eros 20251222
12
+ """
13
+ OBJECT = df.iloc[0]["Designation"] # Name of user input object
14
+ EPOCH = df.iloc[0]["Epoch"] # Julian Day number (JDTDB) of osculating elements
15
+ ECLIP = "J2000" # Reference ecliptic frame of elements: J2000 or B1950. J2000 assumes the IAU76/80 J2000 obliquity of 84381.448 arcsec relative to the ICRF reference frame. B1950 assumes FK4/B1950 obliquity of 84404.8362512 arcsec.
16
+ EC = str(df.iloc[0]["Eccentricity"]) # Eccentricity
17
+ # QR = # au Perihelion distance (see note above)
18
+ # TP = # Perihelion Julian Day number (see note above)
19
+ OM = str(df.iloc[0]["Node"]) # deg Longitude of ascending node wrt ecliptic
20
+ W = str(df.iloc[0]["Arg_Perihelion"]) # deg Argument of perihelion wrt ecliptic
21
+ IN = str(df.iloc[0]["Inclination"]) # deg Inclination wrt ecliptic
22
+ MA = str(df.iloc[0]["Mean_Anomaly"]) # deg Mean anomaly (see note above)
23
+ A = str(df.iloc[0]["Semimajor_Axis"]) # au Semi-major axis (see note above)
24
+ N = str(df.iloc[0]["Mean_Motion"]) # deg/d Mean motion (see note above)
25
+ """
26
+ OBJECT = designation # Name of user input object
27
+ EPOCH = epoch # Julian Day number (JDTDB) of osculating elements
28
+ ECLIP = "J2000" # Reference ecliptic frame of elements: J2000
29
+ EC = str(eccentricity) # Eccentricity
30
+ # QR = # au Perihelion distance (see note above
31
+ # TP = # Perihelion Julian Day number (see note above)
32
+ OM = str(node) # deg Longitude of ascending node wrt ecliptic
33
+ W = str(arg_perihelion) # deg Argument of perihelion wrt ecliptic
34
+ IN = str(inclination) # deg Inclination wrt ecliptic
35
+ MA = str(mean_anomaly) # deg Mean anomaly (see note above)
36
+ A = str(semimajor_axis) # au Semi-major axis
37
+ N = str(mean_motion) # deg/d Mean motion (see note above)
38
+
39
+ # HEOE = ';TEST,2460400.5,1.5,0.2,10.5,45.0,30.0,20240401,1.0,J2000'
40
+
41
+ # Process time range for ephemeris query
42
+ from astropy.time import Time
43
+ t_start = Time(mjd_start, format='mjd')
44
+ t_end = Time(mjd_end, format='mjd')
45
+
46
+ if verbose:
47
+ print("--designation="+designation+" --epoch="+str(epoch)+" --eccentricity="+str(eccentricity)+" --node="+str(node)+", --arg_perihelion="+str(arg_perihelion)+" --inclination="+str(inclination)+" --mean_anomaly="+str(mean_anomaly)+" --semimajor_axis="+str(semimajor_axis)+" --mean_motion="+str(mean_motion)+" --mjd_start="+str(mjd_start)+" --mjd_end="+str(mjd_end)+" --step_size="+step_size)
48
+
49
+ """
50
+ # request_url = request_url + "&COMMAND='1'"
51
+ """
52
+
53
+ if eccentricity is None and node is None and arg_perihelion is None and inclination is None and mean_anomaly is None and semimajor_axis is None:
54
+ request_url = request_url + "COMMAND='" + OBJECT + "'"
55
+ else:
56
+ request_url = request_url + "COMMAND=';'"
57
+ if designation is not None: request_url = request_url + "&OBJECT="+OBJECT
58
+ if epoch is not None: request_url = request_url + "&EPOCH=2461000.83333"#+EPOCH
59
+ request_url = request_url + "&ECLIP="+ECLIP
60
+ if eccentricity is not None: request_url = request_url + "&EC="+EC
61
+ if node is not None: request_url = request_url + "&OM="+OM
62
+ if arg_perihelion is not None: request_url = request_url + "&W="+W
63
+ if inclination is not None: request_url = request_url + "&IN="+IN
64
+ if mean_anomaly is not None: request_url = request_url + "&MA="+MA
65
+ if semimajor_axis is not None: request_url = request_url + "&A="+A
66
+ # request_url = request_url + "&N="+N
67
+
68
+ # request_url = request_url + "&COMMAND='499'"
69
+ request_url = request_url + "&OBJ_DATA='YES'"
70
+ request_url = request_url + "&MAKE_EPHEM='YES'"
71
+ request_url = request_url + "&EPHEM_TYPE='OBSERVER'"
72
+ request_url = request_url + "&CENTER='500@399'"
73
+ request_url = request_url + "&START_TIME='" + t_start.isot + "'"
74
+ request_url = request_url + "&STOP_TIME='"+ t_end.isot + "'"
75
+ request_url = request_url + "&STEP_SIZE='" + step_size + "'"
76
+ request_url = request_url + "&CSV_FORMAT='YES'"
77
+ request_url = request_url + "&QUANTITIES='1,2,3,4,5,6,7,8,9,10,20,23,24,25,27,29'"
78
+ # request_url = request_url.replace(",", "%3B")
79
+
80
+ import urllib.request
81
+ if verbose: print(request_url)
82
+
83
+ request_url = request_url.replace(";","%3B")
84
+
85
+ fp = urllib.request.urlopen(request_url)
86
+ mybytes = fp.read()
87
+
88
+ mystr = mybytes.decode("utf8")
89
+ fp.close()
90
+
91
+ lines_horizons_query = np.array(mystr.split('\n'))
92
+ id_start_of_table = np.where(lines_horizons_query == '$$SOE')[0][0]
93
+ id_end_of_table = np.where(lines_horizons_query == '$$EOE')[0][0]
94
+ id_column_names = id_start_of_table - 2
95
+ horizons_column_names = lines_horizons_query[id_column_names]
96
+ horizons_data_table = lines_horizons_query[id_start_of_table+1:id_end_of_table]
97
+ n_rows = len(lines_horizons_query[id_start_of_table+1:id_end_of_table])
98
+
99
+ csv_table_list = []
100
+ # csv_table_list = csv_table_list + [horizons_column_names.split(',')]
101
+
102
+ for i in range(n_rows):
103
+ csv_table_list = csv_table_list + [horizons_data_table[i].split(',')]
104
+
105
+ # print(csv_table_list)
106
+
107
+ horizons_dataframe = pd.DataFrame(np.array(csv_table_list), columns=horizons_column_names.split(','))
108
+
109
+ ra_icrf = np.zeros(len(horizons_dataframe), dtype=object)
110
+ dec_icrf = np.zeros(len(horizons_dataframe), dtype=object)
111
+ date_hms = np.zeros(len(horizons_dataframe), dtype=object)
112
+ mjd = np.zeros(len(horizons_dataframe))
113
+
114
+ time_column_name = horizons_dataframe.columns[0]
115
+
116
+ for i in range(len(horizons_dataframe)):
117
+ ra_icrf[i] = horizons_dataframe[" R.A._(ICRF)"].iloc[i][1:].replace(" ",":")
118
+ dec_icrf[i] = horizons_dataframe[" DEC__(ICRF)"].iloc[i][1:].replace(" ",":")
119
+ date_hms[i] = translate_horizons_date_to_date_hms(horizons_dataframe[time_column_name].iloc[i])[1:]
120
+ mjd[i] = Time(date_hms[i], format='iso').mjd
121
+
122
+ print(date_hms)
123
+
124
+ from astropy.coordinates import SkyCoord # High-level coordinates
125
+ coords = SkyCoord(ra_icrf, dec_icrf, unit=(u.hourangle, u.deg))
126
+ horizons_dataframe["RA_deg_ICRF"] = coords.ra.deg
127
+ horizons_dataframe["DEC_deg_ICRF"] = coords.dec.deg
128
+ horizons_dataframe["MJD"] = mjd
129
+ return(horizons_dataframe)
130
+
131
+
132
+ def translate_horizons_date_to_date_hms(horizons_date):
133
+ # Example input: "2025-Jan-22 00:00"
134
+ # Convert to ISO format: "2025-01-22T00:00:00"
135
+ date_hms = horizons_date.replace("Jan","01").replace("Feb","02").replace("Mar","03").replace("Apr","04").replace("May","05").replace("Jun","06").replace("Jul","07").replace("Aug","08").replace("Sep","09").replace("Oct","10").replace("Nov","11").replace("Dec","12")
136
+ return date_hms
137
+
138
+
139
+
140
+
141
+
142
+ def read_mpc_nea_file(file_path):
143
+ # Define the exact character ranges based on the MPC schema
144
+ # Note: pandas uses 0-based indexing and the 'stop' value is exclusive
145
+ col_specification = [
146
+ (0, 7), # Designation
147
+ (8, 13), # H (Absolute Mag)
148
+ (14, 19), # G (Slope Parameter)
149
+ (20, 25), # Epoch
150
+ (26, 35), # Mean Anomaly
151
+ (37, 46), # Argument of Perihelion
152
+ (48, 57), # Longitude of Ascending Node
153
+ (59, 68), # Inclination
154
+ (70, 79), # Eccentricity
155
+ (80, 91), # Mean Daily Motion
156
+ (92, 103), # Semimajor Axis
157
+ (105, 106), # Uncertainty (U)
158
+ (107, 116), # Reference
159
+ (117, 122), # Num observations
160
+ (123, 126), # Num oppositions
161
+ (127, 131), # First year / Arc
162
+ (132, 136), # Last year / 'days'
163
+ (137, 141), # r.m.s residual
164
+ (142, 145), # Perturbers (Coarse)
165
+ (146, 149), # Perturbers (Precise)
166
+ (150, 160), # Computer Name
167
+ (161, 165), # Flags (Hex)
168
+ (166, 174), # Numerical ID
169
+ (175, 194), # Readable Designation
170
+ (194, 202) # Last Observation Date
171
+ ]
172
+
173
+ column_names = [
174
+ "Designation", "H", "G", "Epoch", "Mean_Anomaly", "Arg_Perihelion",
175
+ "Node", "Inclination", "Eccentricity", "Mean_Motion", "Semimajor_Axis",
176
+ "Uncertainty", "Ref", "Obs_Count", "Opp_Count", "First_Obs", "Last_Obs_Arc",
177
+ "RMS_Resid", "Pert_Coarse", "Pert_Precise", "Comp_Name", "Flags", "Num_ID",
178
+ "Full_Name", "Last_Obs_Date"
179
+ ]
180
+
181
+ # Read the file
182
+ # Replace 'NEA.txt' with the path to your downloaded file
183
+ df = pd.read_fwf(
184
+ file_path,
185
+ colspecs=col_specification,
186
+ names=column_names,
187
+ header=None
188
+ )
189
+
190
+ # Optional: Convert numeric columns that might have been read as strings
191
+ df['H'] = pd.to_numeric(df['H'], errors='coerce')
192
+ df['Semimajor_Axis'] = pd.to_numeric(df['Semimajor_Axis'], errors='coerce')
193
+ #df[['ID', 'Name']] = df['Full_Name'].str.extract(r'(\(.*\))\s+(.*)')
194
+ df["Designation"] = df["Designation"].astype(str)
195
+
196
+ # Preview the first few rows
197
+ print(df.head())
198
+ return(df)
@@ -0,0 +1,59 @@
1
+ #!python
2
+
3
+ import ephessos as ep
4
+ import argparse
5
+ import yaml
6
+ import glob
7
+ from astropy.time import Time
8
+
9
+
10
+
11
+ def go(args):
12
+
13
+ if (args.eccentricity is None):
14
+ print('Warning! Please input a some Heliocentric Ecliptic Osculating Elements. Check https://ssd-api.jpl.nasa.gov/doc/horizons.html for more information.')
15
+ print('EPHESSOS / Ephemeris for Solar System Objects with JPL/Horizons')
16
+ # print('EXAMPLE: ephessos --mjdstart 58849.0 --mjdend 61042.0')
17
+ return
18
+
19
+ else:
20
+ horizons_dataframe = ep.core.sso_query_to_horizons(designation=args.designation,
21
+ epoch=args.epoch,
22
+ eccentricity=args.eccentricity,
23
+ node=args.node,
24
+ arg_perihelion=args.arg_perihelion,
25
+ inclination=args.inclination,
26
+ mean_anomaly=args.mean_anomaly,
27
+ semimajor_axis=args.semimajor_axis,
28
+ mean_motion=args.mean_motion,
29
+ mjd_start=args.mjdstart,
30
+ mjd_end=args.mjdend,
31
+ step_size=args.step_size,
32
+ verbose=True)
33
+
34
+
35
+ horizons_dataframe.to_csv(args.output, index=False)
36
+ print(f"Ephemeris data saved to {args.output}")
37
+
38
+ if __name__ == '__main__':
39
+ parser = argparse.ArgumentParser(
40
+ description='EPHESSOS / Ephemeris for Solar System Objects with JPL/Horizons',
41
+ epilog='EXAMPLE: %(prog)s nea_database.txt',
42
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
43
+ parser.add_argument('--designation', type=str, default=None, help='Designation of the solar system object')
44
+ parser.add_argument('--epoch', type=float, default=None, help='Julian Date of the osculating elements')
45
+ parser.add_argument('--eccentricity', type=float, default=None, help='Eccentricity of the orbit')
46
+ parser.add_argument('--node', type=float, default=None, help='Longitude of the ascending node')
47
+ parser.add_argument('--arg_perihelion', type=float, default=None, help='Argument of perihelion')
48
+ parser.add_argument('--inclination', type=float, default=None, help='Inclination of the orbit')
49
+ parser.add_argument('--mean_anomaly', type=float, default=None, help='Mean anomaly')
50
+ parser.add_argument('--semimajor_axis', type=float, default=None, help='Semimajor axis of the orbit')
51
+ parser.add_argument('--mean_motion', type=float, default=None, help='Mean motion')
52
+ parser.add_argument('--mjdstart', type=float, default=None, help='Modified Julian Date of the start of the ephemeris')
53
+ parser.add_argument('--mjdend', type=float, default=None, help='Modified Julian Date of the end of the ephemeris')
54
+ parser.add_argument('--step_size', type=str, default=None, help='Step size for the ephemeris. Example values: "1d" for 1 day, "12h" for 12 hours, "1h" for 1 hour, etc.')
55
+ parser.add_argument('--output', type=str, default="horizons_ephemeris.csv", help='Output file for the ephemeris data. Default is "horizons_ephemeris.csv".')
56
+ parser.add_argument('--verbose', type=float, default=None, help='Verbosity level')
57
+ args = parser.parse_args()
58
+
59
+ go(args)
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.4
2
+ Name: ephessos
3
+ Version: 1.0.0
4
+ Summary: Ephemeris for Solar System Objects with JPL/Horizons
5
+ Author-email: "Alejandro S. Borlaff" <a.s.borlaff@nasa.gov>, Jessie Dotson <jessie.dotson@nasa.gov>
6
+ License: BSD
7
+ Project-URL: Homepage, https://github.com/Borlaff/EPHESSOS
8
+ Project-URL: Repository, https://github.com/Borlaff/EPHESSOS
9
+ Project-URL: Tracker, https://github.com/Borlaff/EPHESSOS/issues
10
+ Project-URL: Documentation, https://ephessos.readthedocs.io/en/stable/
11
+ Project-URL: Source Code, https://github.com/Borlaff/EPHESSOS
12
+ Keywords: HWO,SSOs,Horizons,JPL
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: Topic :: Utilities
16
+ Classifier: License :: OSI Approved :: BSD License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Requires-Python: >=3.9
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: numpy
27
+ Requires-Dist: tqdm
28
+ Requires-Dist: pandas
29
+ Requires-Dist: astroquery
30
+ Requires-Dist: matplotlib
31
+ Requires-Dist: astropy
32
+ Requires-Dist: pytest
33
+ Requires-Dist: ipython
34
+ Requires-Dist: sphinx
35
+ Requires-Dist: sphinx-rtd-dark-mode
36
+ Requires-Dist: sphinxcontrib-video
37
+ Dynamic: license-file
38
+
39
+ # EPHESSOS
40
+ Ephemeris for Solar System Objects with JPL/Horizons
41
+
42
+ [![PyPI version](https://badge.fury.io/py/ephessos.svg)](https://pypi.org/project/ephessos/)
43
+ [![License: BSD](https://img.shields.io/badge/License-BSD-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
44
+
45
+ EPHESSOS is a Python library for querying ephemeris data of solar system objects from NASA's JPL Horizons system. It provides an easy interface to retrieve positional and observational data for asteroids, comets, and planets.
46
+
47
+ ## Features
48
+
49
+ - Query JPL Horizons using orbital elements or object designations
50
+ - Parse MPC NEA (Near-Earth Asteroid) data files
51
+ - Retrieve comprehensive ephemeris data including RA, Dec, distance, and more
52
+ - Support for custom time ranges and step sizes
53
+ - Integration with Astropy for astronomical calculations
54
+
55
+ ## Installation
56
+
57
+ Install EPHESSOS using pip:
58
+
59
+ ```bash
60
+ pip install ephessos
61
+ ```
62
+
63
+ Or from source:
64
+
65
+ ```bash
66
+ git clone https://github.com/Borlaff/EPHESSOS.git
67
+ cd EPHESSOS
68
+ pip install .
69
+ ```
70
+
71
+ ## Quick Start
72
+
73
+ Here's a simple example showing how to query the ephemeris of asteroid (433) Eros:
74
+
75
+ ```python
76
+ import ephessos as ep
77
+ from astropy.time import Time
78
+
79
+ # Define time range
80
+ mjd_start = Time('2024-01-01T00:00:00', format='isot', scale='utc').mjd
81
+ mjd_end = Time('2024-01-15T00:00:00', format='isot', scale='utc').mjd
82
+
83
+ # Query Horizons for Eros (designation: 00433)
84
+ eros_data = ep.core.sso_query_to_horizons(
85
+ designation="00433",
86
+ mjd_start=mjd_start,
87
+ mjd_end=mjd_end,
88
+ step_size="1d",
89
+ verbose=True
90
+ )
91
+
92
+ print(eros_data.head())
93
+ ```
94
+
95
+ This will return a pandas DataFrame containing ephemeris data including:
96
+ - Right Ascension (RA) and Declination (Dec) in degrees
97
+ - Distance from observer
98
+ - Magnitude and other observational quantities
99
+ - Modified Julian Date (MJD)
100
+
101
+ ## Advanced Usage
102
+
103
+ ### Reading MPC Data Files
104
+
105
+ EPHESSOS can parse MPC-formatted NEA files:
106
+
107
+ ```python
108
+ # Read MPC NEA data
109
+ nea_table = ep.core.read_mpc_nea_file("path/to/nea.txt")
110
+
111
+ # Query ephemeris for the first object
112
+ first_object = nea_table.iloc[0]
113
+ data = ep.core.sso_query_to_horizons(
114
+ designation=first_object["Designation"],
115
+ epoch=first_object["Epoch"],
116
+ eccentricity=first_object["Eccentricity"],
117
+ node=first_object["Node"],
118
+ arg_perihelion=first_object["Arg_Perihelion"],
119
+ inclination=first_object["Inclination"],
120
+ mean_anomaly=first_object["Mean_Anomaly"],
121
+ semimajor_axis=first_object["Semimajor_Axis"],
122
+ mean_motion=first_object["Mean_Motion"],
123
+ mjd_start=mjd_start,
124
+ mjd_end=mjd_end,
125
+ step_size="1d"
126
+ )
127
+ ```
128
+
129
+
130
+ ## Documentation
131
+
132
+ Full documentation is available at: [https://ephessos.readthedocs.io/](https://ephessos.readthedocs.io/)
133
+
134
+ ## Contributing
135
+
136
+ Contributions are welcome! Please see our [contributing guidelines](CONTRIBUTING.md) for details.
137
+
138
+ ## License
139
+
140
+ EPHESSOS is licensed under the BSD 3-Clause License. See [LICENSE](LICENSE) for details.
141
+
142
+ ## Citation
143
+
144
+ If you use EPHESSOS in your research, please cite:
145
+
146
+ ```
147
+ Borlaff, A. S., & Dotson, J. (2026). EPHESSOS: Ephemeris for Solar System Objects with JPL/Horizons.
148
+ ```
149
+
150
+ ## Contact
151
+
152
+ - **Authors**: Alejandro S. Borlaff, Jessie Dotson
153
+ - **Email**: a.s.borlaff@nasa.gov, jessie.dotson@nasa.gov
154
+ - **Repository**: [https://github.com/Borlaff/EPHESSOS](https://github.com/Borlaff/EPHESSOS)
@@ -0,0 +1,8 @@
1
+ ephessos/__init__.py,sha256=5IntFcOenbK4wEw10Bh8rpaQLuA_D2tb79OE7ZyF5xk,200
2
+ ephessos/core.py,sha256=u5Roe09jWLGaiZ4cZfV6D_c5Jmul1Qi5maqy1LNRXWI,9624
3
+ ephessos-1.0.0.data/scripts/ephessos,sha256=ksBN0XGLiSnH-J1fB1I5ANbWLP1bluTtbIvO8oTnWro,3218
4
+ ephessos-1.0.0.dist-info/licenses/LICENSE,sha256=HS9fMXdi9KZPwco1Qz-4F7qeioX3GvaQVwpcGW5l5jI,1070
5
+ ephessos-1.0.0.dist-info/METADATA,sha256=lLn1V_-4ynqy3mTzvgEnBGqatxL6KsebEyoymJ7_x1s,4715
6
+ ephessos-1.0.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
7
+ ephessos-1.0.0.dist-info/top_level.txt,sha256=dFGI6P84QZ_I9uIjONH9Xin-W9eGQTl1ZSLtyQ3PKwc,9
8
+ ephessos-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 A. S. Borlaff
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ ephessos