satkit 0.8.5__cp312-cp312-win_amd64.whl → 0.9.0__cp312-cp312-win_amd64.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.
satkit/_version.py CHANGED
@@ -14,5 +14,5 @@ __version__: str
14
14
  __version_tuple__: VERSION_TUPLE
15
15
  version_tuple: VERSION_TUPLE
16
16
 
17
- __version__ = version = "0.8.5"
18
- __version_tuple__ = version_tuple = (0, 8, 5)
17
+ __version__ = version = "0.9.0"
18
+ __version_tuple__ = version_tuple = (0, 9, 0)
Binary file
satkit/satkit.pyi CHANGED
@@ -261,7 +261,7 @@ class TLE:
261
261
  """
262
262
 
263
263
  def sgp4(
264
- tle: TLE | list[TLE],
264
+ tle: TLE | list[TLE] | dict,
265
265
  tm: time | list[time] | npt.ArrayLike,
266
266
  **kwargs,
267
267
  ) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
@@ -276,7 +276,7 @@ def sgp4(
276
276
  https://celestrak.org/publications/AIAA/2008-6770/AIAA-2008-6770.pdf
277
277
 
278
278
  Args:
279
- tle (TLE | list[TLE]): TLE (or list of TLES) on which to operate
279
+ tle (TLE | list[TLE] | dict): TLE or OMM (or list of TLES) on which to operate
280
280
  tm (time | list[time] | npt.ArrayLike[time]): time(s) at which to compute position and velocity
281
281
 
282
282
  Keyword Args:
@@ -294,6 +294,12 @@ def sgp4(
294
294
  Additional return value if errflag is True:
295
295
  list[sgp4_error]: list of errors for each TLE and time output, if errflag is True
296
296
 
297
+ Note:
298
+ Now supports propagation of OMM (Orbital Mean-Element Message) dictionaries
299
+ The dictionaries must follow the structure used by https://www.celestrak.org or
300
+ https://www.space-track.org.
301
+
302
+
297
303
  Example:
298
304
  >>> lines = [
299
305
  >>> "0 INTELSAT 902",
@@ -317,6 +323,20 @@ def sgp4(
317
323
  >>> # Print ITRF coordinate object location
318
324
  >>> print(coord)
319
325
  ITRFCoord(lat: -0.0363 deg, lon: -2.2438 deg, hae: 35799.51 km)
326
+
327
+ Example 2:
328
+ >>> import requests
329
+ >>> import json
330
+ >>>
331
+ >>> # Query ephemeris for the International Space Station (ISS)
332
+ >>> url = 'https://celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=json'
333
+ >>> with requests.get(url) as response:
334
+ >>> omm = response.json()
335
+ >>> # Get a representative time from the output
336
+ >>> epoch = sk.time(omm[0]['EPOCH'])
337
+ >>> # Compute TEME position & velocity at epoch
338
+ >>> pteme, vteme = satkit.sgp4(omm[0], epoch)
339
+
320
340
  """
321
341
 
322
342
  class sgp4_gravconst:
@@ -968,9 +988,30 @@ class time:
968
988
  satkit.time: Time object representing the same instant in time as the input "datetime.datetime" object
969
989
  """
970
990
 
971
- def datetime(self, utc: bool = True) -> datetime.datetime:
991
+ def as_datetime(self, utc: bool = True) -> datetime.datetime:
972
992
  """Convert object to "datetime.datetime" object representing same instant in time.
973
993
 
994
+ Args:
995
+ utc (bool, optional): Whether to make the "datetime.datetime" object represent time in the local timezone or "UTC". Default is True
996
+
997
+ Returns:
998
+ datetime.datetime: "datetime.datetime" object representing the same instant in time as the "satkit.time" object
999
+
1000
+ Example:
1001
+ >>> dt = satkit.time(2023, 6, 3, 6, 19, 34).as_datetime(True)
1002
+ >>> print(dt)
1003
+ 2023-06-03 06:19:34+00:00
1004
+ >>>
1005
+ >>> dt = satkit.time(2023, 6, 3, 6, 19, 34).as_datetime(False)
1006
+ >>> print(dt)
1007
+ 2023-06-03 02:19:34
1008
+ """
1009
+
1010
+ def datetime(self, utc: bool = True) -> datetime.datetime:
1011
+ """Deprecated: use :meth:`satkit.time.as_datetime`.
1012
+
1013
+ Convert object to "datetime.datetime" object representing same instant in time.
1014
+
974
1015
  Args:
975
1016
  utc (bool, optional): Whether to make the "datetime.datetime" object represent time in the local timezone or "UTC". Default is True
976
1017
 
@@ -2235,7 +2276,7 @@ class propresult:
2235
2276
 
2236
2277
  Notes:
2237
2278
 
2238
- * If "enable_interp" is set to True in the propagation settings, the propresult object can be used to interpolate solutions at any time between the start and stop times of the propagation via the "interp" method
2279
+ * If "enable_interp" is set to True in the propagation settings, the propresult object can be used to interpolate solutions at any time between the begin and end times of the propagation via the "interp" method
2239
2280
 
2240
2281
  """
2241
2282
 
@@ -2276,10 +2317,10 @@ class propresult:
2276
2317
  """
2277
2318
 
2278
2319
  @property
2279
- def state_start(self) -> npt.NDArray[np.float64]:
2280
- """6-element state (pos + vel) of satellite in meters & meters/second at start of propagation
2320
+ def state_begin(self) -> npt.NDArray[np.float64]:
2321
+ """6-element state (pos + vel) of satellite in meters & meters/second at begin of propagation
2281
2322
  Returns:
2282
- npt.NDArray[np.float64]: 6-element numpy array representing state of satellite in meters & meters/second at start of propagation
2323
+ npt.NDArray[np.float64]: 6-element numpy array representing state of satellite in meters & meters/second at begin of propagation
2283
2324
  """
2284
2325
 
2285
2326
  @property
@@ -2302,12 +2343,12 @@ class propresult:
2302
2343
  """
2303
2344
 
2304
2345
  @property
2305
- def time_start(self) -> time:
2306
- """Time at which state_start is valid
2346
+ def time_begin(self) -> time:
2347
+ """Time at which state_begin is valid
2307
2348
 
2308
2349
 
2309
2350
  Returns:
2310
- satkit.time: Time at which state_start is valid
2351
+ satkit.time: Time at which state_begin is valid
2311
2352
  """
2312
2353
 
2313
2354
  @property
@@ -2398,7 +2439,7 @@ class propsettings:
2398
2439
  * use_jplephem: True
2399
2440
  * enable_interp: True
2400
2441
 
2401
- * enable_interp enables high-preciion interpolation of state between start and stop times via the returned function,
2442
+ * enable_interp enables high-preciion interpolation of state between begin and end times via the returned function,
2402
2443
  it is enabled by default. There is a small increase in computational efficiency if set to false
2403
2444
 
2404
2445
  """
@@ -2412,7 +2453,7 @@ class propsettings:
2412
2453
  gravity_order (int, optional keyword): Earth gravity order to use in ODE integration. Default is 4
2413
2454
  use_spaceweather (bool, optional keyword): Use space weather data when computing atmospheric density for drag forces. Default is True
2414
2455
  use_jplephem (bool, optional keyword): Use JPL ephemeris for solar system bodies. Default is True
2415
- enable_interp (bool, optional keyword): Store intermediate data that allows for fast high-precision interpolation of state between start and stop times. Default is True
2456
+ enable_interp (bool, optional keyword): Store intermediate data that allows for fast high-precision interpolation of state between begin and end times. Default is True
2416
2457
 
2417
2458
 
2418
2459
  Returns:
@@ -2471,30 +2512,30 @@ class propsettings:
2471
2512
  def use_spaceweather(self, value: bool) -> None: ...
2472
2513
  @property
2473
2514
  def enable_interp(self) -> bool:
2474
- """Store intermediate data that allows for fast high-precision interpolation of state between start and stop times
2515
+ """Store intermediate data that allows for fast high-precision interpolation of state between begin and end times
2475
2516
  If not needed, there is a small computational advantage if set to False
2476
2517
  """
2477
2518
 
2478
2519
  @enable_interp.setter
2479
2520
  def enable_interp(self, value: bool) -> None: ...
2480
2521
  def precompute_terms(
2481
- self, start: time, stop: time, step: Optional[duration] = None
2522
+ self, begin: time, end: time, step: Optional[duration] = None
2482
2523
  ):
2483
- """Precompute terms for fast interpolation of state between start and stop times
2524
+ """Precompute terms for fast interpolation of state between begin and end times
2484
2525
 
2485
2526
  This can be used, for example, to compute sun and moon positions only once if propagating many satellites over the same time period
2486
2527
 
2487
2528
  Args:
2488
- start (satkit.time): Start time of propagation
2489
- stop (satkit.time): Stop time of propagation
2529
+ begin (satkit.time): Begin time of propagation
2530
+ end (satkit.time): End time of propagation
2490
2531
  step (satkit.duration, optional): Step size for interpolation. Default = 60 seconds
2491
2532
 
2492
2533
  """
2493
2534
 
2494
2535
  def propagate(
2495
2536
  state: npt.NDArray[np.float64],
2496
- start: time,
2497
- stop: time,
2537
+ begin: time,
2538
+ end: time,
2498
2539
  **kwargs,
2499
2540
  ) -> propresult:
2500
2541
  """High-precision orbit propagator
@@ -2503,12 +2544,12 @@ def propagate(
2503
2544
 
2504
2545
  Args:
2505
2546
  state (npt.ArrayLike[float], optional): 6-element numpy array representing satellite GCRF position and velocity in meters and meters/second
2506
- start (satkit.time, optional): satkit.time object representing instant at which satellite is at "pos" & "vel"
2507
- stop (satkit.time, optional keyword): satkit.time object representing instant at which new position and velocity will be computed
2508
- duration (satkit.duration, optional keyword): duration from "start" at which new position & velocity will be computed.
2509
- duration_secs (float, optional keyword): duration in seconds from "start" for at which new position and velocity will be computed.
2510
- duration_days (float, optional keyword): duration in days from "start" at which new position and velocity will be computed.
2511
- output_phi (bool, optional keyword): Output 6x6 state transition matrix between "starttime" and "stoptime" (and at intervals, if specified)
2547
+ begin (satkit.time, optional): satkit.time object representing instant at which satellite is at "pos" & "vel"
2548
+ end (satkit.time, optional keyword): satkit.time object representing instant at which new position and velocity will be computed
2549
+ duration (satkit.duration, optional keyword): duration from "begin" at which new position & velocity will be computed.
2550
+ duration_secs (float, optional keyword): duration in seconds from "begin" for at which new position and velocity will be computed.
2551
+ duration_days (float, optional keyword): duration in days from "begin" at which new position and velocity will be computed.
2552
+ output_phi (bool, optional keyword): Output 6x6 state transition matrix between "begintime" and "endtime" (and at intervals, if specified)
2512
2553
  propsettings (propsettings, optional keyword): "propsettings" object with input settings for the propagation. if left out, default will be used.
2513
2554
  satproperties (satproperties_static, optional keyword): "sat_properties_static" object with drag and radiation pressure succeptibility of satellite.
2514
2555
 
@@ -2524,7 +2565,7 @@ def propagate(
2524
2565
  * Sun, Moon gravity
2525
2566
  * Radiation pressured
2526
2567
  * Atmospheric drag: NRL-MISE 2000 density model, with option to include space weather effects (which can be large)
2527
- * Stop time must be set by keyword argument, either explicitely or by duration
2568
+ * End time must be set by keyword argument, either explicitely or by duration
2528
2569
  * Solid Earth tides are not (yet) included in the model
2529
2570
 
2530
2571
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.8.5
3
+ Version: 0.9.0
4
4
  Summary: Satellite Orbital Dynamics Toolkit
5
5
  Author-email: Steven Michael <ssmichael@gmail.com>
6
6
  Maintainer-email: Steven Michael <ssmichael@gmail.com>
@@ -40,6 +40,9 @@ Description-Content-Type: text/markdown
40
40
  License-File: LICENSE
41
41
  Requires-Dist: numpy>=1.0.0
42
42
  Requires-Dist: satkit-data>=0.7.0
43
+ Provides-Extra: test
44
+ Requires-Dist: pytest; extra == "test"
45
+ Requires-Dist: xmltodict; extra == "test"
43
46
  Dynamic: license-file
44
47
 
45
48
  # Satellite Toolkit (satkit)
@@ -48,7 +51,7 @@ Dynamic: license-file
48
51
 
49
52
  Satkit provides robust, high-performance satellite orbital mechanics calculations with a clean, intuitive API. Built from the ground up in Rust for maximum performance and memory safety, it offers complete Python bindings for all functionality, making advanced orbital mechanics accessible to both systems programmers and data scientists.
50
53
 
51
- -----
54
+ -----
52
55
 
53
56
  ![Build Passing?](https://github.com/ssmichael1/satkit/actions/workflows/build.yml/badge.svg)
54
57
  ![Wheel Passing?](https://github.com/ssmichael1/satkit/actions/workflows/wheels.yml/badge.svg)
@@ -62,7 +65,7 @@ Satkit provides robust, high-performance satellite orbital mechanics calculation
62
65
  ![PyPI - Status](https://img.shields.io/pypi/status/satkit)
63
66
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/satkit)
64
67
  ![Read the Docs](https://img.shields.io/readthedocs/satellite-toolkit)
65
-
68
+
66
69
  ------
67
70
 
68
71
  ## Language Bindings
@@ -84,7 +87,7 @@ High-precision conversions between multiple reference frames with full support f
84
87
  - **CIRF** - Celestial Intermediate Reference Frame (IAU-2006 intermediate)
85
88
  - **TIRF** - Terrestrial Intermediate Reference Frame (Earth-rotation intermediate)
86
89
  - **Geodetic** - Latitude, longitude, altitude with WGS-84 ellipsoid
87
-
90
+
88
91
  ### Orbit Propagation
89
92
  Multiple propagation methods optimized for different accuracy and performance requirements:
90
93
  - **Numerical Integration**: High-precision propagation using adaptive Runge-Kutta 9(8) methods with dense output
@@ -95,27 +98,29 @@ Multiple propagation methods optimized for different accuracy and performance re
95
98
  - Full AFSPC and improved mode support
96
99
  - TLE fitting from high-precision states with drag estimation
97
100
  - Batch processing for multiple satellites
101
+ - Support TLE and Orbital Mean-Element Messages
98
102
  - **Keplerian**: Fast analytical two-body propagation for preliminary analysis
99
-
100
- ### Force Models
103
+
104
+ ### Numerical Integration Force Models
101
105
  Comprehensive perturbation modeling for high-fidelity orbit propagation:
102
106
  - **Earth Gravity**: Spherical harmonic models up to degree/order 360
103
107
  - Multiple models: JGM2, JGM3, EGM96, ITU GRACE16
104
108
  - Efficient computation with configurable truncation order
105
109
  - Gravity gradient support for state transition matrix
106
110
  - **Third-Body Gravity**: Solar and lunar perturbations using JPL ephemerides
107
- - **Atmospheric Drag**: NRLMSISE-00 density model with space weather integration
111
+ - **Atmospheric Drag**:
112
+ - NRLMSISE-00 density model with space weather integration
108
113
  - Automatic space weather data updates (F10.7, Ap index)
109
114
  - Configurable ballistic coefficients
110
115
  - **Solar Radiation Pressure**: Cannon-ball model with shadow function
111
-
112
- ### Ephemerides
116
+
117
+ ### Solar System Ephemerides
113
118
  Access to high-precision solar system body positions:
114
119
  - **JPL DE440/DE441**: State-of-the-art planetary ephemerides
115
120
  - Chebyshev polynomial interpolation for accuracy
116
121
  - Support for all major planets, sun, moon, and solar system barycenter
117
122
  - **Low-Precision Models**: Fast analytical models for sun and moon when high precision isn't required
118
-
123
+
119
124
  ### Time Systems
120
125
  Comprehensive support for all standard astronomical time scales:
121
126
  - **UTC** - Coordinated Universal Time with leap second handling
@@ -125,7 +130,7 @@ Comprehensive support for all standard astronomical time scales:
125
130
  - **UT1** - Universal Time with Earth orientation corrections
126
131
  - **GPS** - GPS Time
127
132
  - Automatic conversion between all time scales with microsecond precision
128
-
133
+
129
134
  ### Geodetic Utilities
130
135
  - **Geodesic Calculations**: Accurate distance and azimuth between ground locations using Vincenty's formulae
131
136
  - **Coordinate Conversions**: ITRF ↔ Geodetic ↔ East-North-Up ↔ North-East-Down
@@ -178,12 +183,12 @@ The library requires external data files for various calculations. These are aut
178
183
  - DE440/DE441 planetary ephemerides (~100 MB)
179
184
  - Provides positions of sun, moon, planets, and solar system barycenter
180
185
  - Valid for years 1550-2650 CE
181
-
186
+
182
187
  - **Gravity Models** ([ICGEM](http://icgem.gfz-potsdam.de/home))
183
188
  - JGM2, JGM3, EGM96, ITU GRACE16 spherical harmonic coefficients
184
189
  - International Centre for Global Earth Models standardized format
185
190
  - Up to degree/order 360 for high-fidelity propagation
186
-
191
+
187
192
  - **IERS Nutation Tables** ([IERS Conventions](https://www.iers.org/IERS/EN/Publications/TechnicalNotes/tn36.html))
188
193
  - IAU-2006 nutation series coefficients
189
194
  - Required for GCRF ↔ ITRF transformations
@@ -196,7 +201,7 @@ The library requires external data files for various calculations. These are aut
196
201
  - Ap geomagnetic index
197
202
  - Critical for atmospheric density modeling and drag calculations
198
203
  - Updated daily by NOAA Space Weather Prediction Center
199
-
204
+
200
205
  - **Earth Orientation Parameters** ([Celestrak](https://celestrak.org/SpaceData/))
201
206
  - Polar motion (x, y)
202
207
  - UT1-UTC time difference
@@ -218,15 +223,15 @@ The library includes comprehensive test suites ensuring correctness of calculati
218
223
  - **JPL Ephemerides**: Validated against JPL-provided test vectors for Chebyshev polynomial interpolation
219
224
  - Over 10,000 test cases covering all planets and time ranges
220
225
  - Accuracy verified to within JPL's published tolerances (sub-meter precision)
221
-
226
+
222
227
  - **SGP4**: Verified using official test vectors from the original C++ distribution
223
228
  - All test cases from Vallado's SGP4 implementation
224
229
  - Includes edge cases and error conditions
225
-
230
+
226
231
  - **Coordinate Transformations**: Cross-validated against multiple reference implementations
227
232
  - SOFA library comparisons for IAU-2006 transformations
228
233
  - Vallado test cases for GCRF ↔ ITRF conversions
229
-
234
+
230
235
  - **Numerical Propagation**: Validated against high-precision commercial tools
231
236
  - Orbit fits to GPS SP3 ephemerides
232
237
  - Multi-day propagations with sub-meter accuracy
@@ -266,7 +271,7 @@ pip install satkit
266
271
 
267
272
  Pre-built binary wheels are available for:
268
273
  - **Windows**: AMD64
269
- - **macOS**: Intel (x86_64) and Apple Silicon (ARM64)
274
+ - **macOS**: Intel (x86_64) and Apple Silicon (ARM64)
270
275
  - **Linux**: x86_64 and ARM64 (aarch64)
271
276
  - **Python versions**: 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14
272
277
 
@@ -336,9 +341,9 @@ settings.gravity_order = 8
336
341
 
337
342
  # Propagate for 1 day
338
343
  result = sk.propagate(
339
- state0,
340
- time0,
341
- stop=time0 + sk.duration.from_days(1),
344
+ state0,
345
+ time0,
346
+ end=time0 + sk.duration.from_days(1),
342
347
  propsettings=settings
343
348
  )
344
349
 
@@ -375,13 +380,13 @@ use satkit::{Instant, SolarSystem, jplephem};
375
380
  fn main() -> Result<(), Box<dyn std::error::Error>> {
376
381
  // Create time instant
377
382
  let time = Instant::from_datetime(2024, 1, 1, 0, 0, 0.0)?;
378
-
383
+
379
384
  // Get Moon position and velocity in GCRF
380
385
  let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
381
-
386
+
382
387
  println!("Moon position: {:?}", pos);
383
388
  println!("Moon velocity: {:?}", vel);
384
-
389
+
385
390
  Ok(())
386
391
  }
387
392
  ```
@@ -1,18 +1,18 @@
1
1
  satkit/__init__.py,sha256=_N6_4wz07lz7HhjdL-8bUKOlubFC4WJHyTumLoS1ru4,622
2
2
  satkit/__init__.pyi,sha256=zqMluH0ZKLDXQK9Z32yiEf2LncSDE8yiHHj9X0DS6Ww,732
3
- satkit/_version.py,sha256=ajWZoScrojscBOac59VBfHuO-bpIeaQKv8Ww1_E7FwQ,446
3
+ satkit/_version.py,sha256=yPAtgqyyGYDKGGxCwEzymB8ULCvrs8uAfofuy5v01KY,446
4
4
  satkit/density.pyi,sha256=j_25g_QI7LKo0IEq13Y2daSMYnb4pE5ZPHFX6H8gscE,2211
5
5
  satkit/frametransform.pyi,sha256=UeVyVbWJppoPkCNWOvUM-MGs7FShVVP0wWh6LE8BPus,15806
6
6
  satkit/jplephem.pyi,sha256=5W0tK3-kv5Si-aS7cci1QGTtXC5cAeEbUj5mwIu7IU8,3506
7
7
  satkit/moon.pyi,sha256=r151F1_D2J_Zp9YgZfAuuUlqb8OMPUjk610UwhJ0OXs,3510
8
8
  satkit/planets.pyi,sha256=MX_4waUoTVM11ftaIEDg8kmdZDId9nuRWUUiMYP6Zvg,1110
9
9
  satkit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- satkit/satkit.cp312-win_amd64.pyd,sha256=sY3eSTkQjfMYp4AElKL7Al53dyzKkqJn77wIt7s3i70,4598784
11
- satkit/satkit.pyi,sha256=buxuFCGNqliQpN0qOw81DjNr1AneBwCqKxrwLDyr5eM,86450
10
+ satkit/satkit.cp312-win_amd64.pyd,sha256=oU6vGs-Aw8Wsauvr1IBPkyY0rCnk0NJ7_ZXX6Af0D9o,4631552
11
+ satkit/satkit.pyi,sha256=Bb0rhJN9EVbAeVSFO2vBmLcWZUme4CzzItub3_eEjiA,88098
12
12
  satkit/sun.pyi,sha256=Ox7n-JJTNRXFjIR1U0ehbEeecoVss11KFiiKhl28wQs,4217
13
13
  satkit/utils.pyi,sha256=f087jRMh4Y4Lghrn-ncIvt16KCQ4Sto_icicvaXgXk4,3085
14
- satkit-0.8.5.dist-info/licenses/LICENSE,sha256=_G_hwbOSJZqdIWNjgzjFB91eZKvherjtmFfvVvy9wCA,1092
15
- satkit-0.8.5.dist-info/METADATA,sha256=BmZmII3Z0IuRnD_XqXqTHjFOyI5QptE_SDte_Zi8ajg,17409
16
- satkit-0.8.5.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
17
- satkit-0.8.5.dist-info/top_level.txt,sha256=1gsJ2XQ64FuUfw4z-i3CDi4Y4z9qcKNcm8Fy6-8xSVE,7
18
- satkit-0.8.5.dist-info/RECORD,,
14
+ satkit-0.9.0.dist-info/licenses/LICENSE,sha256=_G_hwbOSJZqdIWNjgzjFB91eZKvherjtmFfvVvy9wCA,1092
15
+ satkit-0.9.0.dist-info/METADATA,sha256=WVbRyKx82_Lr9r-WLt7XcT8pJ-RZg7FkkndH7Q_QjHM,17568
16
+ satkit-0.9.0.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
17
+ satkit-0.9.0.dist-info/top_level.txt,sha256=1gsJ2XQ64FuUfw4z-i3CDi4Y4z9qcKNcm8Fy6-8xSVE,7
18
+ satkit-0.9.0.dist-info/RECORD,,
File without changes