simo 2.1.3__py3-none-any.whl → 2.1.5__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.

Potentially problematic release.


This version of simo might be problematic. Click here for more details.

Binary file
simo/core/api_auth.py CHANGED
@@ -41,7 +41,3 @@ class IsAuthenticated(SessionAuthentication):
41
41
 
42
42
  def authenticate_header(self, request):
43
43
  return "None"
44
-
45
-
46
-
47
-
simo/core/tasks.py CHANGED
@@ -9,6 +9,7 @@ import threading
9
9
  import pkg_resources
10
10
  import sys
11
11
  import traceback
12
+ import uuid
12
13
  from django.db.models import Q
13
14
  from django.db import connection, transaction
14
15
  from django.template.loader import render_to_string
@@ -102,9 +103,15 @@ def save_config(data):
102
103
  def sync_with_remote():
103
104
  from simo.users.models import User
104
105
 
106
+ try:
107
+ mac = str(hex(uuid.getnode()))
108
+ except:
109
+ mac = ''
110
+
105
111
  report_data = {
106
112
  'simo_version': pkg_resources.get_distribution('simo').version,
107
113
  'local_http': 'https://%s' % get_self_ip(),
114
+ 'mac': mac,
108
115
  'hub_uid': dynamic_settings['core__hub_uid'],
109
116
  'hub_secret': dynamic_settings['core__hub_secret'],
110
117
  'remote_conn_version': dynamic_settings['core__remote_conn_version'],
@@ -325,16 +332,6 @@ def update():
325
332
  perform_update()
326
333
 
327
334
 
328
- @celery_app.task
329
- def auto_update():
330
- if not dynamic_settings['core__auto_update']:
331
- return
332
- if dynamic_settings['core__latest_version_available'] != \
333
- pkg_resources.get_distribution('simo').version:
334
- return update()
335
-
336
-
337
-
338
335
  @celery_app.task
339
336
  def update_latest_version_available():
340
337
  resp = requests.get("https://pypi.org/pypi/simo/json")
@@ -408,7 +405,6 @@ def setup_periodic_tasks(sender, **kwargs):
408
405
  sender.add_periodic_task(20, sync_with_remote.s())
409
406
  sender.add_periodic_task(60 * 60, clear_history.s())
410
407
  sender.add_periodic_task(60 * 60, update_latest_version_available.s())
411
- sender.add_periodic_task(60 * 60, auto_update.s())
412
408
  sender.add_periodic_task(60, drop_fingerprints_learn.s())
413
409
  sender.add_periodic_task(60 * 60 * 24, restart_postgresql.s())
414
410
  sender.add_periodic_task(60 * 60, low_battery_notifications.s())
Binary file
simo/fleet/forms.py CHANGED
@@ -146,7 +146,7 @@ class ColonelComponentForm(BaseComponentForm):
146
146
  continue
147
147
  if pin_instances[i].colonel != self.cleaned_data['colonel']:
148
148
  formset_errors[i] = {
149
- 'pin': f"{pin_instances[i]} must be from the same Colonel!"
149
+ 'input': f"{pin_instances[i]} must be from the same Colonel!"
150
150
  }
151
151
  elif pin_instances[i].occupied_by \
152
152
  and pin_instances[i].occupied_by != self.instance:
@@ -51,7 +51,7 @@ def copy_template(to_directory='/etc/SIMO'):
51
51
  'base_dir': to_directory
52
52
  }, autoescape=False)
53
53
  template_dir = os.path.join(
54
- os.path.dirname(simo.__file__), '_hub_template'
54
+ os.path.dirname(simo.__file__), 'management', '_hub_template'
55
55
  )
56
56
  prefix_length = len(template_dir) + 1
57
57
  for root, dirs, files in os.walk(template_dir):
@@ -82,10 +82,19 @@ def copy_template(to_directory='/etc/SIMO'):
82
82
  else:
83
83
  os.makedirs(os.path.join(root, dirname), exist_ok=True)
84
84
 
85
+ manage_py_path = os.path.join(to_directory, 'hub', 'manage.py')
86
+ st = os.stat(manage_py_path)
87
+ os.chmod(manage_py_path, st.st_mode | 0o111)
88
+
85
89
 
86
90
  def install():
91
+ # this must be performed on a host machine before simo could be installed.
92
+ #
93
+ # apt install python3-pip libpq-dev python3-dev -y
94
+
87
95
  simo_directory = '/etc/SIMO'
88
96
  installed_flag_file_path = os.path.join(simo_directory, 'is_installed.json')
97
+ HUB_DIR = os.path.join(simo_directory, 'hub')
89
98
 
90
99
  if os.path.exists(installed_flag_file_path):
91
100
  print("SIMO.io hub is already installed. ")
@@ -115,33 +124,62 @@ def install():
115
124
  step += 1
116
125
  print(f"{step}.___________Copy default template__________________")
117
126
 
118
- if os.path.exists(simo_directory):
119
- print("Already exists!")
120
- else:
121
- try:
122
- copy_template(simo_directory)
123
- except Exception as e:
124
- print(traceback.format_exc(), file=sys.stderr)
125
- shutil.rmtree(simo_directory, ignore_errors=True)
126
- return
127
+ shutil.rmtree(simo_directory, ignore_errors=True)
128
+ try:
129
+ copy_template(simo_directory)
130
+ except Exception as e:
131
+ print(traceback.format_exc(), file=sys.stderr)
132
+ shutil.rmtree(simo_directory, ignore_errors=True)
133
+ return
134
+
135
+ step += 1
136
+ print(f"{step}.___________Create database__________________")
137
+ subprocess.call(
138
+ 'sudo -u postgres createuser -s -i -d -r -l -w root',
139
+ shell=True
140
+ )
141
+ subprocess.call('createdb SIMO', shell=True)
142
+
143
+ step += 1
144
+ print(f"{step}.___________Apply migrations__________________")
145
+
146
+ proc = subprocess.Popen(
147
+ [os.path.join(HUB_DIR, 'manage.py'), 'migrate'],
148
+ cwd=HUB_DIR,
149
+ stderr=subprocess.PIPE
150
+ )
151
+ out, err = proc.communicate()
152
+ if proc.returncode:
153
+ raise Exception(err.decode())
154
+
155
+ step += 1
156
+ print(f"{step}.___________Collect statics__________________")
157
+ proc = subprocess.Popen(
158
+ [os.path.join(HUB_DIR, 'manage.py'), 'collectstatic',
159
+ '--noinput'],
160
+ cwd=HUB_DIR, stderr=subprocess.PIPE
161
+ )
162
+ out, err = proc.communicate()
163
+ if proc.returncode:
164
+ raise Exception(err.decode())
127
165
 
128
166
  step += 1
129
167
  print(f"{step}.___________Configure supervisor__________________")
130
168
 
131
169
  try:
132
- os.remove('/etc/supervisor/conf.d/SIMO.conf', ignore_errors=True)
170
+ os.remove('/etc/supervisor/conf.d/SIMO.conf')
133
171
  except:
134
172
  pass
135
173
  os.symlink(
136
174
  f'{simo_directory}/hub/supervisor.conf',
137
175
  '/etc/supervisor/conf.d/SIMO.conf'
138
176
  )
177
+ os.makedirs('/var/log/simo')
139
178
  status = subprocess.call(['supervisorctl', 'update', 'all'])
140
179
  if status != 0:
141
180
  sys.exit("INSTALLATION FAILED! Unable to start supervisord")
142
181
 
143
182
 
144
-
145
183
  step += 1
146
184
  print("%d._____________ Configure NGINX _________________________" % step)
147
185
 
@@ -184,10 +222,10 @@ def install():
184
222
  with open('/etc/ssh/sshd_config', 'r') as ssh_conf:
185
223
  line = ssh_conf.readline()
186
224
  while line:
187
- if 'PasswordAuthentication' in line:
188
- new_ssh_conf += 'PasswordAuthentication no'
189
- else:
190
- new_ssh_conf += line
225
+ if line.startswitn('PasswordAuthentication'):
226
+ line.replace(' yes', ' no')
227
+ new_ssh_conf += line
228
+
191
229
  line = ssh_conf.readline()
192
230
  with open('/etc/ssh/sshd_config', 'w') as ssh_conf:
193
231
  ssh_conf.write(new_ssh_conf)
@@ -234,17 +272,22 @@ def install():
234
272
  timeshift_conf['schedule_monthly'] = "true"
235
273
  timeshift_conf['schedule_weekly'] = "true"
236
274
  timeshift_conf['schedule_daily'] = "true"
275
+ timeshift_conf['exclude'] = []
237
276
 
238
- # Must be copied to /etc/timeshift.json to work
239
- with open('/etc/timeshift.json', 'w') as conf_f:
277
+ # Must be copied to /etc/timeshift/timeshift.json to work
278
+ with open('/etc/timeshift/timeshift.json', 'w') as conf_f:
240
279
  conf_f.write(json.dumps(timeshift_conf))
241
280
 
242
- status = subprocess.call([
243
- '/usr/bin/timeshift', '--create',
244
- '--comments', '"Initial backup"', '--tags', 'M'
245
- ])
246
- if status != 0:
247
- print("Unable to start TimeShift")
281
+ # status = subprocess.call([
282
+ # '/usr/bin/timeshift', '--create',
283
+ # '--comments', '"Initial backup"', '--tags', 'M'
284
+ # ])
285
+ # if status != 0:
286
+ # print("Unable to start TimeShift")
287
+
288
+
289
+ step += 1
290
+ print("%d.__________ PUT UP INSTALL COMPLETE FLAG! _____________________" % step)
248
291
 
249
292
  with open(installed_flag_file_path, 'w') as f:
250
293
  f.write(json.dumps(True))
@@ -255,4 +298,4 @@ def install():
255
298
 
256
299
 
257
300
  if __name__ == "__main__":
258
- sys.exit(init())
301
+ sys.exit(install())
@@ -68,6 +68,11 @@ def update_auto_update():
68
68
  executable_path = '/usr/local/bin/simo-auto-update'
69
69
  if os.geteuid() == 0:
70
70
  # We are running as root!
71
+ if os.path.exists(executable_path):
72
+ # refresh the link if it already exists
73
+ os.remove(executable_path)
74
+ os.symlink(auto_update_file_path, executable_path)
75
+
71
76
  if not os.path.islink(executable_path):
72
77
  # There is no symbolic link yet made for auto updates.
73
78
  # Let's make it!
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.1.3
3
+ Version: 2.1.5
4
4
  Summary: Smart Home on Steroids!
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -15,7 +15,7 @@ simo/__pycache__/wsgi.cpython-38.pyc,sha256=TpRxO7VM_ql31hbKphVdanydC5RI1nHB4l0Q
15
15
  simo/core/__init__.py,sha256=_s2TjJfQImsMrTIxqLAx9AZie1Ojmm6sCHASdl3WLGU,50
16
16
  simo/core/admin.py,sha256=Gb1lSyvFtYj2oC5lA7j3VqU6zlqlncx5R-_XJbb8Wdk,17927
17
17
  simo/core/api.py,sha256=HSokv9CZCCr0WHSzo5TBXe2BF5-EnTZHPnShlzN86ms,25706
18
- simo/core/api_auth.py,sha256=_3hG4e1eLKrcRnSAOB_xTL6cwtOJ2_7JS7GZU_iqTgA,1251
18
+ simo/core/api_auth.py,sha256=vCxvczA8aWNcW0VyKs5WlC_ytlqeGP_H_hkKUNVkCwM,1247
19
19
  simo/core/api_meta.py,sha256=0leq4qdAELwACL7-9V_LCkuzu1VSEexys1b3iz0bsYM,3848
20
20
  simo/core/app_widgets.py,sha256=4Lh9FDzdkfh_mccJMe09dyRTT3Uqf9VXwbkurJ9E9oQ,2115
21
21
  simo/core/apps.py,sha256=CL4-BX6lYYGwq6hcXL-ozT7RTvy9hyfuiPCC_RfGIY0,267
@@ -40,7 +40,7 @@ simo/core/serializers.py,sha256=M3r2P1-Eb5eObOqcI9dttedh4UxgPwWwGYmOfXe3BDk,2030
40
40
  simo/core/signal_receivers.py,sha256=ZhHg1mLn_Yhin-23Af1WNPfE5hnGYhhVDZDTEjRtO-A,6190
41
41
  simo/core/socket_consumers.py,sha256=n7VE2Fvqt4iEAYLTRbTPOcI-7tszMAADu7gimBxB-Fg,9635
42
42
  simo/core/storage.py,sha256=YlxmdRs-zhShWtFKgpJ0qp2NDBuIkJGYC1OJzqkbttQ,572
43
- simo/core/tasks.py,sha256=JARqqpVCJbqLtzuae3D8aC3OAWI9wLyp-bs-pyvpHNs,14197
43
+ simo/core/tasks.py,sha256=VTr83_8avke6UwFZ9VQ8c2qROpVOqAWqc0RbMxNPd08,14005
44
44
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
45
45
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
46
46
  simo/core/views.py,sha256=ze8yX0PBLN-DH8B8jol6NKj0hLOAE4WA1rTXf07G-MU,2129
@@ -48,7 +48,7 @@ simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
48
48
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=ZJFM_XN0RmJMULQulgA_wFiOnEtsMoedcOWnXjH-Y8o,208
49
49
  simo/core/__pycache__/admin.cpython-38.pyc,sha256=Lqs-wHz-vxGEo7ApOk6nkpNwfxselcFHqAUozotdZU4,13231
50
50
  simo/core/__pycache__/api.cpython-38.pyc,sha256=hoCs0HvJFULzhDG4mwhTMMJt3hSDnMXJU_05FPK6dB4,20516
51
- simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=5UTBr3rDMERAfc0OuOVDwGeQkt6Q7GLBtZJAMBse1sg,1712
51
+ simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=6M9Cl_ha4y_Vf8Rv4GMYL8dcBCmp0KzYi6jn3SQTgys,1712
52
52
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=Y59fGaKkyo_DJhhcDeRUUguy2OUb6f7_F6RbQRRp0vY,3023
53
53
  simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=vUCEAYqppjgRZYMs6pTuSxWWuZxreLygPuPBGw044dQ,3643
54
54
  simo/core/__pycache__/apps.cpython-38.pyc,sha256=S12d7zdc2m_93FeQ4gE6I3l_lh3GAe2Icf1Ra869Kzs,633
@@ -73,7 +73,7 @@ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=ibatzlaahJ0keKpml7JWuPsr
73
73
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=gKwUVUf1vtIo1Ecvm6xGmBSwpEUALHrXai5pkMmjr9I,4895
74
74
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=NJUr7nRyHFvmAumxxWpsod5wzVVZM99rCEuJs1utHA4,8432
75
75
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=BTkYH8QQyjqI0WOtJC8fHNtgu0YA1vjqZclXjC2vCVI,1116
76
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=0jQFCRLPzu_h3blUR0nlvwm-gBK9diTkxyXzyfKbhO4,10038
76
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=maImi7pqoVNvKNESi4xY_WdTOJdjDgP11knfXKKuVcI,9902
77
77
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
78
78
  simo/core/__pycache__/views.cpython-38.pyc,sha256=ULyoiWRiU_auXTuxzi2RyqYIea9VfaiMuTzkMAWaWOA,2343
79
79
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -10186,7 +10186,7 @@ simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
10186
10186
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10187
10187
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10188
10188
  simo/fleet/controllers.py,sha256=ounEUw51X6EYA8xDcGNIik1bDbw4JR3DOGr1FKo4hHs,28829
10189
- simo/fleet/forms.py,sha256=fdq30tA4mx-34eLQnHV1O0XFe3offN-BKcXmltww01k,54423
10189
+ simo/fleet/forms.py,sha256=CbrLN_gMCTo8u6fg0ovztkhdYEjHZmSr_3gzsDRMP84,54425
10190
10190
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10191
10191
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10192
10192
  simo/fleet/models.py,sha256=U4q813VZmYUpgu7Iw4-z80LfHlkZziIqBKqkQzBA9WI,16304
@@ -10203,7 +10203,7 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwn
10203
10203
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10204
10204
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10205
10205
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=61dvQDl2nIuB4iaCzdBMwQnly_m0OvI7zteRS6sIm5U,23831
10206
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=iC11rfQVEUhjqxIewYX5CoR4cqBXyNzbcmgzRk-TiKc,37436
10206
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=7B6NZnY6yS8qrmv5zlTa07iUYmdv4nW7PTpOVfRn3OY,37436
10207
10207
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10208
10208
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10209
10209
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=yudhmE7zhXN5t3b63N6TwAtBLC4OXiAZiNBzki3SuHI,13664
@@ -10337,10 +10337,10 @@ simo/generic/templates/generic/controllers_info/stateselect.md,sha256=T0w3vJg02W
10337
10337
  simo/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10338
10338
  simo/management/auto_update.py,sha256=4MDrJHdtC5LxEJM258Y0kc5yI4yloeKhDjh-S2BN-ZQ,2115
10339
10339
  simo/management/copy_template.py,sha256=Iehq57FYMzdHNp3LU4ue6rr6AkRiGeOthG7PoGWd88Q,2002
10340
- simo/management/install.py,sha256=n6lSMYuXXrkpBlikTqVgH9pH7sv-WHlcqsZxS2FY1O4,8761
10341
- simo/management/on_http_start.py,sha256=YUG4sspyUMRbMyyF3oYJrK6A-vOC1xxkeq10RhZwczE,3113
10340
+ simo/management/install.py,sha256=s9GqIRwLpli8g_utu2pZ0QGVSXSHFXbkY12S_R3MnVc,10127
10341
+ simo/management/on_http_start.py,sha256=ZDotfMQaCjksD5FFf3eZYgJS-gd_-7eZhYTHLaD-448,3312
10342
10342
  simo/management/__pycache__/__init__.cpython-38.pyc,sha256=ey9k5mPsmvAHRVf5Du6QUqy40LgBCAPN_B5EaR6h9Eg,164
10343
- simo/management/__pycache__/on_http_start.cpython-38.pyc,sha256=I3IXOxj87WQC6MsLLEOmM4E_Z1sr5oXE77HyZquar2M,2811
10343
+ simo/management/__pycache__/on_http_start.cpython-38.pyc,sha256=ERfcMNz3QnqDJTJ4PwbmDfLgPCh5hrEcaedejARFkUQ,2864
10344
10344
  simo/management/_hub_template/hub/asgi.py,sha256=ElN_fdeSkf0Ysa7pS9rJVmZ1HmLhFxb8jFaMLqe1220,126
10345
10345
  simo/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZdQlDEnjTQXycweRFmsSQ,27
10346
10346
  simo/management/_hub_template/hub/manage.py,sha256=PNNlw3EVeIJDgkG0l-klqoxsKWfTYWG9jzRG0upmAaI,620
@@ -10494,9 +10494,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10494
10494
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10495
10495
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10496
10496
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10497
- simo-2.1.3.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10498
- simo-2.1.3.dist-info/METADATA,sha256=M_CKoVmkUa9FeKxW8ZFLrp6GqZWEo8iN7HPOIvUkGuw,1817
10499
- simo-2.1.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10500
- simo-2.1.3.dist-info/entry_points.txt,sha256=SJBxiDpH7noO0STxVI_eRIsGR-nLgdXXeqCDe8cXlbM,65
10501
- simo-2.1.3.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10502
- simo-2.1.3.dist-info/RECORD,,
10497
+ simo-2.1.5.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10498
+ simo-2.1.5.dist-info/METADATA,sha256=sV13UwrNRCCV4LImcqM__PHth4pKToD1KXgItU6eMoY,1817
10499
+ simo-2.1.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10500
+ simo-2.1.5.dist-info/entry_points.txt,sha256=SJBxiDpH7noO0STxVI_eRIsGR-nLgdXXeqCDe8cXlbM,65
10501
+ simo-2.1.5.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10502
+ simo-2.1.5.dist-info/RECORD,,
File without changes