arthexis 0.1.7__py3-none-any.whl → 0.1.9__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 arthexis might be problematic. Click here for more details.

Files changed (82) hide show
  1. arthexis-0.1.9.dist-info/METADATA +168 -0
  2. arthexis-0.1.9.dist-info/RECORD +92 -0
  3. arthexis-0.1.9.dist-info/licenses/LICENSE +674 -0
  4. config/__init__.py +0 -1
  5. config/auth_app.py +0 -1
  6. config/celery.py +1 -2
  7. config/context_processors.py +1 -1
  8. config/offline.py +2 -0
  9. config/settings.py +134 -16
  10. config/urls.py +71 -3
  11. core/admin.py +1331 -165
  12. core/admin_history.py +50 -0
  13. core/admindocs.py +151 -0
  14. core/apps.py +158 -3
  15. core/backends.py +46 -4
  16. core/entity.py +62 -48
  17. core/fields.py +6 -1
  18. core/github_helper.py +25 -0
  19. core/github_issues.py +172 -0
  20. core/lcd_screen.py +1 -0
  21. core/liveupdate.py +25 -0
  22. core/log_paths.py +100 -0
  23. core/mailer.py +83 -0
  24. core/middleware.py +57 -0
  25. core/models.py +1136 -259
  26. core/notifications.py +11 -1
  27. core/public_wifi.py +227 -0
  28. core/release.py +27 -20
  29. core/sigil_builder.py +131 -0
  30. core/sigil_context.py +20 -0
  31. core/sigil_resolver.py +284 -0
  32. core/system.py +129 -10
  33. core/tasks.py +118 -19
  34. core/test_system_info.py +22 -0
  35. core/tests.py +445 -58
  36. core/tests_liveupdate.py +17 -0
  37. core/urls.py +2 -2
  38. core/user_data.py +329 -167
  39. core/views.py +383 -57
  40. core/widgets.py +51 -0
  41. core/workgroup_urls.py +17 -0
  42. core/workgroup_views.py +94 -0
  43. nodes/actions.py +0 -2
  44. nodes/admin.py +159 -284
  45. nodes/apps.py +9 -15
  46. nodes/backends.py +53 -0
  47. nodes/lcd.py +24 -10
  48. nodes/models.py +375 -178
  49. nodes/tasks.py +1 -5
  50. nodes/tests.py +524 -129
  51. nodes/utils.py +13 -2
  52. nodes/views.py +66 -23
  53. ocpp/admin.py +150 -61
  54. ocpp/apps.py +4 -3
  55. ocpp/consumers.py +432 -69
  56. ocpp/evcs.py +25 -8
  57. ocpp/models.py +408 -68
  58. ocpp/simulator.py +13 -6
  59. ocpp/store.py +258 -30
  60. ocpp/tasks.py +11 -7
  61. ocpp/test_export_import.py +8 -7
  62. ocpp/test_rfid.py +211 -16
  63. ocpp/tests.py +1198 -135
  64. ocpp/transactions_io.py +68 -22
  65. ocpp/urls.py +35 -2
  66. ocpp/views.py +654 -101
  67. pages/admin.py +173 -13
  68. pages/checks.py +0 -1
  69. pages/context_processors.py +19 -6
  70. pages/middleware.py +153 -0
  71. pages/models.py +37 -9
  72. pages/tests.py +759 -40
  73. pages/urls.py +3 -0
  74. pages/utils.py +0 -1
  75. pages/views.py +576 -25
  76. arthexis-0.1.7.dist-info/METADATA +0 -126
  77. arthexis-0.1.7.dist-info/RECORD +0 -77
  78. arthexis-0.1.7.dist-info/licenses/LICENSE +0 -21
  79. config/workgroup_app.py +0 -7
  80. core/checks.py +0 -29
  81. {arthexis-0.1.7.dist-info → arthexis-0.1.9.dist-info}/WHEEL +0 -0
  82. {arthexis-0.1.7.dist-info → arthexis-0.1.9.dist-info}/top_level.txt +0 -0
@@ -1,126 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: arthexis
3
- Version: 0.1.7
4
- Summary: Django-based MESH system
5
- Author-email: "Rafael J. Guillén-Osorio" <tecnologia@gelectriic.com>
6
- License-Expression: MIT
7
- Project-URL: Repository, https://github.com/arthexis/arthexis
8
- Project-URL: Homepage, https://arthexis.com
9
- Classifier: Programming Language :: Python :: 3
10
- Classifier: Framework :: Django
11
- Requires-Python: >=3.10
12
- Description-Content-Type: text/markdown
13
- License-File: LICENSE
14
- Requires-Dist: amqp==5.3.1
15
- Requires-Dist: annotated-types==0.7.0
16
- Requires-Dist: anyio==4.9.0
17
- Requires-Dist: asgiref==3.9.1
18
- Requires-Dist: atproto==0.0.61
19
- Requires-Dist: attrs==25.3.0
20
- Requires-Dist: autobahn==24.4.2
21
- Requires-Dist: Automat==25.4.16
22
- Requires-Dist: billiard==4.2.1
23
- Requires-Dist: bleach==6.2.0
24
- Requires-Dist: celery==5.5.3
25
- Requires-Dist: certifi==2025.7.14
26
- Requires-Dist: cffi==1.17.1
27
- Requires-Dist: channels==4.1.0
28
- Requires-Dist: charset-normalizer==3.4.2
29
- Requires-Dist: click==8.2.1
30
- Requires-Dist: click-didyoumean==0.3.1
31
- Requires-Dist: click-plugins==1.1.1.2
32
- Requires-Dist: click-repl==0.3.0
33
- Requires-Dist: colorama==0.4.6
34
- Requires-Dist: constantly==23.10.4
35
- Requires-Dist: cron-descriptor==1.4.5
36
- Requires-Dist: cryptography==45.0.5
37
- Requires-Dist: daphne==4.2.1
38
- Requires-Dist: diff-match-patch==20241021
39
- Requires-Dist: Django==5.2.4
40
- Requires-Dist: django-celery-beat==2.8.1
41
- Requires-Dist: django-debug-toolbar==6.0.0
42
- Requires-Dist: django-import-export==4.3.9
43
- Requires-Dist: django-object-actions==5.0.0
44
- Requires-Dist: django-post_office==3.10.1
45
- Requires-Dist: django-timezone-field==7.1
46
- Requires-Dist: dnspython==2.7.0
47
- Requires-Dist: docutils==0.22
48
- Requires-Dist: gpiozero==2.0.1; sys_platform == "linux"
49
- Requires-Dist: h11==0.16.0
50
- Requires-Dist: httpcore==1.0.9
51
- Requires-Dist: httpx==0.28.1
52
- Requires-Dist: hyperlink==21.0.0
53
- Requires-Dist: idna==3.10
54
- Requires-Dist: incremental==24.7.2
55
- Requires-Dist: kombu==5.5.4
56
- Requires-Dist: libipld==3.1.1
57
- Requires-Dist: Markdown==3.8.2
58
- Requires-Dist: mfrc522==0.0.7; sys_platform == "linux"
59
- Requires-Dist: outcome==1.3.0.post0
60
- Requires-Dist: packaging==25.0
61
- Requires-Dist: pillow==11.3.0
62
- Requires-Dist: prompt_toolkit==3.0.51
63
- Requires-Dist: psycopg==3.2.9
64
- Requires-Dist: psycopg-binary==3.2.9
65
- Requires-Dist: pyasn1==0.6.1
66
- Requires-Dist: pyasn1_modules==0.4.2
67
- Requires-Dist: pycparser==2.22
68
- Requires-Dist: pydantic==2.11.7
69
- Requires-Dist: pydantic_core==2.33.2
70
- Requires-Dist: pyOpenSSL==25.1.0
71
- Requires-Dist: pyperclip==1.9.0
72
- Requires-Dist: PySocks==1.7.1
73
- Requires-Dist: python-crontab==3.3.0
74
- Requires-Dist: python-dateutil==2.9.0.post0
75
- Requires-Dist: python-dotenv==1.1.1
76
- Requires-Dist: qrcode==8.2
77
- Requires-Dist: redis==5.0.8
78
- Requires-Dist: requests==2.32.4
79
- Requires-Dist: selenium==4.34.2
80
- Requires-Dist: service-identity==24.2.0
81
- Requires-Dist: setuptools==80.9.0
82
- Requires-Dist: six==1.17.0
83
- Requires-Dist: smbus2==0.5.0
84
- Requires-Dist: sniffio==1.3.1
85
- Requires-Dist: sortedcontainers==2.4.0
86
- Requires-Dist: sqlparse==0.5.3
87
- Requires-Dist: tablib==3.8.0
88
- Requires-Dist: tinycss2==1.4.0
89
- Requires-Dist: toml==0.10.2
90
- Requires-Dist: trio==0.30.0
91
- Requires-Dist: trio-websocket==0.12.2
92
- Requires-Dist: Twisted==25.5.0
93
- Requires-Dist: twine==6.1.0
94
- Requires-Dist: txaio==25.6.1
95
- Requires-Dist: typing-inspection==0.4.1
96
- Requires-Dist: typing_extensions==4.14.1
97
- Requires-Dist: tzdata==2025.2
98
- Requires-Dist: urllib3==2.5.0
99
- Requires-Dist: vine==5.1.0
100
- Requires-Dist: wcwidth==0.2.13
101
- Requires-Dist: webencodings==0.5.1
102
- Requires-Dist: websocket-client==1.8.0
103
- Requires-Dist: websockets==13.1
104
- Requires-Dist: plyer==2.1.0; sys_platform == "win32"
105
- Requires-Dist: wsproto==1.2.0
106
- Requires-Dist: zope.interface==7.2
107
- Dynamic: license-file
108
-
109
- # Arthexis Constellation
110
-
111
- ## Purpose
112
- Arthexis Constellation is a narrative-driven Django-based suite that centralizes tools for managing charging infrastructure and orchestrating energy related products and services.
113
-
114
- ## Features
115
- - Compatible with OCPP 1.6+ chargers
116
- - API integration with Odoo 1.6+
117
- - Runs on Windows and Linux (Ubuntu 16+)
118
- - One codebase. Six* specialized Roles.
119
-
120
- ## Support
121
- Contact us at tecnologia at gelectriic dot com or visit our [web page](https://www.gelectriic.com/) for professional services and commercial support.
122
-
123
- ## About Me
124
- > "What, you wanna know about me too? Well, I enjoy developing software, role-playing games, long walks on the beach and a fourth secret thing."
125
- > --Arthexis
126
-
@@ -1,77 +0,0 @@
1
- arthexis-0.1.7.dist-info/licenses/LICENSE,sha256=rBjcKtvD5yIpzAnkw3XRofK8KCAeL43DXmNaiRuYJrg,1092
2
- config/__init__.py,sha256=5EyLFDrM6aTOHSnyBcLXRvMInZMPmAAy9Icu0cHHK5o,110
3
- config/active_app.py,sha256=MET_G7oHL7GkoSo3VkkMzymM-PwsSZazMLZxpgjFLTo,388
4
- config/asgi.py,sha256=n09URedOmQ_59II3UCl3iodGSDWOuN_A8DFyfLjuylA,803
5
- config/auth_app.py,sha256=65cHsGtnwa0Q7-IjWIwJ73Kq4FpEcxSjHH_fu9Dr868,207
6
- config/celery.py,sha256=u2AwuzgcMWPFCVPeqrVpvzyU3ygkVSdd2KQ5b4KAE4s,756
7
- config/context_processors.py,sha256=_oQ5F8MZpAuv2QZl5QHoobEwTharl1lC7SRCUEmf3cQ,2341
8
- config/horologia_app.py,sha256=u1hTYcEmIqh82Gt5YNPvR5ta2MnVatELvD9ByFrCH1A,194
9
- config/loadenv.py,sha256=bhFbHTbRJSkSwrFk3UInKEKQ8ZY-poatOGi7rC57YAI,298
10
- config/logging.py,sha256=334jADN4dM5GNHaCWlYPOKYa5BhfxbsuejH_QDALG6g,1793
11
- config/middleware.py,sha256=EvraDumepnKwCDswHGXb1mK7vud_dEEoZ4eh0IQ7fhQ,744
12
- config/offline.py,sha256=7XHGFlV7IAWUJ93dEjknrHkAHDEyzWxK_hj_ht4-6-Q,1427
13
- config/settings.py,sha256=hyqTxQhVh1UYMRxZVuPil32IChJEvthJ7hkh2UGVehI,10897
14
- config/urls.py,sha256=mgC0PqY1JBH6GdOxM6A_p5rDzx9vDoEVAOrH36DWSB4,2991
15
- config/workgroup_app.py,sha256=rm6KrjxtRNdkrxl2_in9FAaHpIltRUhpDrt4tP9yanE,202
16
- config/wsgi.py,sha256=Fu-ONO2SgYeU6rhmy909P-uLX-n8ALJQObdm9MHPS-k,450
17
- core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- core/admin.py,sha256=bKncxl6b_dEPXfbIbJYMMF6Nf3a6Su6IZ7ymzy_RD8Q,29687
19
- core/apps.py,sha256=5wmxTrED-4WBWA0khEpqVAUH7V-g7DLtPDNEtSINnSM,2617
20
- core/backends.py,sha256=f8gb5D3_f8sM6UJop0aS8TAkrkh14NaP0JrqTcT_L3Y,2686
21
- core/checks.py,sha256=sRIA9tYAKXO6kJf96ADFrkYyvp47gYqv18Y12vukUqg,931
22
- core/entity.py,sha256=SeEXuv2zGN08biNxOgSwVWtt3jiNxMxJINQHGgavovE,4120
23
- core/environment.py,sha256=QcOshpWNG0l_agW-b9efNvVFKqdatj6sUK8FT6p92gU,1238
24
- core/fields.py,sha256=uS5nDozL6IsTAbjg08VcOB8K85e0XROUYCBAOIfAcPE,2127
25
- core/lcd_screen.py,sha256=7iSg8OZMK8qHGM1FVOwbgsWCogEe5eR6mie-A5YQKY4,2649
26
- core/middleware.py,sha256=utMGESBrR-rHRV5_q1X2g2wnmpziaUcc9jGzoZwvqqQ,1258
27
- core/models.py,sha256=_Ng5pxlF2gTKzHd4si1t7r312sj--Zk3AOArCQ8BZbA,44518
28
- core/notifications.py,sha256=w9rPCsZfZNSoBUH-1KVe9Yr8LvG9vtkgmzw3DKLcDoM,3787
29
- core/release.py,sha256=DzK44yr7vkAK_xzDeejVFwQnkE23yqWvmIWZHQZ1nwI,11003
30
- core/system.py,sha256=EVvxYxnmJ1Wn-XIkt8pk2E0Rr8poRozkZ218E3TNHCY,3504
31
- core/tasks.py,sha256=Q4QweRlhahbXYEeL9ytlyQWwWQFP63q-ZY_fN0EXwtg,3145
32
- core/test_system_info.py,sha256=AXo-HqTLMyOpsQIShDDzyl_nMHOyKbAIuNr9fYZzoKg,605
33
- core/tests.py,sha256=6dZ3CvAZ5fg7t5a11OsPktNfjRH-Fk8HDTPIRVhXWkg,26581
34
- core/urls.py,sha256=pBkcWdiA0Aag7z4UOu7HT4Im4ghPPfBZKeogmoO0H5U,406
35
- core/user_data.py,sha256=pfi4fgHl0CosG9jkfe__bSNN-Knhnzp7UirnCT_tae8,12029
36
- core/views.py,sha256=-4k3YSv9RfsAY14aLXkngzjXT0yyXD90D6KOJ3cwSLQ,16137
37
- nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- nodes/actions.py,sha256=2QOtRdhm__4f0Pgy3n2tg9HCbS47ZK9qBdTXJ9YZJfA,2339
39
- nodes/admin.py,sha256=a-LAbgNG-0QHA8Og24fslyPyze_kPKhuUs3syAVbNr4,21824
40
- nodes/apps.py,sha256=pKadzdXffQdwOQ39tkYLgnPH3A_JkVek8Hp3OE6Ro8g,2295
41
- nodes/lcd.py,sha256=axttp6AhKO2QMMXAf6nPe3Ox7nrBP-8yZD_oDUfMAvI,5602
42
- nodes/models.py,sha256=XUkcB3CZVYKvsOl4PkP4Hjlyhm-RjWxkCvK__UIR_Xw,23885
43
- nodes/tasks.py,sha256=1YeUqwSvqqTisusH-25nMQJCMQY2faEyDVrcBYqQghU,1588
44
- nodes/tests.py,sha256=h06XvxuBT8gFc9n9q2MDVSzCMs6YUe0NzqSvg5DBaZo,43959
45
- nodes/urls.py,sha256=20yZDZf4DNgIZ9hQWsUzjp8k5Fryg9ukk761_KGQt9k,548
46
- nodes/utils.py,sha256=aVEHtoisHyhWe_Fy2KPiP24Fs0wELtQMyfs4JGYnkuY,2320
47
- nodes/views.py,sha256=LISm9jqIdyUwQm45PegGg8RvmGRZH1jvCTCC14owRdQ,8444
48
- ocpp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- ocpp/admin.py,sha256=9A_uLUg7l9DiqJq1foy47oFLb7zPuBOJeS73p7l0M0k,11851
50
- ocpp/apps.py,sha256=Hja6uavSO4Srbp7kZmp0yGuhEq1abKBhH004QcUG90I,759
51
- ocpp/consumers.py,sha256=ykAkAicHRmn_qfUTp6psNUFkDrOnzuJfnHca9vgJLQI,11768
52
- ocpp/evcs.py,sha256=ZQKLqN8yJ4IOdedVt1z_gz_2eXBPdHHPvgxU2NkWgpw,33333
53
- ocpp/models.py,sha256=5g6JDdaLtX07jbuuJAbwPi-Z58LuCR25XjJHh7oe8kk,10367
54
- ocpp/routing.py,sha256=g9vPnLw-D1N8L_mW0_oCe-nTDibjC0Et-SFxe8NFAOI,308
55
- ocpp/simulator.py,sha256=TX0GHe2w3p8Yq8VNBfHlYRa88ba1n3tmhIrP8R82BVA,13404
56
- ocpp/store.py,sha256=qzVWNXZY3sUAC3DtOnAv4BOj185DAGUxguVN9G4qkbw,5850
57
- ocpp/tasks.py,sha256=F15s9Hkx2Y54ytqXq3tyn0YmxgVepXsIctjuck2LWVI,841
58
- ocpp/test_export_import.py,sha256=w3GRh0zTWZ5byev7H1g9mZ3xbgnlHxQx2InHcp69x4w,4667
59
- ocpp/test_rfid.py,sha256=UrlB-amytnpvD1I4c0fRUKaPozRoEynYrZkKPCLfZDU,12318
60
- ocpp/tests.py,sha256=vG6Ky10c1q440JtFgbm1qJHyoetSQrXM9ieMSKyJLNs,47862
61
- ocpp/transactions_io.py,sha256=ulRkBZTjubN01Geur9t4zjANQu-yCeS8N3prR03rQE8,4062
62
- ocpp/urls.py,sha256=MMrYiCW9y8cf2CZqpcEiF-jsjWdqLAl4a1cFnG36AEg,877
63
- ocpp/views.py,sha256=lX5vyCKxAOe-pBA5FpjbDiOt0zkx18GcH8NH0ncrDac,13201
64
- pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- pages/admin.py,sha256=aD_f-RnuUCfb-6r8DJ33vuuzyuEpPtHqq870nFew0f0,7679
66
- pages/apps.py,sha256=mfCxegmnRqKcszyEwpQhZpW9JWOuEYdVereU_w49BXg,298
67
- pages/checks.py,sha256=E2_ZYPD-2vw27ImA-Q29OvxbdQUvKx26ACZwiPflTaI,1569
68
- pages/context_processors.py,sha256=mQj43pb4Y1u8cfBrl3m0bP-_iWHDKXxfuRE4Rbn6l-g,2432
69
- pages/models.py,sha256=vG2knV91jRJ5PpIB-UKbsyuzB-e0KXYi9lwCFbIVUSA,7536
70
- pages/tests.py,sha256=B3MX2du5aZ8NztR-e8pTbypXTqhA-_NHZMy6O_OuqWE,28022
71
- pages/urls.py,sha256=glhQExK2vVLzzvaRypWfmMdnggBrpjlxCaN1BUbC_MY,457
72
- pages/utils.py,sha256=bCcjku0mQhzgvTR46QwQgyc8YnSS7VumC6Qv968aCic,313
73
- pages/views.py,sha256=lkgx2X2AwOGa_URCRVCxju_z_uG1_xW43PUNmjOEibU,7993
74
- arthexis-0.1.7.dist-info/METADATA,sha256=UpY_iJF5Qcumd_YWTnqBZXZDVLl1lG8k4Chpf95Zeuo,4458
75
- arthexis-0.1.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
- arthexis-0.1.7.dist-info/top_level.txt,sha256=J2a2q8_BWrCZ8H2WFUNMBfO2jz8j2gax6zZh-_1QDac,29
77
- arthexis-0.1.7.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Rafael Guillen
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.
config/workgroup_app.py DELETED
@@ -1,7 +0,0 @@
1
- from post_office.apps import PostOfficeConfig as BasePostOfficeConfig
2
-
3
-
4
- class WorkgroupConfig(BasePostOfficeConfig):
5
- """Customize Post Office app label."""
6
-
7
- verbose_name = "6. Workgroup"
core/checks.py DELETED
@@ -1,29 +0,0 @@
1
- import hashlib
2
- from pathlib import Path
3
- from django.conf import settings
4
- from django.core import checks
5
-
6
-
7
- def _fixture_hash() -> str:
8
- base_dir = Path(settings.BASE_DIR)
9
- md5 = hashlib.md5()
10
- for path in sorted(base_dir.glob("**/fixtures/*.json")):
11
- md5.update(path.read_bytes())
12
- return md5.hexdigest()
13
-
14
-
15
- @checks.register(checks.Tags.database)
16
- def check_unapplied_fixtures(app_configs=None, **kwargs):
17
- """Warn if fixture files have changed since last refresh."""
18
- hash_file = Path(settings.BASE_DIR) / "fixtures.md5"
19
- stored = hash_file.read_text().strip() if hash_file.exists() else ""
20
- current = _fixture_hash()
21
- if stored != current:
22
- return [
23
- checks.Warning(
24
- "Unapplied fixture changes detected.",
25
- hint="Run env-refresh to apply fixtures.",
26
- id="core.W001",
27
- )
28
- ]
29
- return []