ptwrapper 2.7.1__tar.gz → 2.7.2__tar.gz
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.
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/PKG-INFO +1 -1
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/pyproject.toml +1 -1
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/subscribers.py +61 -66
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/LICENSE.txt +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/README.md +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/.flake8 +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/__init__.py +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/cli.py +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui.xml +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_event_definitions.xml +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_fixed_definitions.xml +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_predefined_block.xml +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/BRF_MAL_SGICD_2_1_300101_351005.brf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/RES_C50_SA_CELLS_EFFICIENCY_310101_351003.csv +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/eps.cfg +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/events.juice.def +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/phs_com_res_sa_cells_count.asc +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/units.def +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/session_file.json +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/html_log.py +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP__events.evf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_0_events.evf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_1_150lb_23_1_a3_events.evf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_1_150lb_23_1_events.evf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/downlink.evf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/EDF_JUI_SPC_LINK_KAB.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/EDF_JUI_SPC_LINK_XB.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/TBD.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/TOP_experiments.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/juice__spacecraft.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/juice__spacecraft_platform.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/juice__spacecraft_ssmm.edf +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_0_GEOPIPELINE.EVF +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_1_150LB_23_1_A3_GEOPIPELINE.EVF +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_1_150LB_23_1_GEOPIPELINE.EVF +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT__GEOPIPELINE.EVF +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/TBD.itl +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/TOP_timelines.itl +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/downlink.itl +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/platform.itl +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/main.py +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/py.typed +0 -0
- {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/utils.py +0 -0
|
@@ -30,7 +30,9 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
30
30
|
|
|
31
31
|
remove_checks = True
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
# Initialize attributes
|
|
34
|
+
swi_pointing_check = False
|
|
35
|
+
swi_drift_check = False
|
|
34
36
|
swi_block_violation = False
|
|
35
37
|
swi_et_prev = 0.0
|
|
36
38
|
swi_x_t_prev = None
|
|
@@ -50,6 +52,7 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
50
52
|
gala_rate_violation = False
|
|
51
53
|
gala_rate_sun_exclusion_block_violation = False
|
|
52
54
|
|
|
55
|
+
peplo_jna_sun_check = False
|
|
53
56
|
peplo_jna_violation = False
|
|
54
57
|
peplo_jna_start_time = False
|
|
55
58
|
peplo_jna_sun_exclusion_block_violation = False
|
|
@@ -91,10 +94,12 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
91
94
|
return
|
|
92
95
|
|
|
93
96
|
for obs in block_data["observations"]["observations"]:
|
|
94
|
-
if obs.get("instrument") == 'SWI' and obs.get("type") in {'PRIME', 'DESIGNER'}:
|
|
95
|
-
self.
|
|
97
|
+
if (obs.get("unit") == 'SWI' or obs.get("instrument") == 'SWI') and obs.get("type") in {'PRIME', 'DESIGNER'}:
|
|
98
|
+
self.swi_pointing_check = False # this is a temporary solution, to be fixed when SWI pointing check is implemented
|
|
99
|
+
self.swi_drift_check = True
|
|
96
100
|
self._set_swi_target(obs, block_data)
|
|
97
|
-
self.
|
|
101
|
+
self._set_swi_drift_rate(obs, block_data)
|
|
102
|
+
#self._check_swi_block_duration(obs, block_data)
|
|
98
103
|
|
|
99
104
|
def _set_swi_target(self, observation, block_data):
|
|
100
105
|
try:
|
|
@@ -107,6 +112,15 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
107
112
|
warning_msg = f'SWI observation {observation.get("definition", "UNKNOWN")} has no target, setting to JUPITER as default.'
|
|
108
113
|
log('WARNING', 'PTWR', block_data["block_start"], warning_msg)
|
|
109
114
|
self.onMsgReceived('WARNING', 'PTWR', block_data["block_start"], warning_msg)
|
|
115
|
+
|
|
116
|
+
def _set_swi_drift_rate(self, observation, block_data):
|
|
117
|
+
# If SWI observation drift rates could not be set, we should disable SWI drift checks
|
|
118
|
+
# self.swi_drift_check = False -> future
|
|
119
|
+
|
|
120
|
+
# For now, we will set a default value if maxATDriftRate or maxCTDriftRate are not provided
|
|
121
|
+
DRMAX = 6.0e-6 # deg/s
|
|
122
|
+
self.swi_at_drift_rate = float(observation.get("maxATDriftRate", DRMAX))
|
|
123
|
+
self.swi_ct_drift_rate = float(observation.get("maxCTDriftRate", DRMAX))
|
|
110
124
|
|
|
111
125
|
def _check_swi_block_duration(self, observation, block_data):
|
|
112
126
|
violation, message = self._swi_block_duration_check(block_data, observation.get("definition", "UNKNOWN"))
|
|
@@ -119,7 +133,7 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
119
133
|
return
|
|
120
134
|
|
|
121
135
|
for obs in block_data["observations"]["observations"]:
|
|
122
|
-
if obs.get("instrument") == 'PEPHI' and obs.get("type") in {'PRIME', 'DESIGNER'}:
|
|
136
|
+
if (obs.get("unit") == 'PEPHI' or obs.get("instrument") == 'PEPHI') and obs.get("type") in {'PRIME', 'DESIGNER'}:
|
|
123
137
|
self.pephi_jeni_check = True
|
|
124
138
|
self._set_pephi_jeni_target(obs, block_data)
|
|
125
139
|
|
|
@@ -178,14 +192,15 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
178
192
|
self.onMsgReceived('WARNING', 'PTWR', blockdata["block_end"], 'SWI Pointing and/or drift range not recovered.')
|
|
179
193
|
|
|
180
194
|
# Deactivate the SWI checks at the end of the block.
|
|
181
|
-
self.
|
|
195
|
+
self.swi_pointing_check = False
|
|
196
|
+
self.swi_drift_check = False
|
|
182
197
|
self.swi_block_violation = False
|
|
183
198
|
|
|
184
199
|
# --------------------------------------------------------------------------------------------------------------
|
|
185
200
|
# PEPHI JENI Sun and Target Concurrence Check
|
|
186
201
|
# --------------------------------------------------------------------------------------------------------------
|
|
187
202
|
if self.pephi_jeni_block_violation:
|
|
188
|
-
log(self.pephi_jeni_severity, 'PTWR', blockdata["block_end"], f'
|
|
203
|
+
log(self.pephi_jeni_severity, 'PTWR', blockdata["block_end"], f'PEPHI block end and JENI Sun avoidance not recovered')
|
|
189
204
|
self.onMsgReceived(self.pephi_jeni_severity, 'PTWR', blockdata["block_end"],
|
|
190
205
|
f'{self.pephi_jeni_message} End')
|
|
191
206
|
|
|
@@ -258,7 +273,7 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
258
273
|
# ----------------------------------------------------------------------------------------------------------
|
|
259
274
|
# SWI Pointing Compatibility Check
|
|
260
275
|
# ----------------------------------------------------------------------------------------------------------
|
|
261
|
-
if self.
|
|
276
|
+
if self.swi_drift_check or self.swi_pointing_check:
|
|
262
277
|
# We calculate the sc quaternion for the current state and jump to the
|
|
263
278
|
# next simulation step to calculate the drift.
|
|
264
279
|
x_t, y_t, dx_dt, dy_dt = self._swi_pointing_drift(data)
|
|
@@ -310,7 +325,7 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
310
325
|
# ----------------------------------------------------------------------------------------------------------
|
|
311
326
|
# PEPLO JNA Sun Exclusion Check
|
|
312
327
|
# ----------------------------------------------------------------------------------------------------------
|
|
313
|
-
if self._sun_distance_threshold(data["time"], 2.0):
|
|
328
|
+
if self._sun_distance_threshold(data["time"], 2.0) and self.peplo_jna_sun_check:
|
|
314
329
|
|
|
315
330
|
violation = self._peplo_jna_sun_exclusion_check(data)
|
|
316
331
|
if violation:
|
|
@@ -694,22 +709,26 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
694
709
|
at0 = 0.324
|
|
695
710
|
ct0 = 0.188
|
|
696
711
|
drmax = 6.0e-6
|
|
712
|
+
drmax_at = self.swi_at_drift_rate # deg/s
|
|
713
|
+
drmax_ct = self.swi_ct_drift_rate # deg/s
|
|
697
714
|
|
|
698
715
|
flags = {'AT': 'OK', 'CT': 'OK', 'ATDRIFT': 'OK', 'CTDRIFT': 'OK'}
|
|
699
716
|
violation = False
|
|
700
717
|
|
|
701
|
-
if
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
718
|
+
if self.swi_pointing_check is True:
|
|
719
|
+
if (np.abs(x) >= (atmax + at0)):
|
|
720
|
+
flags['AT'] = f'SWI Pointing out of AT range: {np.abs(x):.2f} [deg] >= {atmax + at0:.2f} [deg]'
|
|
721
|
+
violation = True
|
|
722
|
+
if (np.abs(y) >= (ctmax + ct0)):
|
|
723
|
+
flags['CT'] = f'SWI Pointing out of CT range: {np.abs(y):.2f} [deg] >= {ctmax + ct0:.2f} [deg]'
|
|
724
|
+
violation = True
|
|
725
|
+
if self.swi_drift_check is True:
|
|
726
|
+
if (np.abs(dx) > drmax_at):
|
|
727
|
+
flags['ATDRIFT'] = f'SWI Drift along AT out of range: {np.abs(dx):.3E} [deg/s] > {drmax_at:.3E} [deg/s]'
|
|
728
|
+
violation = True
|
|
729
|
+
if (np.abs(dy) > drmax_ct):
|
|
730
|
+
flags['CTDRIFT'] = f'SWI Drift along CT out of range: {np.abs(dy):.3E} [deg/s] > {drmax_ct:.3E} [deg/s]'
|
|
731
|
+
violation = True
|
|
713
732
|
|
|
714
733
|
return flags, violation
|
|
715
734
|
|
|
@@ -1046,62 +1065,38 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
1046
1065
|
et = spice.utc2et(data["time"])
|
|
1047
1066
|
targ = self.pephi_jeni_target
|
|
1048
1067
|
|
|
1049
|
-
#
|
|
1068
|
+
# 1) Spacecraft's known quaternion (J2000 -> s/c)
|
|
1050
1069
|
q_t = np.array([data['qs'], data['q1'], data['q2'], data['q3']])
|
|
1051
1070
|
q_t = q_t / np.linalg.norm(q_t) # make sure it's unit
|
|
1052
1071
|
|
|
1053
|
-
#
|
|
1072
|
+
# 2) Position of the target w.r.t. s/c in J2000 at time et
|
|
1054
1073
|
# (state_t = [x, y, z, vx, vy, vz], ignoring velocity index here)
|
|
1055
|
-
state_sun, _ = spice.spkpos('SUN', et,
|
|
1056
|
-
r_j2000_sun
|
|
1074
|
+
state_sun, _ = spice.spkpos('SUN', et, 'J2000', 'NONE', 'JUICE')
|
|
1075
|
+
r_j2000_sun = spice.vhat(state_sun)
|
|
1057
1076
|
|
|
1058
|
-
state_tar, _ = spice.spkpos(targ, et,
|
|
1059
|
-
r_j2000_tar
|
|
1077
|
+
state_tar, _ = spice.spkpos(targ, et, 'J2000', 'NONE', 'JUICE')
|
|
1078
|
+
r_j2000_tar = spice.vhat(state_tar)
|
|
1060
1079
|
|
|
1061
|
-
#
|
|
1062
|
-
|
|
1080
|
+
# 3) Example with Jupiter:
|
|
1081
|
+
# Jupiter is in PY FOV, Sun is in PY FOR: yellow -> WARNING
|
|
1082
|
+
# Jupiter is in MY FOV, Sun is in MY FOR: yellow -> WARNING
|
|
1083
|
+
sun_in_fov_p = spice.fovray('JUICE_PEP_JENI_FOR_PY', r_j2000_sun, 'J2000', 'NONE', 'JUICE', et)
|
|
1084
|
+
sun_in_fov_m = spice.fovray('JUICE_PEP_JENI_FOR_MY', r_j2000_sun, 'J2000', 'NONE', 'JUICE', et)
|
|
1085
|
+
tar_in_fov_m = spice.fovray('JUICE_PEP_JENI_E_SLIT_MY', r_j2000_tar, 'J2000', 'NONE', 'JUICE', et)
|
|
1086
|
+
tar_in_fov_p = spice.fovray('JUICE_PEP_JENI_E_SLIT_PY', r_j2000_tar, 'J2000', 'NONE', 'JUICE', et)
|
|
1063
1087
|
|
|
1064
|
-
|
|
1065
|
-
rb_sun = spice.mxv(r_j2000_to_sc, r_j2000_sun)
|
|
1066
|
-
rb_tar = spice.mxv(r_j2000_to_sc, r_j2000_tar)
|
|
1067
|
-
|
|
1068
|
-
# Example wit Jupiter:
|
|
1069
|
-
# Jupiter is in PY FOV, Sun is completely outside JENI’s FOV (PY or MY): green -> INFO
|
|
1070
|
-
# Jupiter is in PY FOV, Sun is in MY FOV: yellow -> WARNING
|
|
1071
|
-
# Jupiter and Sun are in PY FOV: red -> ERROR
|
|
1072
|
-
sun_in_fov_p = spice.fovray('JUICE_PEP_JENI_FOR_PY', rb_sun, 'JUICE_SPACECRAFT', 'NONE', 'SUN', et)
|
|
1073
|
-
sun_in_fov_m = spice.fovray('JUICE_PEP_JENI_FOR_MY', rb_sun, 'JUICE_SPACECRAFT', 'NONE', 'SUN', et)
|
|
1074
|
-
tar_in_fov_m = spice.fovray('JUICE_PEP_JENI_FOR_MY', rb_tar, 'JUICE_SPACECRAFT', 'NONE', targ, et)
|
|
1075
|
-
tar_in_fov_p = spice.fovray('JUICE_PEP_JENI_FOR_PY', rb_tar, 'JUICE_SPACECRAFT', 'NONE', targ, et)
|
|
1076
|
-
|
|
1077
|
-
if tar_in_fov_p and (not sun_in_fov_p and not sun_in_fov_m):
|
|
1088
|
+
if tar_in_fov_m and sun_in_fov_m:
|
|
1078
1089
|
violation = True
|
|
1079
|
-
severity
|
|
1080
|
-
message
|
|
1081
|
-
elif tar_in_fov_m and (not sun_in_fov_p and not sun_in_fov_m):
|
|
1082
|
-
violation = True
|
|
1083
|
-
severity = 'INFO'
|
|
1084
|
-
message = f'PEPHI JENI with {targ.capitalize()} in the MY FOR and Sun outside FOR'
|
|
1085
|
-
elif tar_in_fov_m and sun_in_fov_p:
|
|
1086
|
-
violation = True
|
|
1087
|
-
severity = 'WARNING'
|
|
1088
|
-
message = f'PEPHI JENI with {targ.capitalize()} in the MY FOR and Sun in the PY FOR'
|
|
1089
|
-
elif tar_in_fov_p and sun_in_fov_m:
|
|
1090
|
-
violation = True
|
|
1091
|
-
severity = 'WARNING'
|
|
1092
|
-
message = f'PEPHI JENI with {targ.capitalize()} in the PY FOR and Sun in the MY FOR'
|
|
1090
|
+
severity = 'WARNING'
|
|
1091
|
+
message = f'PEPHI JENI with {targ.capitalize()} in the MY E_SLIT FoV and Sun in the MY FoR'
|
|
1093
1092
|
elif tar_in_fov_p and sun_in_fov_p:
|
|
1094
1093
|
violation = True
|
|
1095
|
-
severity
|
|
1096
|
-
message
|
|
1097
|
-
elif tar_in_fov_m and sun_in_fov_m:
|
|
1098
|
-
violation = True
|
|
1099
|
-
severity = 'ERROR'
|
|
1100
|
-
message = f'PEPHI JENI with {targ.capitalize()} and Sun in the MY FOR'
|
|
1094
|
+
severity = 'WARNING'
|
|
1095
|
+
message = f'PEPHI JENI with {targ.capitalize()} in the PY E_SLIT FoV and Sun in the PY FoR'
|
|
1101
1096
|
else:
|
|
1102
1097
|
violation = False
|
|
1103
|
-
message
|
|
1104
|
-
severity
|
|
1098
|
+
message = False
|
|
1099
|
+
severity = False
|
|
1105
1100
|
|
|
1106
1101
|
return message, severity, violation
|
|
1107
1102
|
|
|
@@ -1122,7 +1117,7 @@ class OsvePtrLogger(OsvePtrAbstract):
|
|
|
1122
1117
|
def _report_pephi_jeni_recovery(self, time):
|
|
1123
1118
|
|
|
1124
1119
|
severity = 'INFO'
|
|
1125
|
-
message
|
|
1120
|
+
message = 'PEPHI JENI Sun avoidance recovered'
|
|
1126
1121
|
|
|
1127
1122
|
log(severity, 'PTWR', f'{time}Z', message)
|
|
1128
1123
|
self.onMsgReceived(severity, 'PTWR', f'{time}Z', message)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_event_definitions.xml
RENAMED
|
File without changes
|
{ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_fixed_definitions.xml
RENAMED
|
File without changes
|
{ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_predefined_block.xml
RENAMED
|
File without changes
|
{ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/BRF_MAL_SGICD_2_1_300101_351005.brf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_1_150lb_23_1_a3_events.evf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_1_150LB_23_1_GEOPIPELINE.EVF
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|